Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/net/modules.c

    r64d2b10 rc7a8442  
    3232
    3333/** @file
    34  * Generic module functions implementation.
     34 * Generic module functions implementation. 
    3535 *
    3636 * @todo MAKE IT POSSIBLE TO REMOVE THIS FILE VIA EITHER REPLACING PART OF ITS
     
    4141#include <async.h>
    4242#include <malloc.h>
    43 #include <errno.h>
     43#include <err.h>
    4444#include <sys/time.h>
     45
     46#include <ipc/ipc.h>
    4547#include <ipc/services.h>
     48
    4649#include <net/modules.h>
    4750
     
    4952#define MODULE_WAIT_TIME        (10 * 1000)
    5053
    51 /** Answer a call.
    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 void answer_call(ipc_callid_t callid, int result, ipc_call_t *answer,
    60     size_t count)
    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 */
     61void
     62answer_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) {
    6568                case 0:
    66                         async_answer_0(callid, (sysarg_t) result);
     69                        ipc_answer_0(callid, (ipcarg_t) result);
    6770                        break;
    6871                case 1:
    69                         async_answer_1(callid, (sysarg_t) result,
     72                        ipc_answer_1(callid, (ipcarg_t) result,
    7073                            IPC_GET_ARG1(*answer));
    7174                        break;
    7275                case 2:
    73                         async_answer_2(callid, (sysarg_t) result,
     76                        ipc_answer_2(callid, (ipcarg_t) result,
    7477                            IPC_GET_ARG1(*answer), IPC_GET_ARG2(*answer));
    7578                        break;
    7679                case 3:
    77                         async_answer_3(callid, (sysarg_t) result,
     80                        ipc_answer_3(callid, (ipcarg_t) result,
    7881                            IPC_GET_ARG1(*answer), IPC_GET_ARG2(*answer),
    7982                            IPC_GET_ARG3(*answer));
    8083                        break;
    8184                case 4:
    82                         async_answer_4(callid, (sysarg_t) result,
     85                        ipc_answer_4(callid, (ipcarg_t) result,
    8386                            IPC_GET_ARG1(*answer), IPC_GET_ARG2(*answer),
    8487                            IPC_GET_ARG3(*answer), IPC_GET_ARG4(*answer));
     
    8689                case 5:
    8790                default:
    88                         async_answer_5(callid, (sysarg_t) result,
     91                        ipc_answer_5(callid, (ipcarg_t) result,
    8992                            IPC_GET_ARG1(*answer), IPC_GET_ARG2(*answer),
    9093                            IPC_GET_ARG3(*answer), IPC_GET_ARG4(*answer),
     
    108111 *                      function.
    109112 */
    110 int bind_service(services_t need, sysarg_t arg1, sysarg_t arg2, sysarg_t arg3,
     113int bind_service(services_t need, ipcarg_t arg1, ipcarg_t arg2, ipcarg_t arg3,
    111114    async_client_conn_t client_receiver)
    112115{
     
    131134 *
    132135 */
    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 {
     136int 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       
    136141        /* Connect to the needed service */
    137142        int phone = connect_to_service_timeout(need, timeout);
    138143        if (phone >= 0) {
    139144                /* 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;
    144150                }
     151                async_new_connection(phonehash, 0, NULL, client_receiver);
    145152        }
    146153       
     
    151158 *
    152159 * @param[in] need      The needed module service.
    153  * @return              The phone of the needed service.
     160 * @returns             The phone of the needed service.
    154161 */
    155162int connect_to_service(services_t need)
     
    163170 *  @param[in] timeout  The connection timeout in microseconds. No timeout if
    164171 *                      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.
    167174 */
    168175int connect_to_service_timeout(services_t need, suseconds_t timeout)
     
    170177        int phone;
    171178
    172         /* If no timeout is set */
     179        // if no timeout is set
    173180        if (timeout <= 0)
    174181                return async_connect_me_to_blocking(PHONE_NS, need, 0, 0);
     
    179186                        return phone;
    180187
    181                 /* Abort if no time is left */
     188                // end if no time is left
    182189                if (timeout <= 0)
    183190                        return ETIMEOUT;
    184191
    185                 /* Wait the minimum of the module wait time and the timeout */
     192                // wait the minimum of the module wait time and the timeout
    186193                usleep((timeout <= MODULE_WAIT_TIME) ?
    187194                    timeout : MODULE_WAIT_TIME);
     
    190197}
    191198
     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 */
     212int 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
    192239/** Replies the data to the other party.
    193240 *
    194241 * @param[in] data      The data buffer to be sent.
    195242 * @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.
    199246 *                      Only partial data are transfered.
    200  * @return              Other error codes as defined for the
     247 * @returns             Other error codes as defined for the
    201248 *                      async_data_read_finalize() function.
    202249 */
     
    206253        ipc_callid_t callid;
    207254
    208         /* Fetch the request */
     255        // fetch the request
    209256        if (!async_data_read_receive(&callid, &length))
    210257                return EINVAL;
    211258
    212         /* Check the requested data size */
     259        // check the requested data size
    213260        if (length < data_length) {
    214261                async_data_read_finalize(callid, data, length);
     
    216263        }
    217264
    218         /* Send the data */
     265        // send the data
    219266        return async_data_read_finalize(callid, data, data_length);
    220267}
    221268
    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 */
     276void refresh_answer(ipc_call_t *answer, int *answer_count)
     277{
     278        if (answer_count)
     279                *answer_count = 0;
     280
     281        if (answer) {
    236282                IPC_SET_RETVAL(*answer, 0);
    237                 IPC_SET_IMETHOD(*answer, 0);
     283                // just to be precize
     284                IPC_SET_METHOD(*answer, 0);
    238285                IPC_SET_ARG1(*answer, 0);
    239286                IPC_SET_ARG2(*answer, 0);
Note: See TracChangeset for help on using the changeset viewer.