Changeset 8ff0bd2 in mainline for uspace/lib/c/generic/net/modules.c
- Timestamp:
- 2011-09-04T11:30:58Z (13 years ago)
- 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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/net/modules.c
rd2c67e7 r8ff0bd2 40 40 41 41 #include <async.h> 42 #include <async_obsolete.h>43 42 #include <malloc.h> 44 43 #include <errno.h> … … 47 46 #include <net/modules.h> 48 47 #include <ns.h> 49 #include <ns_obsolete.h>50 51 /** The time between connect requests in microseconds. */52 #define MODULE_WAIT_TIME (10 * 1000)53 48 54 49 /** Answer a call. … … 98 93 } 99 94 100 /** Create bidirectional connection with the needed module service and register s95 /** Create bidirectional connection with the needed module service and register 101 96 * the message receiver. 102 97 * 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 */ 109 async_sess_t *bind_service(services_t need, sysarg_t arg1, sysarg_t arg2, 110 sysarg_t arg3, async_client_conn_t client_receiver) 138 111 { 139 112 /* 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) { 142 115 /* 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 144 121 if (rc != EOK) { 145 async_obsolete_hangup(phone); 146 return rc; 122 async_hangup(sess); 123 errno = rc; 124 return NULL; 147 125 } 148 126 } 149 127 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 */ 139 async_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. 198 147 * @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 * 205 156 */ 206 157 int data_reply(void *data, size_t data_length) … … 208 159 size_t length; 209 160 ipc_callid_t callid; 210 161 211 162 /* Fetch the request */ 212 163 if (!async_data_read_receive(&callid, &length)) 213 164 return EINVAL; 214 165 215 166 /* Check the requested data size */ 216 167 if (length < data_length) { … … 218 169 return EOVERFLOW; 219 170 } 220 171 221 172 /* Send the data */ 222 173 return async_data_read_finalize(callid, data, data_length);
Note:
See TracChangeset
for help on using the changeset viewer.