Changes in uspace/lib/c/generic/net/modules.c [64d2b10:c7a8442] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/net/modules.c
r64d2b10 rc7a8442 32 32 33 33 /** @file 34 * Generic module functions implementation. 34 * Generic module functions implementation. 35 35 * 36 36 * @todo MAKE IT POSSIBLE TO REMOVE THIS FILE VIA EITHER REPLACING PART OF ITS … … 41 41 #include <async.h> 42 42 #include <malloc.h> 43 #include <err no.h>43 #include <err.h> 44 44 #include <sys/time.h> 45 46 #include <ipc/ipc.h> 45 47 #include <ipc/services.h> 48 46 49 #include <net/modules.h> 47 50 … … 49 52 #define MODULE_WAIT_TIME (10 * 1000) 50 53 51 /** Answer acall.52 * 53 * @param[in] callid Call identifier.54 * @param[in] result Message processing result.55 * @param[in] answer Message processing answer.56 * @param[in] count Number of answer parameters.57 * 58 */ 59 voidanswer_call(ipc_callid_t callid, int result, ipc_call_t *answer,60 size_tcount)61 { 62 / * Choose the most efficient function */63 if ( (answer != NULL) || (count == 0)) {64 switch ( count) {54 /** Answers the call. 55 * 56 * @param[in] callid The call identifier. 57 * @param[in] result The message processing result. 58 * @param[in] answer The message processing answer. 59 * @param[in] answer_count The number of answer parameters. 60 */ 61 void 62 answer_call(ipc_callid_t callid, int result, ipc_call_t *answer, 63 int answer_count) 64 { 65 // choose the most efficient answer function 66 if (answer || (!answer_count)) { 67 switch (answer_count) { 65 68 case 0: 66 async_answer_0(callid, (sysarg_t) result);69 ipc_answer_0(callid, (ipcarg_t) result); 67 70 break; 68 71 case 1: 69 async_answer_1(callid, (sysarg_t) result,72 ipc_answer_1(callid, (ipcarg_t) result, 70 73 IPC_GET_ARG1(*answer)); 71 74 break; 72 75 case 2: 73 async_answer_2(callid, (sysarg_t) result,76 ipc_answer_2(callid, (ipcarg_t) result, 74 77 IPC_GET_ARG1(*answer), IPC_GET_ARG2(*answer)); 75 78 break; 76 79 case 3: 77 async_answer_3(callid, (sysarg_t) result,80 ipc_answer_3(callid, (ipcarg_t) result, 78 81 IPC_GET_ARG1(*answer), IPC_GET_ARG2(*answer), 79 82 IPC_GET_ARG3(*answer)); 80 83 break; 81 84 case 4: 82 async_answer_4(callid, (sysarg_t) result,85 ipc_answer_4(callid, (ipcarg_t) result, 83 86 IPC_GET_ARG1(*answer), IPC_GET_ARG2(*answer), 84 87 IPC_GET_ARG3(*answer), IPC_GET_ARG4(*answer)); … … 86 89 case 5: 87 90 default: 88 async_answer_5(callid, (sysarg_t) result,91 ipc_answer_5(callid, (ipcarg_t) result, 89 92 IPC_GET_ARG1(*answer), IPC_GET_ARG2(*answer), 90 93 IPC_GET_ARG3(*answer), IPC_GET_ARG4(*answer), … … 108 111 * function. 109 112 */ 110 int bind_service(services_t need, sysarg_t arg1, sysarg_t arg2, sysarg_t arg3,113 int bind_service(services_t need, ipcarg_t arg1, ipcarg_t arg2, ipcarg_t arg3, 111 114 async_client_conn_t client_receiver) 112 115 { … … 131 134 * 132 135 */ 133 int bind_service_timeout(services_t need, sysarg_t arg1, sysarg_t arg2, 134 sysarg_t arg3, async_client_conn_t client_receiver, suseconds_t timeout) 135 { 136 int bind_service_timeout(services_t need, ipcarg_t arg1, ipcarg_t arg2, 137 ipcarg_t arg3, async_client_conn_t client_receiver, suseconds_t timeout) 138 { 139 ERROR_DECLARE; 140 136 141 /* Connect to the needed service */ 137 142 int phone = connect_to_service_timeout(need, timeout); 138 143 if (phone >= 0) { 139 144 /* Request the bidirectional connection */ 140 int rc = async_connect_to_me(phone, arg1, arg2, arg3, client_receiver); 141 if (rc != EOK) { 142 async_hangup(phone); 143 return rc; 145 ipcarg_t phonehash; 146 if (ERROR_OCCURRED(ipc_connect_to_me(phone, arg1, arg2, arg3, 147 &phonehash))) { 148 ipc_hangup(phone); 149 return ERROR_CODE; 144 150 } 151 async_new_connection(phonehash, 0, NULL, client_receiver); 145 152 } 146 153 … … 151 158 * 152 159 * @param[in] need The needed module service. 153 * @return The phone of the needed service.160 * @returns The phone of the needed service. 154 161 */ 155 162 int connect_to_service(services_t need) … … 163 170 * @param[in] timeout The connection timeout in microseconds. No timeout if 164 171 * set to zero (0). 165 * @return The phone of the needed service.166 * @return ETIMEOUT if the connection timeouted.172 * @returns The phone of the needed service. 173 * @returns ETIMEOUT if the connection timeouted. 167 174 */ 168 175 int connect_to_service_timeout(services_t need, suseconds_t timeout) … … 170 177 int phone; 171 178 172 / * If no timeout is set */179 // if no timeout is set 173 180 if (timeout <= 0) 174 181 return async_connect_me_to_blocking(PHONE_NS, need, 0, 0); … … 179 186 return phone; 180 187 181 / * Abort if no time is left */188 // end if no time is left 182 189 if (timeout <= 0) 183 190 return ETIMEOUT; 184 191 185 / * Wait the minimum of the module wait time and the timeout */192 // wait the minimum of the module wait time and the timeout 186 193 usleep((timeout <= MODULE_WAIT_TIME) ? 187 194 timeout : MODULE_WAIT_TIME); … … 190 197 } 191 198 199 /** Receives data from the other party. 200 * 201 * The received data buffer is allocated and returned. 202 * 203 * @param[out] data The data buffer to be filled. 204 * @param[out] length The buffer length. 205 * @returns EOK on success. 206 * @returns EBADMEM if the data or the length parameter is NULL. 207 * @returns EINVAL if the client does not send data. 208 * @returns ENOMEM if there is not enough memory left. 209 * @returns Other error codes as defined for the 210 * async_data_write_finalize() function. 211 */ 212 int data_receive(void **data, size_t *length) 213 { 214 ERROR_DECLARE; 215 216 ipc_callid_t callid; 217 218 if (!data || !length) 219 return EBADMEM; 220 221 // fetch the request 222 if (!async_data_write_receive(&callid, length)) 223 return EINVAL; 224 225 // allocate the buffer 226 *data = malloc(*length); 227 if (!*data) 228 return ENOMEM; 229 230 // fetch the data 231 if (ERROR_OCCURRED(async_data_write_finalize(callid, *data, *length))) { 232 free(data); 233 return ERROR_CODE; 234 } 235 236 return EOK; 237 } 238 192 239 /** Replies the data to the other party. 193 240 * 194 241 * @param[in] data The data buffer to be sent. 195 242 * @param[in] data_length The buffer length. 196 * @return EOK on success.197 * @return EINVAL if the client does not expect the data.198 * @return EOVERFLOW if the client does not expect all the data.243 * @returns EOK on success. 244 * @returns EINVAL if the client does not expect the data. 245 * @returns EOVERFLOW if the client does not expect all the data. 199 246 * Only partial data are transfered. 200 * @return Other error codes as defined for the247 * @returns Other error codes as defined for the 201 248 * async_data_read_finalize() function. 202 249 */ … … 206 253 ipc_callid_t callid; 207 254 208 / * Fetch the request */255 // fetch the request 209 256 if (!async_data_read_receive(&callid, &length)) 210 257 return EINVAL; 211 258 212 / * Check the requested data size */259 // check the requested data size 213 260 if (length < data_length) { 214 261 async_data_read_finalize(callid, data, length); … … 216 263 } 217 264 218 / * Send the data */265 // send the data 219 266 return async_data_read_finalize(callid, data, data_length); 220 267 } 221 268 222 /** Refresh answer structure and argument count. 223 * 224 * Erase all arguments. 225 * 226 * @param[in,out] answer Message processing answer structure. 227 * @param[in,out] count Number of answer arguments. 228 * 229 */ 230 void refresh_answer(ipc_call_t *answer, size_t *count) 231 { 232 if (count != NULL) 233 *count = 0; 234 235 if (answer != NULL) { 269 /** Refreshes answer structure and parameters count. 270 * 271 * Erases all attributes. 272 * 273 * @param[in,out] answer The message processing answer structure. 274 * @param[in,out] answer_count The number of answer parameters. 275 */ 276 void refresh_answer(ipc_call_t *answer, int *answer_count) 277 { 278 if (answer_count) 279 *answer_count = 0; 280 281 if (answer) { 236 282 IPC_SET_RETVAL(*answer, 0); 237 IPC_SET_IMETHOD(*answer, 0); 283 // just to be precize 284 IPC_SET_METHOD(*answer, 0); 238 285 IPC_SET_ARG1(*answer, 0); 239 286 IPC_SET_ARG2(*answer, 0);
Note:
See TracChangeset
for help on using the changeset viewer.