Changes in uspace/lib/c/generic/io/chardev_srv.c [8d2dd7f2:74017ce] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/io/chardev_srv.c
r8d2dd7f2 r74017ce 46 46 ipc_call_t *call) 47 47 { 48 size_t size = IPC_GET_ARG1(*call); 48 void *buf; 49 size_t size; 50 size_t nread; 49 51 int rc; 52 ipc_callid_t rcallid; 50 53 51 if ( srv->srvs->ops->read == NULL) {52 async_answer_0(callid, E NOTSUP);54 if (!async_data_read_receive(&rcallid, &size)) { 55 async_answer_0(callid, EINVAL); 53 56 return; 54 57 } 55 58 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 } 58 65 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; 64 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); 65 85 } 66 86 … … 68 88 ipc_call_t *call) 69 89 { 70 size_t size = IPC_GET_ARG1(*call); 90 void *data; 91 size_t size; 92 size_t nwr; 71 93 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 } 72 100 73 101 if (srv->srvs->ops->write == NULL) { … … 76 104 } 77 105 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 } 84 112 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); 90 114 } 91 115 … … 145 169 break; 146 170 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); 148 175 } 149 176 }
Note:
See TracChangeset
for help on using the changeset viewer.