Ignore:
File:
1 edited

Legend:

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

    r74017ce r8d2dd7f2  
    4646    ipc_call_t *call)
    4747{
    48         void *buf;
    49         size_t size;
    50         size_t nread;
     48        size_t size = IPC_GET_ARG1(*call);
    5149        int rc;
    52         ipc_callid_t rcallid;
    5350
    54         if (!async_data_read_receive(&rcallid, &size)) {
    55                 async_answer_0(callid, EINVAL);
     51        if (srv->srvs->ops->read == NULL) {
     52                async_answer_0(callid, ENOTSUP);
    5653                return;
    5754        }
    5855
    59         buf = malloc(size);
    60         if (buf == NULL) {
    61                 async_answer_0(rcallid, ENOMEM);
    62                 async_answer_0(callid, ENOMEM);
    63                 return;
     56        if (size <= 4 * sizeof(sysarg_t)) {
     57                sysarg_t message[4] = {};
     58
     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);
    6464        }
    65 
    66         if (srv->srvs->ops->read == NULL) {
    67                 async_answer_0(rcallid, ENOTSUP);
    68                 async_answer_0(callid, ENOTSUP);
    69                 free(buf);
    70                 return;
    71         }
    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);
    8565}
    8666
     
    8868    ipc_call_t *call)
    8969{
    90         void *data;
    91         size_t size;
    92         size_t nwr;
     70        size_t size = IPC_GET_ARG1(*call);
    9371        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         }
    10072
    10173        if (srv->srvs->ops->write == NULL) {
     
    10476        }
    10577
    106         rc = srv->srvs->ops->write(srv, data, size, &nwr);
    107         free(data);
    108         if (rc != EOK && nwr == 0) {
     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                };
     84
     85                rc = srv->srvs->ops->write(srv, (char *)message, size);
    10986                async_answer_0(callid, rc);
    110                 return;
     87        } else {
     88                async_answer_0(callid, ELIMIT);
    11189        }
    112 
    113         async_answer_2(callid, EOK, rc, nwr);
    11490}
    11591
     
    169145                        break;
    170146                default:
    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);
     147                        async_answer_0(callid, EINVAL);
    175148                }
    176149        }
Note: See TracChangeset for help on using the changeset viewer.