Fork us on GitHub Follow us on Facebook Follow us on Twitter

Ignore:
Timestamp:
2017-11-20T20:01:24Z (4 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master
Children:
677cad5
Parents:
c657bd7
Message:

Chardev should allow large data transfers.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/io/chardev_srv.c

    rc657bd7 r19ea61d  
    4646    ipc_call_t *call)
    4747{
    48         size_t size = IPC_GET_ARG1(*call);
     48        void *buf;
     49        size_t size;
    4950        int rc;
     51        ipc_callid_t rcallid;
    5052
    51         if (srv->srvs->ops->read == NULL) {
    52                 async_answer_0(callid, ENOTSUP);
     53        if (!async_data_read_receive(&rcallid, &size)) {
     54                async_answer_0(callid, EINVAL);
    5355                return;
    5456        }
    5557
    56         if (size <= 4 * sizeof(sysarg_t)) {
    57                 sysarg_t message[4] = {};
     58        buf = malloc(size);
     59        if (buf == NULL) {
     60                async_answer_0(rcallid, ENOMEM);
     61                async_answer_0(callid, ENOMEM);
     62                return;
     63        }
    5864
    59                 rc = srv->srvs->ops->read(srv, (char *)message, size);
    60                 async_answer_4(callid, rc, message[0], message[1],
    61                     message[2], message[3]);
    62         } else {
    63                 async_answer_0(callid, ELIMIT);
     65        if (srv->srvs->ops->read == NULL) {
     66                async_answer_0(rcallid, ENOTSUP);
     67                async_answer_0(callid, ENOTSUP);
     68                free(buf);
     69                return;
    6470        }
     71
     72        rc = srv->srvs->ops->read(srv, buf, size);
     73        if (rc < 0) {
     74                async_answer_0(rcallid, rc);
     75                async_answer_0(callid, rc);
     76                free(buf);
     77                return;
     78        }
     79
     80        async_data_read_finalize(rcallid, buf, size);
     81
     82        free(buf);
     83        async_answer_2(callid, EOK, EOK, rc /* nread */);
    6584}
    6685
     
    6887    ipc_call_t *call)
    6988{
    70         size_t size = IPC_GET_ARG1(*call);
     89        void *data;
     90        size_t size;
    7191        int rc;
     92
     93        rc = async_data_write_accept(&data, false, 0, 0, 0, &size);
     94        if (rc != EOK) {
     95                async_answer_0(callid, rc);
     96                return;
     97        }
    7298
    7399        if (srv->srvs->ops->write == NULL) {
     
    76102        }
    77103
    78         if (size <= 3 * sizeof(sysarg_t)) {
    79                 const sysarg_t message[3] = {
    80                         IPC_GET_ARG2(*call),
    81                         IPC_GET_ARG3(*call),
    82                         IPC_GET_ARG4(*call)
    83                 };
     104        rc = srv->srvs->ops->write(srv, data, size);
     105        free(data);
     106        if (rc < 0)
     107                async_answer_0(callid, rc);
    84108
    85                 rc = srv->srvs->ops->write(srv, (char *)message, size);
    86                 async_answer_0(callid, rc);
    87         } else {
    88                 async_answer_0(callid, ELIMIT);
    89         }
     109        async_answer_2(callid, EOK, EOK, rc /* nwritten */);
    90110}
    91111
Note: See TracChangeset for help on using the changeset viewer.