Changeset 19ea61d in mainline for uspace/lib/c/generic/io/chardev_srv.c
- Timestamp:
- 2017-11-20T20:01:24Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 677cad5
- Parents:
- c657bd7
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/io/chardev_srv.c
rc657bd7 r19ea61d 46 46 ipc_call_t *call) 47 47 { 48 size_t size = IPC_GET_ARG1(*call); 48 void *buf; 49 size_t size; 49 50 int rc; 51 ipc_callid_t rcallid; 50 52 51 if ( srv->srvs->ops->read == NULL) {52 async_answer_0(callid, E NOTSUP);53 if (!async_data_read_receive(&rcallid, &size)) { 54 async_answer_0(callid, EINVAL); 53 55 return; 54 56 } 55 57 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 } 58 64 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; 64 70 } 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 */); 65 84 } 66 85 … … 68 87 ipc_call_t *call) 69 88 { 70 size_t size = IPC_GET_ARG1(*call); 89 void *data; 90 size_t size; 71 91 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 } 72 98 73 99 if (srv->srvs->ops->write == NULL) { … … 76 102 } 77 103 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); 84 108 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 */); 90 110 } 91 111
Note:
See TracChangeset
for help on using the changeset viewer.