Ignore:
File:
1 edited

Legend:

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

    r8d2dd7f2 r74017ce  
    4646    ipc_call_t *call)
    4747{
    48         size_t size = IPC_GET_ARG1(*call);
     48        void *buf;
     49        size_t size;
     50        size_t nread;
    4951        int rc;
     52        ipc_callid_t rcallid;
    5053
    51         if (srv->srvs->ops->read == NULL) {
    52                 async_answer_0(callid, ENOTSUP);
     54        if (!async_data_read_receive(&rcallid, &size)) {
     55                async_answer_0(callid, EINVAL);
    5356                return;
    5457        }
    5558
    56         if (size <= 4 * sizeof(sysarg_t)) {
    57                 sysarg_t message[4] = {};
     59        buf = malloc(size);
     60        if (buf == NULL) {
     61                async_answer_0(rcallid, ENOMEM);
     62                async_answer_0(callid, ENOMEM);
     63                return;
     64        }
    5865
    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);
     66        if (srv->srvs->ops->read == NULL) {
     67                async_answer_0(rcallid, ENOTSUP);
     68                async_answer_0(callid, ENOTSUP);
     69                free(buf);
     70                return;
    6471        }
     72
     73        rc = srv->srvs->ops->read(srv, buf, size, &nread);
     74        if (rc != EOK && nread == 0) {
     75                async_answer_0(rcallid, rc);
     76                async_answer_0(callid, rc);
     77                free(buf);
     78                return;
     79        }
     80
     81        async_data_read_finalize(rcallid, buf, nread);
     82
     83        free(buf);
     84        async_answer_2(callid, EOK, rc, nread);
    6585}
    6686
     
    6888    ipc_call_t *call)
    6989{
    70         size_t size = IPC_GET_ARG1(*call);
     90        void *data;
     91        size_t size;
     92        size_t nwr;
    7193        int rc;
     94
     95        rc = async_data_write_accept(&data, false, 0, 0, 0, &size);
     96        if (rc != EOK) {
     97                async_answer_0(callid, rc);
     98                return;
     99        }
    72100
    73101        if (srv->srvs->ops->write == NULL) {
     
    76104        }
    77105
    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                 };
     106        rc = srv->srvs->ops->write(srv, data, size, &nwr);
     107        free(data);
     108        if (rc != EOK && nwr == 0) {
     109                async_answer_0(callid, rc);
     110                return;
     111        }
    84112
    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         }
     113        async_answer_2(callid, EOK, rc, nwr);
    90114}
    91115
     
    145169                        break;
    146170                default:
    147                         async_answer_0(callid, EINVAL);
     171                        if (srv->srvs->ops->def_handler != NULL)
     172                                srv->srvs->ops->def_handler(srv, callid, &call);
     173                        else
     174                                async_answer_0(callid, ENOTSUP);
    148175                }
    149176        }
Note: See TracChangeset for help on using the changeset viewer.