Changeset db71e2a in mainline for uspace/lib/c/generic
- Timestamp:
- 2013-07-24T17:42:25Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 69b264a9
- Parents:
- 52f1882 (diff), cffa14e6 (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. - Location:
- uspace/lib/c/generic
- Files:
-
- 4 added
- 19 edited
-
adt/hash_table.c (modified) (1 diff)
-
async.c (modified) (6 diffs)
-
bitops.c (added)
-
device/hw_res_parsed.c (modified) (1 diff)
-
devman.c (modified) (1 diff)
-
dnsr.c (added)
-
fibril.c (modified) (5 diffs)
-
inet.c (modified) (3 diffs)
-
inet/addr.c (added)
-
inetcfg.c (modified) (6 diffs)
-
inetping.c (modified) (2 diffs)
-
inetping6.c (added)
-
io/con_srv.c (modified) (4 diffs)
-
io/console.c (modified) (5 diffs)
-
io/io.c (modified) (1 diff)
-
iplink.c (modified) (2 diffs)
-
iplink_srv.c (modified) (5 diffs)
-
mem.c (modified) (1 diff)
-
net/inet.c (modified) (4 diffs)
-
net/socket_client.c (modified) (6 diffs)
-
net/socket_parse.c (modified) (2 diffs)
-
str.c (modified) (5 diffs)
-
tls.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/adt/hash_table.c
r52f1882 rdb71e2a 81 81 * @param init_size Initial desired number of hash table buckets. Pass zero 82 82 * if you want the default initial size. 83 * @param max_keys Maximal number of keys needed to identify an item. 83 * @param max_load The table is resized when the average load per bucket 84 * exceeds this number. Pass zero if you want the default. 84 85 * @param op Hash table operations structure. remove_callback() 85 86 * is optional and can be NULL if no action is to be taken -
uspace/lib/c/generic/async.c
r52f1882 rdb71e2a 350 350 static async_client_conn_t client_connection = default_client_connection; 351 351 static async_interrupt_handler_t interrupt_received = default_interrupt_received; 352 static size_t interrupt_handler_stksz = FIBRIL_DFLT_STK_SIZE; 352 353 353 354 /** Setter for client_connection function pointer. … … 370 371 { 371 372 interrupt_received = intr; 373 } 374 375 /** Set the stack size for the interrupt handler notification fibrils. 376 * 377 * @param size Stack size in bytes. 378 */ 379 void async_set_interrupt_handler_stack_size(size_t size) 380 { 381 interrupt_handler_stksz = size; 372 382 } 373 383 … … 587 597 msg->call = *call; 588 598 589 fid_t fid = fibril_create(notification_fibril, msg); 599 fid_t fid = fibril_create_generic(notification_fibril, msg, 600 interrupt_handler_stksz); 590 601 if (fid == 0) { 591 602 free(msg); … … 2057 2068 2058 2069 async_sess_t *sess = exch->sess; 2070 assert(sess != NULL); 2059 2071 2060 2072 atomic_dec(&sess->refcnt); … … 2078 2090 * @param arg User defined argument. 2079 2091 * @param flags Storage for the received flags. Can be NULL. 2080 * @param dst Destination address space area base. Cannot be NULL. 2092 * @param dst Address of the storage for the destination address space area 2093 * base address. Cannot be NULL. 2081 2094 * 2082 2095 * @return Zero on success or a negative error code from errno.h. … … 2206 2219 * 2207 2220 * @param callid Hash of the IPC_M_DATA_WRITE call to answer. 2208 * @param dst Destination address space area base address. 2221 * @param dst Address of the storage for the destination address space area 2222 * base address. 2209 2223 * 2210 2224 * @return Zero on success or a value from @ref errno.h on failure. -
uspace/lib/c/generic/device/hw_res_parsed.c
r52f1882 rdb71e2a 188 188 hw_resource_list_t hw_resources; 189 189 hw_res_list_parsed_clean(hw_res_parsed); 190 bzero(&hw_resources, sizeof(hw_resource_list_t));190 memset(&hw_resources, 0, sizeof(hw_resource_list_t)); 191 191 192 192 int rc = hw_res_get_resource_list(sess, &hw_resources); -
uspace/lib/c/generic/devman.c
r52f1882 rdb71e2a 413 413 sysarg_t dretval; 414 414 415 exch = devman_exchange_begin_blocking( LOC_PORT_CONSUMER);415 exch = devman_exchange_begin_blocking(DEVMAN_CLIENT); 416 416 417 417 ipc_call_t answer; -
uspace/lib/c/generic/fibril.c
r52f1882 rdb71e2a 95 95 fibril_t *fibril_setup(void) 96 96 { 97 tcb_t *tcb = __make_tls();97 tcb_t *tcb = tls_make(); 98 98 if (!tcb) 99 99 return NULL; … … 101 101 fibril_t *fibril = malloc(sizeof(fibril_t)); 102 102 if (!fibril) { 103 __free_tls(tcb);103 tls_free(tcb); 104 104 return NULL; 105 105 } … … 122 122 void fibril_teardown(fibril_t *fibril) 123 123 { 124 __free_tls(fibril->tcb);124 tls_free(fibril->tcb); 125 125 free(fibril); 126 126 } … … 256 256 * @param func Implementing function of the new fibril. 257 257 * @param arg Argument to pass to func. 258 * @param stksz Stack size in bytes. 258 259 * 259 260 * @return 0 on failure or TLS of the new fibril. 260 261 * 261 262 */ 262 fid_t fibril_create (int (*func)(void *), void *arg)263 fid_t fibril_create_generic(int (*func)(void *), void *arg, size_t stksz) 263 264 { 264 265 fibril_t *fibril; … … 268 269 return 0; 269 270 270 size_t stack_size = stack_size_get(); 271 size_t stack_size = (stksz == FIBRIL_DFLT_STK_SIZE) ? 272 stack_size_get() : stksz; 271 273 fibril->stack = as_area_create((void *) -1, stack_size, 272 274 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE | AS_AREA_GUARD | -
uspace/lib/c/generic/inet.c
r52f1882 rdb71e2a 30 30 #include <assert.h> 31 31 #include <errno.h> 32 #include <net/socket_codes.h> 32 33 #include <inet/inet.h> 33 34 #include <ipc/inet.h> … … 108 109 { 109 110 async_exch_t *exch = async_exchange_begin(inet_sess); 110 111 111 112 ipc_call_t answer; 112 aid_t req = async_send_5(exch, INET_SEND, dgram->src.ipv4, 113 dgram->dest.ipv4, dgram->tos, ttl, df, &answer); 114 int rc = async_data_write_start(exch, dgram->data, dgram->size); 115 async_exchange_end(exch); 116 117 if (rc != EOK) { 118 async_forget(req); 119 return rc; 120 } 121 113 aid_t req = async_send_3(exch, INET_SEND, dgram->tos, ttl, df, 114 &answer); 115 116 int rc = async_data_write_start(exch, &dgram->src, sizeof(inet_addr_t)); 117 if (rc != EOK) { 118 async_exchange_end(exch); 119 async_forget(req); 120 return rc; 121 } 122 123 rc = async_data_write_start(exch, &dgram->dest, sizeof(inet_addr_t)); 124 if (rc != EOK) { 125 async_exchange_end(exch); 126 async_forget(req); 127 return rc; 128 } 129 130 rc = async_data_write_start(exch, dgram->data, dgram->size); 131 132 async_exchange_end(exch); 133 134 if (rc != EOK) { 135 async_forget(req); 136 return rc; 137 } 138 122 139 sysarg_t retval; 123 140 async_wait_for(req, &retval); 124 if (retval != EOK) 125 return retval; 126 127 return EOK; 141 142 return (int) retval; 128 143 } 129 144 130 145 int inet_get_srcaddr(inet_addr_t *remote, uint8_t tos, inet_addr_t *local) 131 146 { 132 sysarg_t local_addr; 133 async_exch_t *exch = async_exchange_begin(inet_sess); 134 135 int rc = async_req_2_1(exch, INET_GET_SRCADDR, remote->ipv4, 136 tos, &local_addr); 137 async_exchange_end(exch); 138 139 if (rc != EOK) 140 return rc; 141 142 local->ipv4 = local_addr; 143 return EOK; 144 } 145 146 static void inet_ev_recv(ipc_callid_t callid, ipc_call_t *call) 147 { 148 int rc; 147 async_exch_t *exch = async_exchange_begin(inet_sess); 148 149 ipc_call_t answer; 150 aid_t req = async_send_1(exch, INET_GET_SRCADDR, tos, &answer); 151 152 int rc = async_data_write_start(exch, remote, sizeof(inet_addr_t)); 153 if (rc != EOK) { 154 async_exchange_end(exch); 155 async_forget(req); 156 return rc; 157 } 158 159 rc = async_data_read_start(exch, local, sizeof(inet_addr_t)); 160 161 async_exchange_end(exch); 162 163 if (rc != EOK) { 164 async_forget(req); 165 return rc; 166 } 167 168 sysarg_t retval; 169 async_wait_for(req, &retval); 170 171 return (int) retval; 172 } 173 174 static void inet_ev_recv(ipc_callid_t iid, ipc_call_t *icall) 175 { 149 176 inet_dgram_t dgram; 150 151 dgram.src.ipv4 = IPC_GET_ARG1(*call); 152 dgram.dest.ipv4 = IPC_GET_ARG2(*call); 153 dgram.tos = IPC_GET_ARG3(*call); 154 177 178 dgram.tos = IPC_GET_ARG1(*icall); 179 180 ipc_callid_t callid; 181 size_t size; 182 if (!async_data_write_receive(&callid, &size)) { 183 async_answer_0(callid, EINVAL); 184 async_answer_0(iid, EINVAL); 185 return; 186 } 187 188 if (size != sizeof(inet_addr_t)) { 189 async_answer_0(callid, EINVAL); 190 async_answer_0(iid, EINVAL); 191 return; 192 } 193 194 int rc = async_data_write_finalize(callid, &dgram.src, size); 195 if (rc != EOK) { 196 async_answer_0(callid, rc); 197 async_answer_0(iid, rc); 198 return; 199 } 200 201 if (!async_data_write_receive(&callid, &size)) { 202 async_answer_0(callid, EINVAL); 203 async_answer_0(iid, EINVAL); 204 return; 205 } 206 207 if (size != sizeof(inet_addr_t)) { 208 async_answer_0(callid, EINVAL); 209 async_answer_0(iid, EINVAL); 210 return; 211 } 212 213 rc = async_data_write_finalize(callid, &dgram.dest, size); 214 if (rc != EOK) { 215 async_answer_0(callid, rc); 216 async_answer_0(iid, rc); 217 return; 218 } 219 155 220 rc = async_data_write_accept(&dgram.data, false, 0, 0, 0, &dgram.size); 156 221 if (rc != EOK) { 157 async_answer_0( callid, rc);158 return; 159 } 160 222 async_answer_0(iid, rc); 223 return; 224 } 225 161 226 rc = inet_ev_ops->recv(&dgram); 162 async_answer_0( callid, rc);227 async_answer_0(iid, rc); 163 228 } 164 229 … … 168 233 ipc_call_t call; 169 234 ipc_callid_t callid = async_get_call(&call); 170 235 171 236 if (!IPC_GET_IMETHOD(call)) { 172 237 /* TODO: Handle hangup */ 173 238 return; 174 239 } 175 240 176 241 switch (IPC_GET_IMETHOD(call)) { 177 242 case INET_EV_RECV: -
uspace/lib/c/generic/inetcfg.c
r52f1882 rdb71e2a 137 137 { 138 138 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 139 140 ipc_call_t answer; 141 aid_t req = async_send_3(exch, INETCFG_ADDR_CREATE_STATIC, naddr->ipv4, 142 naddr->bits, link_id, &answer); 139 140 ipc_call_t answer; 141 aid_t req = async_send_1(exch, INETCFG_ADDR_CREATE_STATIC, link_id, 142 &answer); 143 144 int rc = async_data_write_start(exch, naddr, sizeof(inet_naddr_t)); 145 if (rc != EOK) { 146 async_exchange_end(exch); 147 async_forget(req); 148 return rc; 149 } 150 151 rc = async_data_write_start(exch, name, str_size(name)); 152 153 async_exchange_end(exch); 154 155 if (rc != EOK) { 156 async_forget(req); 157 return rc; 158 } 159 160 sysarg_t retval; 161 async_wait_for(req, &retval); 162 163 *addr_id = IPC_GET_ARG1(answer); 164 165 return (int) retval; 166 } 167 168 int inetcfg_addr_delete(sysarg_t addr_id) 169 { 170 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 171 172 int rc = async_req_1_0(exch, INETCFG_ADDR_DELETE, addr_id); 173 async_exchange_end(exch); 174 175 return rc; 176 } 177 178 int inetcfg_addr_get(sysarg_t addr_id, inet_addr_info_t *ainfo) 179 { 180 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 181 182 ipc_call_t answer; 183 aid_t req = async_send_1(exch, INETCFG_ADDR_GET, addr_id, &answer); 184 185 ipc_call_t answer_naddr; 186 aid_t req_naddr = async_data_read(exch, &ainfo->naddr, 187 sizeof(inet_naddr_t), &answer_naddr); 188 189 sysarg_t retval_naddr; 190 async_wait_for(req_naddr, &retval_naddr); 191 192 if (retval_naddr != EOK) { 193 async_exchange_end(exch); 194 async_forget(req); 195 return (int) retval_naddr; 196 } 197 198 ipc_call_t answer_name; 199 char name_buf[LOC_NAME_MAXLEN + 1]; 200 aid_t req_name = async_data_read(exch, name_buf, LOC_NAME_MAXLEN, 201 &answer_name); 202 203 async_exchange_end(exch); 204 205 sysarg_t retval_name; 206 async_wait_for(req_name, &retval_name); 207 208 if (retval_name != EOK) { 209 async_forget(req); 210 return (int) retval_name; 211 } 212 213 sysarg_t retval; 214 async_wait_for(req, &retval); 215 216 if (retval != EOK) 217 return (int) retval; 218 219 size_t act_size = IPC_GET_ARG2(answer_name); 220 assert(act_size <= LOC_NAME_MAXLEN); 221 222 name_buf[act_size] = '\0'; 223 224 ainfo->ilink = IPC_GET_ARG1(answer); 225 ainfo->name = str_dup(name_buf); 226 227 return EOK; 228 } 229 230 int inetcfg_addr_get_id(const char *name, sysarg_t link_id, sysarg_t *addr_id) 231 { 232 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 233 234 ipc_call_t answer; 235 aid_t req = async_send_1(exch, INETCFG_ADDR_GET_ID, link_id, &answer); 143 236 sysarg_t retval = async_data_write_start(exch, name, str_size(name)); 144 237 … … 156 249 } 157 250 158 int inetcfg_addr_delete(sysarg_t addr_id) 159 { 160 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 161 162 int rc = async_req_1_0(exch, INETCFG_ADDR_DELETE, addr_id); 163 async_exchange_end(exch); 164 165 return rc; 166 } 167 168 int inetcfg_addr_get(sysarg_t addr_id, inet_addr_info_t *ainfo) 251 int inetcfg_get_addr_list(sysarg_t **addrs, size_t *count) 252 { 253 return inetcfg_get_ids_internal(INETCFG_GET_ADDR_LIST, 254 0, addrs, count); 255 } 256 257 int inetcfg_get_link_list(sysarg_t **links, size_t *count) 258 { 259 return inetcfg_get_ids_internal(INETCFG_GET_LINK_LIST, 260 0, links, count); 261 } 262 263 int inetcfg_get_sroute_list(sysarg_t **sroutes, size_t *count) 264 { 265 return inetcfg_get_ids_internal(INETCFG_GET_SROUTE_LIST, 266 0, sroutes, count); 267 } 268 269 int inetcfg_link_get(sysarg_t link_id, inet_link_info_t *linfo) 169 270 { 170 271 ipc_call_t dreply; … … 176 277 177 278 ipc_call_t answer; 178 aid_t req = async_send_1(exch, INETCFG_ ADDR_GET, addr_id, &answer);279 aid_t req = async_send_1(exch, INETCFG_LINK_GET, link_id, &answer); 179 280 aid_t dreq = async_data_read(exch, name_buf, LOC_NAME_MAXLEN, &dreply); 180 281 async_wait_for(dreq, &dretval); … … 197 298 name_buf[act_size] = '\0'; 198 299 199 ainfo->naddr.ipv4 = IPC_GET_ARG1(answer);200 ainfo->naddr.bits = IPC_GET_ARG2(answer);201 ainfo->ilink = IPC_GET_ARG3(answer);202 ainfo->name = str_dup(name_buf);203 204 return EOK;205 }206 207 int inetcfg_addr_get_id(const char *name, sysarg_t link_id, sysarg_t *addr_id)208 {209 async_exch_t *exch = async_exchange_begin(inetcfg_sess);210 211 ipc_call_t answer;212 aid_t req = async_send_1(exch, INETCFG_ADDR_GET_ID, link_id, &answer);213 sysarg_t retval = async_data_write_start(exch, name, str_size(name));214 215 async_exchange_end(exch);216 217 if (retval != EOK) {218 async_forget(req);219 return retval;220 }221 222 async_wait_for(req, &retval);223 *addr_id = IPC_GET_ARG1(answer);224 225 return retval;226 }227 228 int inetcfg_get_addr_list(sysarg_t **addrs, size_t *count)229 {230 return inetcfg_get_ids_internal(INETCFG_GET_ADDR_LIST,231 0, addrs, count);232 }233 234 int inetcfg_get_link_list(sysarg_t **links, size_t *count)235 {236 return inetcfg_get_ids_internal(INETCFG_GET_LINK_LIST,237 0, links, count);238 }239 240 int inetcfg_get_sroute_list(sysarg_t **sroutes, size_t *count)241 {242 return inetcfg_get_ids_internal(INETCFG_GET_SROUTE_LIST,243 0, sroutes, count);244 }245 246 int inetcfg_link_get(sysarg_t link_id, inet_link_info_t *linfo)247 {248 ipc_call_t dreply;249 sysarg_t dretval;250 size_t act_size;251 char name_buf[LOC_NAME_MAXLEN + 1];252 253 async_exch_t *exch = async_exchange_begin(inetcfg_sess);254 255 ipc_call_t answer;256 aid_t req = async_send_1(exch, INETCFG_LINK_GET, link_id, &answer);257 aid_t dreq = async_data_read(exch, name_buf, LOC_NAME_MAXLEN, &dreply);258 async_wait_for(dreq, &dretval);259 260 async_exchange_end(exch);261 262 if (dretval != EOK) {263 async_forget(req);264 return dretval;265 }266 267 sysarg_t retval;268 async_wait_for(req, &retval);269 270 if (retval != EOK)271 return retval;272 273 act_size = IPC_GET_ARG2(dreply);274 assert(act_size <= LOC_NAME_MAXLEN);275 name_buf[act_size] = '\0';276 277 300 linfo->name = str_dup(name_buf); 278 301 linfo->def_mtu = IPC_GET_ARG1(answer); … … 285 308 { 286 309 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 287 288 ipc_call_t answer; 289 aid_t req = async_send_3(exch, INETCFG_SROUTE_CREATE, 290 dest->ipv4, dest->bits, router->ipv4, &answer); 291 sysarg_t retval = async_data_write_start(exch, name, str_size(name)); 292 293 async_exchange_end(exch); 294 295 if (retval != EOK) { 296 async_forget(req); 297 return retval; 298 } 299 300 async_wait_for(req, &retval); 310 311 ipc_call_t answer; 312 aid_t req = async_send_0(exch, INETCFG_SROUTE_CREATE, &answer); 313 314 int rc = async_data_write_start(exch, dest, sizeof(inet_naddr_t)); 315 if (rc != EOK) { 316 async_exchange_end(exch); 317 async_forget(req); 318 return rc; 319 } 320 321 rc = async_data_write_start(exch, router, sizeof(inet_addr_t)); 322 if (rc != EOK) { 323 async_exchange_end(exch); 324 async_forget(req); 325 return rc; 326 } 327 328 rc = async_data_write_start(exch, name, str_size(name)); 329 330 async_exchange_end(exch); 331 332 if (rc != EOK) { 333 async_forget(req); 334 return rc; 335 } 336 337 sysarg_t retval; 338 async_wait_for(req, &retval); 339 301 340 *sroute_id = IPC_GET_ARG1(answer); 302 303 return retval;341 342 return (int) retval; 304 343 } 305 344 … … 316 355 int inetcfg_sroute_get(sysarg_t sroute_id, inet_sroute_info_t *srinfo) 317 356 { 318 ipc_call_t dreply; 319 sysarg_t dretval; 320 size_t act_size; 357 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 358 359 ipc_call_t answer; 360 aid_t req = async_send_1(exch, INETCFG_SROUTE_GET, sroute_id, &answer); 361 362 ipc_call_t answer_dest; 363 aid_t req_dest = async_data_read(exch, &srinfo->dest, 364 sizeof(inet_naddr_t), &answer_dest); 365 366 sysarg_t retval_dest; 367 async_wait_for(req_dest, &retval_dest); 368 369 if (retval_dest != EOK) { 370 async_exchange_end(exch); 371 async_forget(req); 372 return (int) retval_dest; 373 } 374 375 ipc_call_t answer_router; 376 aid_t req_router = async_data_read(exch, &srinfo->router, 377 sizeof(inet_addr_t), &answer_router); 378 379 sysarg_t retval_router; 380 async_wait_for(req_router, &retval_router); 381 382 if (retval_router != EOK) { 383 async_exchange_end(exch); 384 async_forget(req); 385 return (int) retval_router; 386 } 387 388 ipc_call_t answer_name; 321 389 char name_buf[LOC_NAME_MAXLEN + 1]; 322 323 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 324 325 ipc_call_t answer; 326 aid_t req = async_send_1(exch, INETCFG_SROUTE_GET, sroute_id, &answer); 327 aid_t dreq = async_data_read(exch, name_buf, LOC_NAME_MAXLEN, &dreply); 328 async_wait_for(dreq, &dretval); 329 330 async_exchange_end(exch); 331 332 if (dretval != EOK) { 333 async_forget(req); 334 return dretval; 335 } 336 337 sysarg_t retval; 338 async_wait_for(req, &retval); 339 390 aid_t req_name = async_data_read(exch, name_buf, LOC_NAME_MAXLEN, 391 &answer_name); 392 393 async_exchange_end(exch); 394 395 sysarg_t retval_name; 396 async_wait_for(req_name, &retval_name); 397 398 if (retval_name != EOK) { 399 async_forget(req); 400 return (int) retval_name; 401 } 402 403 sysarg_t retval; 404 async_wait_for(req, &retval); 405 340 406 if (retval != EOK) 341 return retval;342 343 act_size = IPC_GET_ARG2(dreply);407 return (int) retval; 408 409 size_t act_size = IPC_GET_ARG2(answer_name); 344 410 assert(act_size <= LOC_NAME_MAXLEN); 411 345 412 name_buf[act_size] = '\0'; 346 347 srinfo->dest.ipv4 = IPC_GET_ARG1(answer); 348 srinfo->dest.bits = IPC_GET_ARG2(answer); 349 srinfo->router.ipv4 = IPC_GET_ARG3(answer); 413 350 414 srinfo->name = str_dup(name_buf); 351 415 352 416 return EOK; 353 417 } -
uspace/lib/c/generic/inetping.c
r52f1882 rdb71e2a 79 79 { 80 80 async_exch_t *exch = async_exchange_begin(inetping_sess); 81 81 82 82 ipc_call_t answer; 83 aid_t req = async_send_3(exch, INETPING_SEND, sdu->src.ipv4,84 sdu->dest.ipv4, sdu->seq_no, &answer);83 aid_t req = async_send_3(exch, INETPING_SEND, (sysarg_t) sdu->src, 84 (sysarg_t) sdu->dest, sdu->seq_no, &answer); 85 85 sysarg_t retval = async_data_write_start(exch, sdu->data, sdu->size); 86 86 87 87 async_exchange_end(exch); 88 88 89 89 if (retval != EOK) { 90 90 async_forget(req); 91 91 return retval; 92 92 } 93 93 94 94 async_wait_for(req, &retval); 95 95 return retval; 96 96 } 97 97 98 int inetping_get_srcaddr( inet_addr_t *remote, inet_addr_t *local)98 int inetping_get_srcaddr(uint32_t remote, uint32_t *local) 99 99 { 100 async_exch_t *exch = async_exchange_begin(inetping_sess); 101 100 102 sysarg_t local_addr; 101 async_exch_t *exch = async_exchange_begin(inetping_sess); 102 103 int rc = async_req_1_1(exch, INETPING_GET_SRCADDR, remote->ipv4, 103 int rc = async_req_1_1(exch, INETPING_GET_SRCADDR, (sysarg_t) remote, 104 104 &local_addr); 105 105 106 async_exchange_end(exch); 106 107 107 108 if (rc != EOK) 108 109 return rc; 109 110 local->ipv4 =local_addr;110 111 *local = (uint32_t) local_addr; 111 112 return EOK; 112 113 } … … 114 115 static void inetping_ev_recv(ipc_callid_t callid, ipc_call_t *call) 115 116 { 116 int rc;117 117 inetping_sdu_t sdu; 118 119 sdu.src .ipv4= IPC_GET_ARG1(*call);120 sdu.dest .ipv4= IPC_GET_ARG2(*call);118 119 sdu.src = IPC_GET_ARG1(*call); 120 sdu.dest = IPC_GET_ARG2(*call); 121 121 sdu.seq_no = IPC_GET_ARG3(*call); 122 123 rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size);122 123 int rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size); 124 124 if (rc != EOK) { 125 125 async_answer_0(callid, rc); 126 126 return; 127 127 } 128 128 129 129 rc = inetping_ev_ops->recv(&sdu); 130 130 free(sdu.data); -
uspace/lib/c/generic/io/con_srv.c
r52f1882 rdb71e2a 35 35 */ 36 36 #include <errno.h> 37 #include <io/cons_event.h> 37 38 #include <ipc/console.h> 38 39 #include <stdlib.h> … … 40 41 41 42 #include <io/con_srv.h> 43 44 static int console_ev_encode(cons_event_t *event, ipc_call_t *call) 45 { 46 IPC_SET_ARG1(*call, event->type); 47 48 switch (event->type) { 49 case CEV_KEY: 50 IPC_SET_ARG2(*call, event->ev.key.type); 51 IPC_SET_ARG3(*call, event->ev.key.key); 52 IPC_SET_ARG4(*call, event->ev.key.mods); 53 IPC_SET_ARG5(*call, event->ev.key.c); 54 break; 55 case CEV_POS: 56 IPC_SET_ARG2(*call, (event->ev.pos.pos_id << 16) | (event->ev.pos.type & 0xffff)); 57 IPC_SET_ARG3(*call, event->ev.pos.btn_num); 58 IPC_SET_ARG4(*call, event->ev.pos.hpos); 59 IPC_SET_ARG5(*call, event->ev.pos.vpos); 60 break; 61 default: 62 return EIO; 63 } 64 65 return EOK; 66 } 42 67 43 68 static void con_read_srv(con_srv_t *srv, ipc_callid_t callid, … … 273 298 { 274 299 int rc; 275 kbd_event_t event; 300 cons_event_t event; 301 ipc_call_t result; 276 302 277 303 if (srv->srvs->ops->get_event == NULL) { … … 281 307 282 308 rc = srv->srvs->ops->get_event(srv, &event); 283 async_answer_4(callid, rc, event.type, event.key, event.mods, event.c); 309 if (rc != EOK) { 310 async_answer_0(callid, rc); 311 return; 312 } 313 314 rc = console_ev_encode(&event, &result); 315 if (rc != EOK) { 316 async_answer_0(callid, rc); 317 return; 318 } 319 320 async_answer_5(callid, rc, IPC_GET_ARG1(result), IPC_GET_ARG2(result), 321 IPC_GET_ARG3(result), IPC_GET_ARG4(result), IPC_GET_ARG5(result)); 284 322 } 285 323 -
uspace/lib/c/generic/io/console.c
r52f1882 rdb71e2a 154 154 } 155 155 156 bool console_get_kbd_event(console_ctrl_t *ctrl, kbd_event_t *event) 156 static int console_ev_decode(ipc_call_t *call, cons_event_t *event) 157 { 158 event->type = IPC_GET_ARG1(*call); 159 160 switch (event->type) { 161 case CEV_KEY: 162 event->ev.key.type = IPC_GET_ARG2(*call); 163 event->ev.key.key = IPC_GET_ARG3(*call); 164 event->ev.key.mods = IPC_GET_ARG4(*call); 165 event->ev.key.c = IPC_GET_ARG5(*call); 166 break; 167 case CEV_POS: 168 event->ev.pos.pos_id = IPC_GET_ARG2(*call) >> 16; 169 event->ev.pos.type = IPC_GET_ARG2(*call) & 0xffff; 170 event->ev.pos.btn_num = IPC_GET_ARG3(*call); 171 event->ev.pos.hpos = IPC_GET_ARG4(*call); 172 event->ev.pos.vpos = IPC_GET_ARG5(*call); 173 break; 174 default: 175 return EIO; 176 } 177 178 return EOK; 179 } 180 181 bool console_get_event(console_ctrl_t *ctrl, cons_event_t *event) 157 182 { 158 183 if (ctrl->input_aid == 0) { 159 sysarg_t type; 160 sysarg_t key; 161 sysarg_t mods; 162 sysarg_t c; 184 ipc_call_t result; 163 185 164 186 async_exch_t *exch = async_exchange_begin(ctrl->input_sess); 165 int rc = async_req_0_4(exch, CONSOLE_GET_EVENT, &type, &key, &mods, &c);187 aid_t aid = async_send_0(exch, CONSOLE_GET_EVENT, &result); 166 188 async_exchange_end(exch); 189 190 sysarg_t rc; 191 async_wait_for(aid, &rc); 167 192 168 193 if (rc != EOK) { … … 171 196 } 172 197 173 event->type = type; 174 event->key = key; 175 event->mods = mods; 176 event->c = c; 198 rc = console_ev_decode(&result, event); 199 if (rc != EOK) { 200 errno = rc; 201 return false; 202 } 177 203 } else { 178 204 sysarg_t retval; … … 186 212 } 187 213 188 event->type = IPC_GET_ARG1(ctrl->input_call); 189 event->key = IPC_GET_ARG2(ctrl->input_call); 190 event->mods = IPC_GET_ARG3(ctrl->input_call); 191 event->c = IPC_GET_ARG4(ctrl->input_call); 214 int rc = console_ev_decode(&ctrl->input_call, event); 215 if (rc != EOK) { 216 errno = rc; 217 return false; 218 } 192 219 } 193 220 … … 195 222 } 196 223 197 bool console_get_ kbd_event_timeout(console_ctrl_t *ctrl, kbd_event_t *event,224 bool console_get_event_timeout(console_ctrl_t *ctrl, cons_event_t *event, 198 225 suseconds_t *timeout) 199 226 { … … 223 250 } 224 251 225 event->type = IPC_GET_ARG1(ctrl->input_call); 226 event->key = IPC_GET_ARG2(ctrl->input_call); 227 event->mods = IPC_GET_ARG3(ctrl->input_call); 228 event->c = IPC_GET_ARG4(ctrl->input_call); 252 rc = console_ev_decode(&ctrl->input_call, event); 253 if (rc != EOK) { 254 errno = rc; 255 return false; 256 } 229 257 230 258 /* Update timeout */ -
uspace/lib/c/generic/io/io.c
r52f1882 rdb71e2a 192 192 } 193 193 194 /** Set stream buffer. 195 * 196 * When @p buf is NULL, the stream is set as unbuffered, otherwise 197 * full buffering is enabled. 198 */ 199 void setbuf(FILE *stream, void *buf) 200 { 201 if (buf == NULL) { 202 setvbuf(stream, NULL, _IONBF, BUFSIZ); 203 } else { 204 setvbuf(stream, buf, _IOFBF, BUFSIZ); 205 } 206 } 207 194 208 static void _setvbuf(FILE *stream) 195 209 { -
uspace/lib/c/generic/iplink.c
r52f1882 rdb71e2a 39 39 #include <errno.h> 40 40 #include <inet/iplink.h> 41 #include <inet/addr.h> 41 42 #include <ipc/iplink.h> 42 43 #include <ipc/services.h> … … 83 84 { 84 85 async_exch_t *exch = async_exchange_begin(iplink->sess); 85 86 ipc_call_t answer; 87 aid_t req = async_send_2(exch, IPLINK_SEND, sdu->lsrc.ipv4, 88 sdu->ldest.ipv4, &answer); 86 87 ipc_call_t answer; 88 aid_t req = async_send_2(exch, IPLINK_SEND, (sysarg_t) sdu->src, 89 (sysarg_t) sdu->dest, &answer); 90 89 91 int rc = async_data_write_start(exch, sdu->data, sdu->size); 90 async_exchange_end(exch); 91 92 if (rc != EOK) { 93 async_forget(req); 94 return rc; 95 } 96 97 sysarg_t retval; 98 async_wait_for(req, &retval); 99 if (retval != EOK) 100 return retval; 101 102 return EOK; 92 93 async_exchange_end(exch); 94 95 if (rc != EOK) { 96 async_forget(req); 97 return rc; 98 } 99 100 sysarg_t retval; 101 async_wait_for(req, &retval); 102 103 return (int) retval; 104 } 105 106 int iplink_send6(iplink_t *iplink, iplink_sdu6_t *sdu) 107 { 108 async_exch_t *exch = async_exchange_begin(iplink->sess); 109 110 ipc_call_t answer; 111 aid_t req = async_send_0(exch, IPLINK_SEND6, &answer); 112 113 int rc = async_data_write_start(exch, &sdu->dest, sizeof(addr48_t)); 114 if (rc != EOK) { 115 async_exchange_end(exch); 116 async_forget(req); 117 return rc; 118 } 119 120 rc = async_data_write_start(exch, sdu->data, sdu->size); 121 122 async_exchange_end(exch); 123 124 if (rc != EOK) { 125 async_forget(req); 126 return rc; 127 } 128 129 sysarg_t retval; 130 async_wait_for(req, &retval); 131 132 return (int) retval; 103 133 } 104 134 105 135 int iplink_get_mtu(iplink_t *iplink, size_t *rmtu) 106 136 { 137 async_exch_t *exch = async_exchange_begin(iplink->sess); 138 107 139 sysarg_t mtu; 108 async_exch_t *exch = async_exchange_begin(iplink->sess);109 110 140 int rc = async_req_0_1(exch, IPLINK_GET_MTU, &mtu); 111 async_exchange_end(exch); 112 141 142 async_exchange_end(exch); 143 113 144 if (rc != EOK) 114 145 return rc; 115 146 116 147 *rmtu = mtu; 117 148 return EOK; 118 149 } 119 150 120 int iplink_addr_add(iplink_t *iplink, iplink_addr_t *addr) 121 { 122 async_exch_t *exch = async_exchange_begin(iplink->sess); 123 124 int rc = async_req_1_0(exch, IPLINK_ADDR_ADD, (sysarg_t)addr->ipv4); 125 async_exchange_end(exch); 126 127 return rc; 128 } 129 130 int iplink_addr_remove(iplink_t *iplink, iplink_addr_t *addr) 131 { 132 async_exch_t *exch = async_exchange_begin(iplink->sess); 133 134 int rc = async_req_1_0(exch, IPLINK_ADDR_REMOVE, (sysarg_t)addr->ipv4); 135 async_exchange_end(exch); 136 137 return rc; 138 } 139 140 static void iplink_ev_recv(iplink_t *iplink, ipc_callid_t callid, 141 ipc_call_t *call) 142 { 143 int rc; 144 iplink_sdu_t sdu; 145 146 sdu.lsrc.ipv4 = IPC_GET_ARG1(*call); 147 sdu.ldest.ipv4 = IPC_GET_ARG2(*call); 148 149 rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size); 150 if (rc != EOK) { 151 async_answer_0(callid, rc); 151 int iplink_get_mac48(iplink_t *iplink, addr48_t *mac) 152 { 153 async_exch_t *exch = async_exchange_begin(iplink->sess); 154 155 ipc_call_t answer; 156 aid_t req = async_send_0(exch, IPLINK_GET_MAC48, &answer); 157 158 int rc = async_data_read_start(exch, mac, sizeof(addr48_t)); 159 160 loc_exchange_end(exch); 161 162 if (rc != EOK) { 163 async_forget(req); 164 return rc; 165 } 166 167 sysarg_t retval; 168 async_wait_for(req, &retval); 169 170 return (int) retval; 171 } 172 173 int iplink_addr_add(iplink_t *iplink, inet_addr_t *addr) 174 { 175 async_exch_t *exch = async_exchange_begin(iplink->sess); 176 177 ipc_call_t answer; 178 aid_t req = async_send_0(exch, IPLINK_ADDR_ADD, &answer); 179 180 int rc = async_data_write_start(exch, addr, sizeof(inet_addr_t)); 181 async_exchange_end(exch); 182 183 if (rc != EOK) { 184 async_forget(req); 185 return rc; 186 } 187 188 sysarg_t retval; 189 async_wait_for(req, &retval); 190 191 return (int) retval; 192 } 193 194 int iplink_addr_remove(iplink_t *iplink, inet_addr_t *addr) 195 { 196 async_exch_t *exch = async_exchange_begin(iplink->sess); 197 198 ipc_call_t answer; 199 aid_t req = async_send_0(exch, IPLINK_ADDR_REMOVE, &answer); 200 201 int rc = async_data_write_start(exch, addr, sizeof(inet_addr_t)); 202 async_exchange_end(exch); 203 204 if (rc != EOK) { 205 async_forget(req); 206 return rc; 207 } 208 209 sysarg_t retval; 210 async_wait_for(req, &retval); 211 212 return (int) retval; 213 } 214 215 static void iplink_ev_recv(iplink_t *iplink, ipc_callid_t iid, 216 ipc_call_t *icall) 217 { 218 iplink_recv_sdu_t sdu; 219 220 uint16_t af = IPC_GET_ARG1(*icall); 221 222 int rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, 223 &sdu.size); 224 if (rc != EOK) { 225 async_answer_0(iid, rc); 152 226 return; 153 227 } 154 155 rc = iplink->ev_ops->recv(iplink, &sdu );228 229 rc = iplink->ev_ops->recv(iplink, &sdu, af); 156 230 free(sdu.data); 157 async_answer_0( callid, rc);231 async_answer_0(iid, rc); 158 232 } 159 233 160 234 static void iplink_cb_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg) 161 235 { 162 iplink_t *iplink = (iplink_t *) arg;163 236 iplink_t *iplink = (iplink_t *) arg; 237 164 238 while (true) { 165 239 ipc_call_t call; 166 240 ipc_callid_t callid = async_get_call(&call); 167 241 168 242 if (!IPC_GET_IMETHOD(call)) { 169 243 /* TODO: Handle hangup */ 170 244 return; 171 245 } 172 246 173 247 switch (IPC_GET_IMETHOD(call)) { 174 248 case IPLINK_EV_RECV: -
uspace/lib/c/generic/iplink_srv.c
r52f1882 rdb71e2a 34 34 * @brief IP link server stub 35 35 */ 36 36 37 #include <errno.h> 37 38 #include <ipc/iplink.h> 38 39 #include <stdlib.h> 39 40 #include <sys/types.h> 40 41 #include <inet/addr.h> 41 42 #include <inet/iplink_srv.h> 42 43 … … 44 45 ipc_call_t *call) 45 46 { 46 int rc;47 47 size_t mtu; 48 49 rc = srv->ops->get_mtu(srv, &mtu); 48 int rc = srv->ops->get_mtu(srv, &mtu); 50 49 async_answer_1(callid, rc, mtu); 51 50 } 52 51 53 static void iplink_addr_add_srv(iplink_srv_t *srv, ipc_callid_t callid, 54 ipc_call_t *call) 55 { 56 int rc; 57 iplink_srv_addr_t addr; 58 59 addr.ipv4 = IPC_GET_ARG1(*call); 60 52 static void iplink_get_mac48_srv(iplink_srv_t *srv, ipc_callid_t iid, 53 ipc_call_t *icall) 54 { 55 addr48_t mac; 56 int rc = srv->ops->get_mac48(srv, &mac); 57 if (rc != EOK) { 58 async_answer_0(iid, rc); 59 return; 60 } 61 62 ipc_callid_t callid; 63 size_t size; 64 if (!async_data_read_receive(&callid, &size)) { 65 async_answer_0(callid, EREFUSED); 66 async_answer_0(iid, EREFUSED); 67 return; 68 } 69 70 if (size != sizeof(addr48_t)) { 71 async_answer_0(callid, EINVAL); 72 async_answer_0(iid, EINVAL); 73 return; 74 } 75 76 rc = async_data_read_finalize(callid, &mac, size); 77 if (rc != EOK) 78 async_answer_0(callid, rc); 79 80 async_answer_0(iid, (sysarg_t) rc); 81 } 82 83 static void iplink_addr_add_srv(iplink_srv_t *srv, ipc_callid_t iid, 84 ipc_call_t *icall) 85 { 86 ipc_callid_t callid; 87 size_t size; 88 if (!async_data_write_receive(&callid, &size)) { 89 async_answer_0(callid, EREFUSED); 90 async_answer_0(iid, EREFUSED); 91 return; 92 } 93 94 if (size != sizeof(inet_addr_t)) { 95 async_answer_0(callid, EINVAL); 96 async_answer_0(iid, EINVAL); 97 return; 98 } 99 100 inet_addr_t addr; 101 int rc = async_data_write_finalize(callid, &addr, size); 102 if (rc != EOK) { 103 async_answer_0(callid, (sysarg_t) rc); 104 async_answer_0(iid, (sysarg_t) rc); 105 } 106 61 107 rc = srv->ops->addr_add(srv, &addr); 62 async_answer_0(callid, rc); 63 } 64 65 static void iplink_addr_remove_srv(iplink_srv_t *srv, ipc_callid_t callid, 66 ipc_call_t *call) 67 { 68 int rc; 69 iplink_srv_addr_t addr; 70 71 addr.ipv4 = IPC_GET_ARG1(*call); 72 108 async_answer_0(iid, (sysarg_t) rc); 109 } 110 111 static void iplink_addr_remove_srv(iplink_srv_t *srv, ipc_callid_t iid, 112 ipc_call_t *icall) 113 { 114 ipc_callid_t callid; 115 size_t size; 116 if (!async_data_write_receive(&callid, &size)) { 117 async_answer_0(callid, EREFUSED); 118 async_answer_0(iid, EREFUSED); 119 return; 120 } 121 122 if (size != sizeof(inet_addr_t)) { 123 async_answer_0(callid, EINVAL); 124 async_answer_0(iid, EINVAL); 125 return; 126 } 127 128 inet_addr_t addr; 129 int rc = async_data_write_finalize(callid, &addr, size); 130 if (rc != EOK) { 131 async_answer_0(callid, (sysarg_t) rc); 132 async_answer_0(iid, (sysarg_t) rc); 133 } 134 73 135 rc = srv->ops->addr_remove(srv, &addr); 74 async_answer_0( callid,rc);75 } 76 77 static void iplink_send_srv(iplink_srv_t *srv, ipc_callid_t callid,78 ipc_call_t * call)79 { 80 iplink_s rv_sdu_t sdu;81 int rc;82 83 sdu. lsrc.ipv4 = IPC_GET_ARG1(*call);84 sdu.ldest.ipv4 = IPC_GET_ARG2(*call);85 86 rc = async_data_write_accept(&sdu.data, false, 0, 0, 0,&sdu.size);87 if (rc != EOK) { 88 async_answer_0( callid, rc);89 return; 90 } 91 136 async_answer_0(iid, (sysarg_t) rc); 137 } 138 139 static void iplink_send_srv(iplink_srv_t *srv, ipc_callid_t iid, 140 ipc_call_t *icall) 141 { 142 iplink_sdu_t sdu; 143 144 sdu.src = IPC_GET_ARG1(*icall); 145 sdu.dest = IPC_GET_ARG2(*icall); 146 147 int rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, 148 &sdu.size); 149 if (rc != EOK) { 150 async_answer_0(iid, rc); 151 return; 152 } 153 92 154 rc = srv->ops->send(srv, &sdu); 93 155 free(sdu.data); 94 async_answer_0(callid, rc); 156 async_answer_0(iid, rc); 157 } 158 159 static void iplink_send6_srv(iplink_srv_t *srv, ipc_callid_t iid, 160 ipc_call_t *icall) 161 { 162 iplink_sdu6_t sdu; 163 164 ipc_callid_t callid; 165 size_t size; 166 if (!async_data_write_receive(&callid, &size)) { 167 async_answer_0(callid, EREFUSED); 168 async_answer_0(iid, EREFUSED); 169 return; 170 } 171 172 if (size != sizeof(addr48_t)) { 173 async_answer_0(callid, EINVAL); 174 async_answer_0(iid, EINVAL); 175 return; 176 } 177 178 int rc = async_data_write_finalize(callid, &sdu.dest, size); 179 if (rc != EOK) { 180 async_answer_0(callid, (sysarg_t) rc); 181 async_answer_0(iid, (sysarg_t) rc); 182 } 183 184 rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, 185 &sdu.size); 186 if (rc != EOK) { 187 async_answer_0(iid, rc); 188 return; 189 } 190 191 rc = srv->ops->send6(srv, &sdu); 192 free(sdu.data); 193 async_answer_0(iid, rc); 95 194 } 96 195 … … 106 205 int iplink_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg) 107 206 { 108 iplink_srv_t *srv = (iplink_srv_t *) arg;207 iplink_srv_t *srv = (iplink_srv_t *) arg; 109 208 int rc; 110 209 111 210 fibril_mutex_lock(&srv->lock); 112 211 if (srv->connected) { … … 115 214 return EBUSY; 116 215 } 117 216 118 217 srv->connected = true; 119 218 fibril_mutex_unlock(&srv->lock); 120 219 121 220 /* Accept the connection */ 122 221 async_answer_0(iid, EOK); 123 222 124 223 async_sess_t *sess = async_callback_receive(EXCHANGE_SERIALIZE); 125 224 if (sess == NULL) 126 225 return ENOMEM; 127 226 128 227 srv->client_sess = sess; 129 228 130 229 rc = srv->ops->open(srv); 131 230 if (rc != EOK) 132 231 return rc; 133 232 134 233 while (true) { 135 234 ipc_call_t call; 136 235 ipc_callid_t callid = async_get_call(&call); 137 236 sysarg_t method = IPC_GET_IMETHOD(call); 138 237 139 238 if (!method) { 140 239 /* The other side has hung up */ 141 fibril_mutex_lock(&srv->lock);240 fibril_mutex_lock(&srv->lock); 142 241 srv->connected = false; 143 fibril_mutex_unlock(&srv->lock);242 fibril_mutex_unlock(&srv->lock); 144 243 async_answer_0(callid, EOK); 145 244 break; 146 245 } 147 246 148 247 switch (method) { 149 248 case IPLINK_GET_MTU: 150 249 iplink_get_mtu_srv(srv, callid, &call); 151 250 break; 251 case IPLINK_GET_MAC48: 252 iplink_get_mac48_srv(srv, callid, &call); 253 break; 152 254 case IPLINK_SEND: 153 255 iplink_send_srv(srv, callid, &call); 256 break; 257 case IPLINK_SEND6: 258 iplink_send6_srv(srv, callid, &call); 154 259 break; 155 260 case IPLINK_ADDR_ADD: … … 163 268 } 164 269 } 165 270 166 271 return srv->ops->close(srv); 167 272 } 168 273 169 int iplink_ev_recv(iplink_srv_t *srv, iplink_ srv_sdu_t *sdu)274 int iplink_ev_recv(iplink_srv_t *srv, iplink_recv_sdu_t *sdu, uint16_t af) 170 275 { 171 276 if (srv->client_sess == NULL) 172 277 return EIO; 173 278 174 279 async_exch_t *exch = async_exchange_begin(srv->client_sess); 175 280 176 281 ipc_call_t answer; 177 aid_t req = async_send_2(exch, IPLINK_EV_RECV, sdu->lsrc.ipv4, 178 sdu->ldest.ipv4, &answer); 282 aid_t req = async_send_1(exch, IPLINK_EV_RECV, (sysarg_t) af, 283 &answer); 284 179 285 int rc = async_data_write_start(exch, sdu->data, sdu->size); 180 286 async_exchange_end(exch); 181 287 182 288 if (rc != EOK) { 183 289 async_forget(req); 184 290 return rc; 185 291 } 186 292 187 293 sysarg_t retval; 188 294 async_wait_for(req, &retval); 189 295 if (retval != EOK) 190 296 return retval; 191 297 192 298 return EOK; 193 299 } -
uspace/lib/c/generic/mem.c
r52f1882 rdb71e2a 224 224 * @param s1 Pointer to the first area to compare. 225 225 * @param s2 Pointer to the second area to compare. 226 * @param len Size of the first area in bytes. Both areas must have227 * the same length.228 * 229 * @return If len is 0, return zero. If the areas match, return230 * zero. Otherwise return non-zero.231 * 232 */ 233 int bcmp(const void *s1, const void *s2, size_t len)226 * @param len Size of the areas in bytes. 227 * 228 * @return Zero if areas have the same contents. If they differ, 229 * the sign of the result is the same as the sign of the 230 * difference of the first pair of different bytes. 231 * 232 */ 233 int memcmp(const void *s1, const void *s2, size_t len) 234 234 { 235 235 uint8_t *u1 = (uint8_t *) s1; 236 236 uint8_t *u2 = (uint8_t *) s2; 237 238 for (; (len != 0) && (*u1++ == *u2++); len--); 239 240 return len; 237 size_t i; 238 239 for (i = 0; i < len; i++) { 240 if (*u1 != *u2) 241 return (int)(*u1) - (int)(*u2); 242 ++u1; 243 ++u2; 244 } 245 246 return 0; 241 247 } 242 248 -
uspace/lib/c/generic/net/inet.c
r52f1882 rdb71e2a 1 1 /* 2 * Copyright (c) 20 09 Lukas Mejdrech2 * Copyright (c) 2013 Martin Decky 3 3 * All rights reserved. 4 4 * … … 39 39 #include <net/in6.h> 40 40 #include <net/inet.h> 41 41 #include <inet/addr.h> 42 42 #include <errno.h> 43 43 #include <mem.h> … … 45 45 #include <str.h> 46 46 47 const in6_addr_t in6addr_any = { 48 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } 49 }; 50 51 static int inet_ntop4(const uint8_t *data, char *address, size_t length) 52 { 53 /* Check output buffer size */ 54 if (length < INET_ADDRSTRLEN) 55 return ENOMEM; 56 57 /* Fill buffer with IPv4 address */ 58 snprintf(address, length, 59 "%" PRIu8 ".%" PRIu8 ".%" PRIu8 ".%" PRIu8, 60 data[0], data[1], data[2], data[3]); 61 62 return EOK; 63 } 64 65 static int inet_ntop6(const uint8_t *data, char *address, size_t length) 66 { 67 /* Check output buffer size */ 68 if (length < INET6_ADDRSTRLEN) 69 return ENOMEM; 70 71 /* Find the longest zero subsequence */ 72 73 uint16_t zeroes[8]; 74 uint16_t bioctets[8]; 75 76 for (size_t i = 8; i > 0; i--) { 77 size_t j = i - 1; 78 79 bioctets[j] = (data[j << 1] << 8) | data[(j << 1) + 1]; 80 81 if (bioctets[j] == 0) { 82 zeroes[j] = 1; 83 if (j < 7) 84 zeroes[j] += zeroes[j + 1]; 85 } else 86 zeroes[j] = 0; 87 } 88 89 size_t wildcard_pos = (size_t) -1; 90 size_t wildcard_size = 0; 91 92 for (size_t i = 0; i < 8; i++) { 93 if (zeroes[i] > wildcard_size) { 94 wildcard_pos = i; 95 wildcard_size = zeroes[i]; 96 } 97 } 98 99 char *cur = address; 100 size_t rest = length; 101 bool tail_zero = false; 102 int ret; 103 104 for (size_t i = 0; i < 8; i++) { 105 if ((i == wildcard_pos) && (wildcard_size > 1)) { 106 ret = snprintf(cur, rest, ":"); 107 i += wildcard_size - 1; 108 tail_zero = true; 109 } else if (i == 0) { 110 ret = snprintf(cur, rest, "%" PRIx16, bioctets[i]); 111 tail_zero = false; 112 } else { 113 ret = snprintf(cur, rest, ":%" PRIx16, bioctets[i]); 114 tail_zero = false; 115 } 116 117 if (ret < 0) 118 return EINVAL; 119 120 cur += ret; 121 rest -= ret; 122 } 123 124 if (tail_zero) { 125 ret = snprintf(cur, rest, ":"); 126 if (ret < 0) 127 return EINVAL; 128 } 129 130 return EOK; 131 } 132 47 133 /** Prints the address into the character buffer. 48 134 * 49 * @param[in] family The address family. 50 * @param[in] data The address data. 51 * @param[out] address The character buffer to be filled. 52 * @param[in] length The buffer length. 53 * @return EOK on success. 54 * @return EINVAL if the data or address parameter is NULL. 55 * @return ENOMEM if the character buffer is not long enough. 56 * @return ENOTSUP if the address family is not supported. 57 */ 58 int 59 inet_ntop(uint16_t family, const uint8_t *data, char *address, size_t length) 60 { 61 if ((!data) || (!address)) 62 return EINVAL; 63 135 * @param[in] family Address family. 136 * @param[in] data Address data. 137 * @param[out] address Character buffer to be filled. 138 * @param[in] length Buffer length. 139 * 140 * @return EOK on success. 141 * @return EINVAL if the data or address parameter is NULL. 142 * @return ENOMEM if the character buffer is not long enough. 143 * @return ENOTSUP if the address family is not supported. 144 * 145 */ 146 int inet_ntop(uint16_t family, const uint8_t *data, char *address, size_t length) 147 { 64 148 switch (family) { 65 149 case AF_INET: 66 /* Check output buffer size */ 67 if (length < INET_ADDRSTRLEN) 68 return ENOMEM; 69 70 /* Fill buffer with IPv4 address */ 71 snprintf(address, length, "%hhu.%hhu.%hhu.%hhu", 72 data[0], data[1], data[2], data[3]); 73 74 return EOK; 75 150 return inet_ntop4(data, address, length); 76 151 case AF_INET6: 77 /* Check output buffer size */ 78 if (length < INET6_ADDRSTRLEN) 79 return ENOMEM; 80 81 /* Fill buffer with IPv6 address */ 82 snprintf(address, length, 83 "%hhx%hhx:%hhx%hhx:%hhx%hhx:%hhx%hhx:%hhx%hhx:%hhx%hhx:" 84 "%hhx%hhx:%hhx%hhx", 85 data[0], data[1], data[2], data[3], data[4], data[5], 86 data[6], data[7], data[8], data[9], data[10], data[11], 87 data[12], data[13], data[14], data[15]); 88 89 return EOK; 90 152 return inet_ntop6(data, address, length); 91 153 default: 92 154 return ENOTSUP; … … 94 156 } 95 157 158 static int inet_pton4(const char *address, uint8_t *data) 159 { 160 memset(data, 0, 4); 161 162 const char *cur = address; 163 size_t i = 0; 164 165 while (i < 4) { 166 int rc = str_uint8_t(cur, &cur, 10, false, &data[i]); 167 if (rc != EOK) 168 return rc; 169 170 i++; 171 172 if (*cur == 0) 173 break; 174 175 if (*cur != '.') 176 return EINVAL; 177 178 if (i < 4) 179 cur++; 180 } 181 182 if ((i == 4) && (*cur != 0)) 183 return EINVAL; 184 185 return EOK; 186 } 187 188 static int inet_pton6(const char *address, uint8_t *data) 189 { 190 memset(data, 0, 16); 191 192 const char *cur = address; 193 size_t i = 0; 194 size_t wildcard_pos = (size_t) -1; 195 size_t wildcard_size = 0; 196 197 /* Handle initial wildcard */ 198 if ((address[0] == ':') && (address[1] == ':')) { 199 cur = address + 2; 200 wildcard_pos = 0; 201 wildcard_size = 16; 202 203 /* Handle empty address */ 204 if (*cur == 0) 205 return EOK; 206 } 207 208 while (i < 16) { 209 uint16_t bioctet; 210 int rc = str_uint16_t(cur, &cur, 16, false, &bioctet); 211 if (rc != EOK) 212 return rc; 213 214 data[i] = (bioctet >> 8) & 0xff; 215 data[i + 1] = bioctet & 0xff; 216 217 if (wildcard_pos != (size_t) -1) { 218 if (wildcard_size < 2) 219 return EINVAL; 220 221 wildcard_size -= 2; 222 } 223 224 i += 2; 225 226 if (*cur == 0) 227 break; 228 229 if (*cur != ':') 230 return EINVAL; 231 232 if (i < 16) { 233 cur++; 234 235 /* Handle wildcard */ 236 if (*cur == ':') { 237 if (wildcard_pos != (size_t) -1) 238 return EINVAL; 239 240 wildcard_pos = i; 241 wildcard_size = 16 - i; 242 cur++; 243 244 if (*cur == 0) 245 break; 246 } 247 } 248 } 249 250 if ((i == 16) && (*cur != 0)) 251 return EINVAL; 252 253 /* Create wildcard positions */ 254 if ((wildcard_pos != (size_t) -1) && (wildcard_size > 0)) { 255 size_t wildcard_shift = 16 - wildcard_size; 256 257 for (i = wildcard_pos + wildcard_shift; i > wildcard_pos; i--) { 258 size_t j = i - 1; 259 data[j + wildcard_size] = data[j]; 260 data[j] = 0; 261 } 262 } 263 264 return EOK; 265 } 266 96 267 /** Parses the character string into the address. 97 268 * 98 * If the string is shorter than the full address, zero bytes are added.99 * 100 * @param[in] family The address family.101 * @param[in] address The character buffer to be parsed.102 * @param[out] data The address data to be filled.103 * @return EOK on success.104 * @return EINVAL if the dataparameter is NULL.105 * @return ENOENT if the address parameter is NULL.106 * @return ENOTSUP if the address family is not supported.269 * @param[in] family The address family. 270 * @param[in] address The character buffer to be parsed. 271 * @param[out] data The address data to be filled. 272 * 273 * @return EOK on success. 274 * @return EINVAL if the data parameter is NULL. 275 * @return ENOENT if the address parameter is NULL. 276 * @return ENOTSUP if the address family is not supported. 277 * 107 278 */ 108 279 int inet_pton(uint16_t family, const char *address, uint8_t *data) 109 280 { 110 /** The base number of the values. */111 int base;112 /** The number of bytes per a section. */113 size_t bytes;114 /** The number of bytes of the address data. */115 int count;116 117 const char *next;118 char *last;119 int index;120 size_t shift;121 unsigned long value;122 123 if (!data)124 return EINVAL;125 126 /* Set processing parameters */127 281 switch (family) { 128 282 case AF_INET: 129 count = 4; 130 base = 10; 131 bytes = 1; 132 break; 133 283 return inet_pton4(address, data); 134 284 case AF_INET6: 135 count = 16; 136 base = 16; 137 bytes = 4; 138 break; 139 285 return inet_pton6(address, data); 140 286 default: 287 /** Unknown address family */ 141 288 return ENOTSUP; 142 289 } 143 144 /* Erase if no address */145 if (!address) {146 bzero(data, count);147 return ENOENT;148 }149 150 /* Process string from the beginning */151 next = address;152 index = 0;153 do {154 /* If the actual character is set */155 if (next && *next) {156 157 /* If not on the first character */158 if (index) {159 /* Move to the next character */160 ++next;161 }162 163 /* Parse the actual integral value */164 value = strtoul(next, &last, base);165 /*166 * Remember the last problematic character167 * should be either '.' or ':' but is ignored to be168 * more generic169 */170 next = last;171 172 /* Fill the address data byte by byte */173 shift = bytes - 1;174 do {175 /* like little endian */176 data[index + shift] = value;177 value >>= 8;178 } while(shift --);179 180 index += bytes;181 } else {182 /* Erase the rest of the address */183 bzero(data + index, count - index);184 return EOK;185 }186 } while (index < count);187 188 return EOK;189 290 } 190 291 -
uspace/lib/c/generic/net/socket_client.c
r52f1882 rdb71e2a 87 87 /** Parent module service. */ 88 88 services_t service; 89 /** Socket family */ 90 int family; 89 91 90 92 /** … … 192 194 /** Default thread for new connections. 193 195 * 194 * @param[in] iid The initial message identifier. 195 * @param[in] icall The initial message call structure. 196 * @param[in] arg Local argument. 196 * @param[in] iid The initial message identifier. 197 * @param[in] icall The initial message call structure. 198 * @param[in] arg Local argument. 199 * 197 200 */ 198 201 static void socket_connection(ipc_callid_t iid, ipc_call_t * icall, void *arg) 199 202 { 200 ipc_callid_t callid; 201 ipc_call_t call; 202 socket_t *socket; 203 int rc; 204 205 loop: 206 callid = async_get_call(&call); 207 208 switch (IPC_GET_IMETHOD(call)) { 209 case NET_SOCKET_RECEIVED: 210 case NET_SOCKET_ACCEPTED: 211 case NET_SOCKET_DATA_FRAGMENT_SIZE: 212 fibril_rwlock_read_lock(&socket_globals.lock); 213 214 /* Find the socket */ 215 socket = sockets_find(socket_get_sockets(), 216 SOCKET_GET_SOCKET_ID(call)); 217 if (!socket) { 218 rc = ENOTSOCK; 219 fibril_rwlock_read_unlock(&socket_globals.lock); 220 break; 203 while (true) { 204 ipc_call_t call; 205 ipc_callid_t callid = async_get_call(&call); 206 207 if (!IPC_GET_IMETHOD(call)) { 208 async_answer_0(callid, 0); 209 return; 221 210 } 211 212 int rc; 222 213 223 214 switch (IPC_GET_IMETHOD(call)) { 224 215 case NET_SOCKET_RECEIVED: 225 fibril_mutex_lock(&socket->receive_lock); 226 /* Push the number of received packet fragments */ 227 rc = dyn_fifo_push(&socket->received, 228 SOCKET_GET_DATA_FRAGMENTS(call), 229 SOCKET_MAX_RECEIVED_SIZE); 230 if (rc == EOK) { 231 /* Signal the received packet */ 232 fibril_condvar_signal(&socket->receive_signal); 216 case NET_SOCKET_ACCEPTED: 217 case NET_SOCKET_DATA_FRAGMENT_SIZE: 218 fibril_rwlock_read_lock(&socket_globals.lock); 219 220 /* Find the socket */ 221 socket_t *socket = sockets_find(socket_get_sockets(), 222 SOCKET_GET_SOCKET_ID(call)); 223 if (!socket) { 224 rc = ENOTSOCK; 225 fibril_rwlock_read_unlock(&socket_globals.lock); 226 break; 233 227 } 234 fibril_mutex_unlock(&socket->receive_lock); 228 229 switch (IPC_GET_IMETHOD(call)) { 230 case NET_SOCKET_RECEIVED: 231 fibril_mutex_lock(&socket->receive_lock); 232 /* Push the number of received packet fragments */ 233 rc = dyn_fifo_push(&socket->received, 234 SOCKET_GET_DATA_FRAGMENTS(call), 235 SOCKET_MAX_RECEIVED_SIZE); 236 if (rc == EOK) { 237 /* Signal the received packet */ 238 fibril_condvar_signal(&socket->receive_signal); 239 } 240 fibril_mutex_unlock(&socket->receive_lock); 241 break; 242 243 case NET_SOCKET_ACCEPTED: 244 /* Push the new socket identifier */ 245 fibril_mutex_lock(&socket->accept_lock); 246 rc = dyn_fifo_push(&socket->accepted, 1, 247 SOCKET_MAX_ACCEPTED_SIZE); 248 if (rc == EOK) { 249 /* Signal the accepted socket */ 250 fibril_condvar_signal(&socket->accept_signal); 251 } 252 fibril_mutex_unlock(&socket->accept_lock); 253 break; 254 255 default: 256 rc = ENOTSUP; 257 } 258 259 if ((SOCKET_GET_DATA_FRAGMENT_SIZE(call) > 0) && 260 (SOCKET_GET_DATA_FRAGMENT_SIZE(call) != 261 socket->data_fragment_size)) { 262 fibril_rwlock_write_lock(&socket->sending_lock); 263 264 /* Set the data fragment size */ 265 socket->data_fragment_size = 266 SOCKET_GET_DATA_FRAGMENT_SIZE(call); 267 268 fibril_rwlock_write_unlock(&socket->sending_lock); 269 } 270 271 fibril_rwlock_read_unlock(&socket_globals.lock); 235 272 break; 236 237 case NET_SOCKET_ACCEPTED: 238 /* Push the new socket identifier */ 239 fibril_mutex_lock(&socket->accept_lock); 240 rc = dyn_fifo_push(&socket->accepted, 1, 241 SOCKET_MAX_ACCEPTED_SIZE); 242 if (rc == EOK) { 243 /* Signal the accepted socket */ 244 fibril_condvar_signal(&socket->accept_signal); 245 } 246 fibril_mutex_unlock(&socket->accept_lock); 247 break; 248 273 249 274 default: 250 275 rc = ENOTSUP; 251 276 } 252 253 if ((SOCKET_GET_DATA_FRAGMENT_SIZE(call) > 0) && 254 (SOCKET_GET_DATA_FRAGMENT_SIZE(call) != 255 socket->data_fragment_size)) { 256 fibril_rwlock_write_lock(&socket->sending_lock); 257 258 /* Set the data fragment size */ 259 socket->data_fragment_size = 260 SOCKET_GET_DATA_FRAGMENT_SIZE(call); 261 262 fibril_rwlock_write_unlock(&socket->sending_lock); 263 } 264 265 fibril_rwlock_read_unlock(&socket_globals.lock); 266 break; 267 268 default: 269 rc = ENOTSUP; 270 } 271 272 async_answer_0(callid, (sysarg_t) rc); 273 goto loop; 277 278 async_answer_0(callid, (sysarg_t) rc); 279 } 274 280 } 275 281 … … 391 397 switch (domain) { 392 398 case PF_INET: 399 case PF_INET6: 393 400 switch (type) { 394 401 case SOCK_STREAM: … … 429 436 break; 430 437 431 case PF_INET6:432 438 default: 433 439 return EPFNOSUPPORT; … … 442 448 return ENOMEM; 443 449 444 bzero(socket, sizeof(*socket)); 450 memset(socket, 0, sizeof(*socket)); 451 socket->family = domain; 445 452 fibril_rwlock_write_lock(&socket_globals.lock); 446 453 … … 653 660 return ENOMEM; 654 661 } 655 bzero(new_socket, sizeof(*new_socket));662 memset(new_socket, 0, sizeof(*new_socket)); 656 663 socket_id = socket_generate_new_id(); 657 664 if (socket_id <= 0) { -
uspace/lib/c/generic/net/socket_parse.c
r52f1882 rdb71e2a 53 53 int socket_parse_address_family(const char *name, int *af) 54 54 { 55 if (str_lcmp(name, "AF_INET ", 7) == 0) {56 *af = AF_INET ;55 if (str_lcmp(name, "AF_INET6", 8) == 0) { 56 *af = AF_INET6; 57 57 return EOK; 58 58 } 59 59 60 if (str_lcmp(name, "AF_INET 6", 8) == 0) {61 *af = AF_INET 6;60 if (str_lcmp(name, "AF_INET", 7) == 0) { 61 *af = AF_INET; 62 62 return EOK; 63 63 } … … 79 79 int socket_parse_protocol_family(const char *name, int *pf) 80 80 { 81 if (str_lcmp(name, "PF_INET6", 8) == 0) { 82 *pf = PF_INET6; 83 return EOK; 84 } 85 81 86 if (str_lcmp(name, "PF_INET", 7) == 0) { 82 87 *pf = PF_INET; 83 return EOK;84 }85 86 if (str_lcmp(name, "PF_INET6", 8) == 0) {87 *pf = PF_INET6;88 88 return EOK; 89 89 } -
uspace/lib/c/generic/str.c
r52f1882 rdb71e2a 1524 1524 * 1525 1525 */ 1526 int str_uint8_t(const char *nptr, c har **endptr, unsigned int base,1526 int str_uint8_t(const char *nptr, const char **endptr, unsigned int base, 1527 1527 bool strict, uint8_t *result) 1528 1528 { … … 1571 1571 * 1572 1572 */ 1573 int str_uint16_t(const char *nptr, c har **endptr, unsigned int base,1573 int str_uint16_t(const char *nptr, const char **endptr, unsigned int base, 1574 1574 bool strict, uint16_t *result) 1575 1575 { … … 1618 1618 * 1619 1619 */ 1620 int str_uint32_t(const char *nptr, c har **endptr, unsigned int base,1620 int str_uint32_t(const char *nptr, const char **endptr, unsigned int base, 1621 1621 bool strict, uint32_t *result) 1622 1622 { … … 1665 1665 * 1666 1666 */ 1667 int str_uint64_t(const char *nptr, c har **endptr, unsigned int base,1667 int str_uint64_t(const char *nptr, const char **endptr, unsigned int base, 1668 1668 bool strict, uint64_t *result) 1669 1669 { … … 1704 1704 * 1705 1705 */ 1706 int str_size_t(const char *nptr, c har **endptr, unsigned int base,1706 int str_size_t(const char *nptr, const char **endptr, unsigned int base, 1707 1707 bool strict, size_t *result) 1708 1708 { -
uspace/lib/c/generic/tls.c
r52f1882 rdb71e2a 51 51 * @return Pointer to TCB. 52 52 */ 53 tcb_t * __make_tls(void)53 tcb_t *tls_make(void) 54 54 { 55 55 void *data; … … 57 57 size_t tls_size = &_tbss_end - &_tdata_start; 58 58 59 tcb = __alloc_tls(&data, tls_size);59 tcb = tls_alloc_arch(&data, tls_size); 60 60 if (!tcb) 61 61 return NULL; … … 74 74 } 75 75 76 void __free_tls(tcb_t *tcb)76 void tls_free(tcb_t *tcb) 77 77 { 78 78 size_t tls_size = &_tbss_end - &_tdata_start; 79 __free_tls_arch(tcb, tls_size);79 tls_free_arch(tcb, tls_size); 80 80 } 81 81
Note:
See TracChangeset
for help on using the changeset viewer.
