Changeset 8ff0bd2 in mainline for uspace/lib/c/generic/net/modules.c


Ignore:
Timestamp:
2011-09-04T11:30:58Z (13 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
03bc76a
Parents:
d2c67e7 (diff), deac215e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes

File:
1 edited

Legend:

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

    rd2c67e7 r8ff0bd2  
    4040
    4141#include <async.h>
    42 #include <async_obsolete.h>
    4342#include <malloc.h>
    4443#include <errno.h>
     
    4746#include <net/modules.h>
    4847#include <ns.h>
    49 #include <ns_obsolete.h>
    50 
    51 /** The time between connect requests in microseconds. */
    52 #define MODULE_WAIT_TIME  (10 * 1000)
    5348
    5449/** Answer a call.
     
    9893}
    9994
    100 /** Create bidirectional connection with the needed module service and registers
     95/** Create bidirectional connection with the needed module service and register
    10196 * the message receiver.
    10297 *
    103  * @param[in] need      The needed module service.
    104  * @param[in] arg1      The first parameter.
    105  * @param[in] arg2      The second parameter.
    106  * @param[in] arg3      The third parameter.
    107  * @param[in] client_receiver The message receiver.
    108  *
    109  * @return              The phone of the needed service.
    110  * @return              Other error codes as defined for the ipc_connect_to_me()
    111  *                      function.
    112  */
    113 int bind_service(services_t need, sysarg_t arg1, sysarg_t arg2, sysarg_t arg3,
    114     async_client_conn_t client_receiver)
    115 {
    116         return bind_service_timeout(need, arg1, arg2, arg3, client_receiver, 0);
    117 }
    118 
    119 /** Create bidirectional connection with the needed module service and registers
    120  * the message receiver.
    121  *
    122  * @param[in] need      The needed module service.
    123  * @param[in] arg1      The first parameter.
    124  * @param[in] arg2      The second parameter.
    125  * @param[in] arg3      The third parameter.
    126  * @param[in] client_receiver The message receiver.
    127  * @param[in] timeout   The connection timeout in microseconds. No timeout if
    128  *                      set to zero (0).
    129  *
    130  * @return              The phone of the needed service.
    131  * @return              ETIMEOUT if the connection timeouted.
    132  * @return              Other error codes as defined for the ipc_connect_to_me()
    133  *                      function.
    134  *
    135  */
    136 int bind_service_timeout(services_t need, sysarg_t arg1, sysarg_t arg2,
    137     sysarg_t arg3, async_client_conn_t client_receiver, suseconds_t timeout)
     98 * @param[in] need            Needed module service.
     99 * @param[in] arg1            First parameter.
     100 * @param[in] arg2            Second parameter.
     101 * @param[in] arg3            Third parameter.
     102 * @param[in] client_receiver Message receiver.
     103 *
     104 * @return Session to the needed service.
     105 * @return Other error codes as defined for the async_connect_to_me()
     106 *         function.
     107 *
     108 */
     109async_sess_t *bind_service(services_t need, sysarg_t arg1, sysarg_t arg2,
     110    sysarg_t arg3, async_client_conn_t client_receiver)
    138111{
    139112        /* Connect to the needed service */
    140         int phone = connect_to_service_timeout(need, timeout);
    141         if (phone >= 0) {
     113        async_sess_t *sess = connect_to_service(need);
     114        if (sess != NULL) {
    142115                /* Request the bidirectional connection */
    143                 int rc = async_obsolete_connect_to_me(phone, arg1, arg2, arg3, client_receiver);
     116                async_exch_t *exch = async_exchange_begin(sess);
     117                int rc = async_connect_to_me(exch, arg1, arg2, arg3,
     118                    client_receiver, NULL);
     119                async_exchange_end(exch);
     120               
    144121                if (rc != EOK) {
    145                         async_obsolete_hangup(phone);
    146                         return rc;
     122                        async_hangup(sess);
     123                        errno = rc;
     124                        return NULL;
    147125                }
    148126        }
    149127       
    150         return phone;
    151 }
    152 
    153 /** Connects to the needed module.
    154  *
    155  * @param[in] need      The needed module service.
    156  * @return              The phone of the needed service.
    157  */
    158 int connect_to_service(services_t need)
    159 {
    160         return connect_to_service_timeout(need, 0);
    161 }
    162 
    163 /** Connects to the needed module.
    164  *
    165  *  @param[in] need     The needed module service.
    166  *  @param[in] timeout  The connection timeout in microseconds. No timeout if
    167  *                      set to zero (0).
    168  *  @return             The phone of the needed service.
    169  *  @return             ETIMEOUT if the connection timeouted.
    170  */
    171 int connect_to_service_timeout(services_t need, suseconds_t timeout)
    172 {
    173         int phone;
    174 
    175         /* If no timeout is set */
    176         if (timeout <= 0)
    177                 return service_obsolete_connect_blocking(need, 0, 0);
    178        
    179         while (true) {
    180                 phone = service_obsolete_connect(need, 0, 0);
    181                 if ((phone >= 0) || (phone != ENOENT))
    182                         return phone;
    183 
    184                 /* Abort if no time is left */
    185                 if (timeout <= 0)
    186                         return ETIMEOUT;
    187 
    188                 /* Wait the minimum of the module wait time and the timeout */
    189                 usleep((timeout <= MODULE_WAIT_TIME) ?
    190                     timeout : MODULE_WAIT_TIME);
    191                 timeout -= MODULE_WAIT_TIME;
    192         }
    193 }
    194 
    195 /** Replies the data to the other party.
    196  *
    197  * @param[in] data      The data buffer to be sent.
     128        return sess;
     129}
     130
     131/** Connect to the needed module.
     132 *
     133 * @param[in] need Needed module service.
     134 *
     135 * @return Session to the needed service.
     136 * @return NULL if the connection timeouted.
     137 *
     138 */
     139async_sess_t *connect_to_service(services_t need)
     140{
     141        return service_connect_blocking(EXCHANGE_SERIALIZE, need, 0, 0);
     142}
     143
     144/** Reply the data to the other party.
     145 *
     146 * @param[in] data        The data buffer to be sent.
    198147 * @param[in] data_length The buffer length.
    199  * @return              EOK on success.
    200  * @return              EINVAL if the client does not expect the data.
    201  * @return              EOVERFLOW if the client does not expect all the data.
    202  *                      Only partial data are transfered.
    203  * @return              Other error codes as defined for the
    204  *                      async_data_read_finalize() function.
     148 *
     149 * @return EOK on success.
     150 * @return EINVAL if the client does not expect the data.
     151 * @return EOVERFLOW if the client does not expect all the data.
     152 *         Only partial data are transfered.
     153 * @return Other error codes as defined for the
     154 *         async_data_read_finalize() function.
     155 *
    205156 */
    206157int data_reply(void *data, size_t data_length)
     
    208159        size_t length;
    209160        ipc_callid_t callid;
    210 
     161       
    211162        /* Fetch the request */
    212163        if (!async_data_read_receive(&callid, &length))
    213164                return EINVAL;
    214 
     165       
    215166        /* Check the requested data size */
    216167        if (length < data_length) {
     
    218169                return EOVERFLOW;
    219170        }
    220 
     171       
    221172        /* Send the data */
    222173        return async_data_read_finalize(callid, data, data_length);
Note: See TracChangeset for help on using the changeset viewer.