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