Changeset 8fb1bf82 in mainline for uspace/lib/net/tl/socket_core.c
- Timestamp:
- 2010-11-25T13:42:50Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 8df8415
- Parents:
- a93d79a (diff), eb667613 (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 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/net/tl/socket_core.c
ra93d79a r8fb1bf82 48 48 #include <stdlib.h> 49 49 #include <errno.h> 50 #include <err.h>51 50 52 51 #include <adt/dynamic_fifo.h> … … 69 68 INT_MAP_IMPLEMENT(socket_cores, socket_core_t); 70 69 71 GENERIC_CHAR_MAP_IMPLEMENT(socket_port_map, socket_core_ ref);70 GENERIC_CHAR_MAP_IMPLEMENT(socket_port_map, socket_core_t *); 72 71 73 72 INT_MAP_IMPLEMENT(socket_ports, socket_port_t); … … 86 85 */ 87 86 static void 88 socket_destroy_core(int packet_phone, socket_core_ refsocket,89 socket_cores_ ref local_sockets, socket_ports_refglobal_sockets,90 void (* socket_release)(socket_core_ refsocket))87 socket_destroy_core(int packet_phone, socket_core_t *socket, 88 socket_cores_t *local_sockets, socket_ports_t *global_sockets, 89 void (* socket_release)(socket_core_t *socket)) 91 90 { 92 91 int packet_id; … … 122 121 */ 123 122 void 124 socket_cores_release(int packet_phone, socket_cores_ reflocal_sockets,125 socket_ports_ refglobal_sockets,126 void (* socket_release)(socket_core_ refsocket))123 socket_cores_release(int packet_phone, socket_cores_t *local_sockets, 124 socket_ports_t *global_sockets, 125 void (* socket_release)(socket_core_t *socket)) 127 126 { 128 127 int index; … … 157 156 * @param[in] key The socket key identifier. 158 157 * @param[in] key_length The socket key length. 159 * @return sEOK on success.160 * @return sENOMEM if there is not enough memory left.158 * @return EOK on success. 159 * @return ENOMEM if there is not enough memory left. 161 160 */ 162 161 static int 163 socket_port_add_core(socket_port_ ref socket_port, socket_core_refsocket,162 socket_port_add_core(socket_port_t *socket_port, socket_core_t *socket, 164 163 const char *key, size_t key_length) 165 164 { 166 ERROR_DECLARE; 167 168 socket_core_ref *socket_ref; 165 socket_core_t **socket_ref; 166 int rc; 169 167 170 168 // create a wrapper … … 175 173 *socket_ref = socket; 176 174 // add the wrapper 177 if (ERROR_OCCURRED(socket_port_map_add(&socket_port->map, key, 178 key_length, socket_ref))) { 175 rc = socket_port_map_add(&socket_port->map, key, key_length, 176 socket_ref); 177 if (rc != EOK) { 179 178 free(socket_ref); 180 return ERROR_CODE;179 return rc; 181 180 } 182 181 … … 195 194 * @param[in] socket The socket to be added. 196 195 * @param[in] port The port number to be bound to. 197 * @return sEOK on success.198 * @return sENOMEM if there is not enough memory left.199 * @return sOther error codes as defined for the196 * @return EOK on success. 197 * @return ENOMEM if there is not enough memory left. 198 * @return Other error codes as defined for the 200 199 * socket_ports_add() function. 201 200 */ 202 201 static int 203 socket_bind_insert(socket_ports_ ref global_sockets, socket_core_refsocket,202 socket_bind_insert(socket_ports_t *global_sockets, socket_core_t *socket, 204 203 int port) 205 204 { 206 ERROR_DECLARE; 207 208 socket_port_ref socket_port; 205 socket_port_t *socket_port; 206 int rc; 209 207 210 208 // create a wrapper … … 214 212 215 213 socket_port->count = 0; 216 if (ERROR_OCCURRED(socket_port_map_initialize(&socket_port->map)) || 217 ERROR_OCCURRED(socket_port_add_core(socket_port, socket, 218 SOCKET_MAP_KEY_LISTENING, 0))) { 219 socket_port_map_destroy(&socket_port->map); 220 free(socket_port); 221 return ERROR_CODE; 222 } 214 rc = socket_port_map_initialize(&socket_port->map); 215 if (rc != EOK) 216 goto fail; 217 218 rc = socket_port_add_core(socket_port, socket, SOCKET_MAP_KEY_LISTENING, 219 0); 220 if (rc != EOK) 221 goto fail; 223 222 224 223 // register the incomming port 225 ERROR_CODE = socket_ports_add(global_sockets, port, socket_port); 226 if (ERROR_CODE < 0) { 227 socket_port_map_destroy(&socket_port->map); 228 free(socket_port); 229 return ERROR_CODE; 230 } 224 rc = socket_ports_add(global_sockets, port, socket_port); 225 if (rc < 0) 226 goto fail; 231 227 232 228 socket->port = port; 233 229 return EOK; 230 231 fail: 232 socket_port_map_destroy(&socket_port->map); 233 free(socket_port); 234 return rc; 235 234 236 } 235 237 … … 246 248 * @param[in] free_ports_end The maximum free port. 247 249 * @param[in] last_used_port The last used free port. 248 * @return sEOK on success.249 * @return sENOTSOCK if the socket was not found.250 * @return sEAFNOSUPPORT if the address family is not supported.251 * @return sEADDRINUSE if the port is already in use.252 * @return sOther error codes as defined for the250 * @return EOK on success. 251 * @return ENOTSOCK if the socket was not found. 252 * @return EAFNOSUPPORT if the address family is not supported. 253 * @return EADDRINUSE if the port is already in use. 254 * @return Other error codes as defined for the 253 255 * socket_bind_free_port() function. 254 * @return sOther error codes as defined for the256 * @return Other error codes as defined for the 255 257 * socket_bind_insert() function. 256 258 */ 257 259 int 258 socket_bind(socket_cores_ ref local_sockets, socket_ports_refglobal_sockets,260 socket_bind(socket_cores_t *local_sockets, socket_ports_t *global_sockets, 259 261 int socket_id, void *addr, size_t addrlen, int free_ports_start, 260 262 int free_ports_end, int last_used_port) 261 263 { 262 socket_core_ refsocket;263 socket_port_ refsocket_port;264 socket_core_t *socket; 265 socket_port_t *socket_port; 264 266 struct sockaddr *address; 265 267 struct sockaddr_in *address_in; … … 320 322 * @param[in] free_ports_end The maximum free port. 321 323 * @param[in] last_used_port The last used free port. 322 * @return sEOK on success.323 * @return sENOTCONN if no free port was found.324 * @return sOther error codes as defined for the324 * @return EOK on success. 325 * @return ENOTCONN if no free port was found. 326 * @return Other error codes as defined for the 325 327 * socket_bind_insert() function. 326 328 */ 327 329 int 328 socket_bind_free_port(socket_ports_ ref global_sockets, socket_core_refsocket,330 socket_bind_free_port(socket_ports_t *global_sockets, socket_core_t *socket, 329 331 int free_ports_start, int free_ports_end, int last_used_port) 330 332 { … … 365 367 * requested. A negative identifier is requested if set to 366 368 * false. 367 * @return sThe new socket identifier.368 * @return sELIMIT if there is no socket identifier available.369 */ 370 static int socket_generate_new_id(socket_cores_ reflocal_sockets, int positive)369 * @return The new socket identifier. 370 * @return ELIMIT if there is no socket identifier available. 371 */ 372 static int socket_generate_new_id(socket_cores_t *local_sockets, int positive) 371 373 { 372 374 int socket_id; … … 408 410 * chosen if set to zero or negative. A negative identifier 409 411 * is chosen if set to negative. 410 * @return sEOK on success.411 * @return sEINVAL if the socket_id parameter is NULL.412 * @return sENOMEM if there is not enough memory left.412 * @return EOK on success. 413 * @return EINVAL if the socket_id parameter is NULL. 414 * @return ENOMEM if there is not enough memory left. 413 415 */ 414 416 int 415 socket_create(socket_cores_ reflocal_sockets, int app_phone,417 socket_create(socket_cores_t *local_sockets, int app_phone, 416 418 void *specific_data, int *socket_id) 417 419 { 418 ERROR_DECLARE; 419 420 socket_core_ref socket; 421 int res; 420 socket_core_t *socket; 422 421 int positive; 422 int rc; 423 423 424 424 if (!socket_id) … … 437 437 } 438 438 439 socket = (socket_core_ ref) malloc(sizeof(*socket));439 socket = (socket_core_t *) malloc(sizeof(*socket)); 440 440 if (!socket) 441 441 return ENOMEM; … … 447 447 socket->key_length = 0; 448 448 socket->specific_data = specific_data; 449 if (ERROR_OCCURRED(dyn_fifo_initialize(&socket->received,450 SOCKET_INITIAL_RECEIVED_SIZE))) {449 rc = dyn_fifo_initialize(&socket->received, SOCKET_INITIAL_RECEIVED_SIZE); 450 if (rc != EOK) { 451 451 free(socket); 452 return ERROR_CODE; 453 } 454 if (ERROR_OCCURRED(dyn_fifo_initialize(&socket->accepted, 455 SOCKET_INITIAL_ACCEPTED_SIZE))) { 452 return rc; 453 } 454 455 rc = dyn_fifo_initialize(&socket->accepted, SOCKET_INITIAL_ACCEPTED_SIZE); 456 if (rc != EOK) { 456 457 dyn_fifo_destroy(&socket->received); 457 458 free(socket); 458 return ERROR_CODE;459 return rc; 459 460 } 460 461 socket->socket_id = *socket_id; 461 r es= socket_cores_add(local_sockets, socket->socket_id, socket);462 if (r es< 0) {462 rc = socket_cores_add(local_sockets, socket->socket_id, socket); 463 if (rc < 0) { 463 464 dyn_fifo_destroy(&socket->received); 464 465 dyn_fifo_destroy(&socket->accepted); 465 466 free(socket); 466 return r es;467 return rc; 467 468 } 468 469 … … 481 482 * @param[in,out] global_sockets The global sockets to be updated. 482 483 * @param[in] socket_release The client release callback function. 483 * @return sEOK on success.484 * @return sENOTSOCK if the socket is not found.484 * @return EOK on success. 485 * @return ENOTSOCK if the socket is not found. 485 486 */ 486 487 int 487 socket_destroy(int packet_phone, int socket_id, socket_cores_ reflocal_sockets,488 socket_ports_ refglobal_sockets,489 void (*socket_release)(socket_core_ refsocket))490 { 491 socket_core_ refsocket;488 socket_destroy(int packet_phone, int socket_id, socket_cores_t *local_sockets, 489 socket_ports_t *global_sockets, 490 void (*socket_release)(socket_core_t *socket)) 491 { 492 socket_core_t *socket; 492 493 int accepted_id; 493 494 … … 515 516 * @param[in] packet The packet to be transfered. 516 517 * @param[out] length The total data length. 517 * @return sEOK on success.518 * @return sEBADMEM if the length parameter is NULL.519 * @return sENOMEM if there is not enough memory left.520 * @return sOther error codes as defined for the data_reply()518 * @return EOK on success. 519 * @return EBADMEM if the length parameter is NULL. 520 * @return ENOMEM if there is not enough memory left. 521 * @return Other error codes as defined for the data_reply() 521 522 * function. 522 523 */ 523 int socket_reply_packets(packet_t packet, size_t *length) 524 { 525 ERROR_DECLARE; 526 527 packet_t next_packet; 524 int socket_reply_packets(packet_t *packet, size_t *length) 525 { 526 packet_t *next_packet; 528 527 size_t fragments; 529 528 size_t *lengths; 530 529 size_t index; 530 int rc; 531 531 532 532 if (!length) … … 536 536 if (!next_packet) { 537 537 // write all if only one fragment 538 ERROR_PROPAGATE(data_reply(packet_get_data(packet), 539 packet_get_data_length(packet))); 538 rc = data_reply(packet_get_data(packet), 539 packet_get_data_length(packet)); 540 if (rc != EOK) 541 return rc; 540 542 // store the total length 541 543 *length = packet_get_data_length(packet); … … 564 566 565 567 // write the fragment lengths 566 if (ERROR_OCCURRED(data_reply(lengths,567 sizeof(int) * (fragments + 1)))) {568 rc = data_reply(lengths, sizeof(int) * (fragments + 1)); 569 if (rc != EOK) { 568 570 free(lengths); 569 return ERROR_CODE;571 return rc; 570 572 } 571 573 next_packet = packet; … … 573 575 // write the fragments 574 576 for (index = 0; index < fragments; ++index) { 575 ERROR_CODE= data_reply(packet_get_data(next_packet),577 rc = data_reply(packet_get_data(next_packet), 576 578 lengths[index]); 577 if ( ERROR_OCCURRED(ERROR_CODE)) {579 if (rc != EOK) { 578 580 free(lengths); 579 return ERROR_CODE;581 return rc; 580 582 } 581 583 next_packet = pq_next(next_packet); … … 596 598 * @param[in] key The socket key identifier. 597 599 * @param[in] key_length The socket key length. 598 * @return sThe found socket.599 * @return sNULL if no socket was found.600 */ 601 socket_core_ ref602 socket_port_find(socket_ports_ refglobal_sockets, int port, const char *key,600 * @return The found socket. 601 * @return NULL if no socket was found. 602 */ 603 socket_core_t * 604 socket_port_find(socket_ports_t *global_sockets, int port, const char *key, 603 605 size_t key_length) 604 606 { 605 socket_port_ refsocket_port;606 socket_core_ ref*socket_ref;607 socket_port_t *socket_port; 608 socket_core_t **socket_ref; 607 609 608 610 socket_port = socket_ports_find(global_sockets, port); … … 626 628 */ 627 629 void 628 socket_port_release(socket_ports_ ref global_sockets, socket_core_refsocket)629 { 630 socket_port_ refsocket_port;631 socket_core_ ref*socket_ref;630 socket_port_release(socket_ports_t *global_sockets, socket_core_t *socket) 631 { 632 socket_port_t *socket_port; 633 socket_core_t **socket_ref; 632 634 633 635 if (!socket->port) … … 671 673 * @param[in] key The socket key identifier. 672 674 * @param[in] key_length The socket key length. 673 * @return sEOK on success.674 * @return sENOENT if the port is not already used.675 * @return sOther error codes as defined for the675 * @return EOK on success. 676 * @return ENOENT if the port is not already used. 677 * @return Other error codes as defined for the 676 678 * socket_port_add_core() function. 677 679 */ 678 680 int 679 socket_port_add(socket_ports_ref global_sockets, int port, 680 socket_core_ref socket, const char *key, size_t key_length) 681 { 682 ERROR_DECLARE; 683 684 socket_port_ref socket_port; 681 socket_port_add(socket_ports_t *global_sockets, int port, 682 socket_core_t *socket, const char *key, size_t key_length) 683 { 684 socket_port_t *socket_port; 685 int rc; 685 686 686 687 // find ports … … 690 691 691 692 // add the socket 692 ERROR_PROPAGATE(socket_port_add_core(socket_port, socket, key, 693 key_length)); 693 rc = socket_port_add_core(socket_port, socket, key, key_length); 694 if (rc != EOK) 695 return rc; 694 696 695 697 socket->port = port;
Note:
See TracChangeset
for help on using the changeset viewer.