Changeset 6843a9c in mainline for uspace/lib/net/tl/socket_core.c
- Timestamp:
- 2012-06-29T13:02:14Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 722912e
- Parents:
- ba72f2b (diff), 0bbd13e (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/net/tl/socket_core.c
rba72f2b r6843a9c 36 36 37 37 #include <socket_core.h> 38 #include <packet_client.h>39 #include <packet_remote.h>40 38 #include <net/socket_codes.h> 41 39 #include <net/in.h> 42 40 #include <net/inet.h> 43 #include <net/packet.h>44 #include <net/modules.h>45 41 #include <stdint.h> 46 42 #include <stdlib.h> … … 92 88 } 93 89 94 /* Release all received packets */95 int packet_id;96 while ((packet_id = dyn_fifo_pop(&socket->received)) >= 0)97 pq_release_remote(sess, packet_id);98 99 dyn_fifo_destroy(&socket->received);100 90 dyn_fifo_destroy(&socket->accepted); 101 91 … … 448 438 socket->key_length = 0; 449 439 socket->specific_data = specific_data; 450 rc = dyn_fifo_initialize(&socket->received, SOCKET_INITIAL_RECEIVED_SIZE); 440 441 rc = dyn_fifo_initialize(&socket->accepted, SOCKET_INITIAL_ACCEPTED_SIZE); 451 442 if (rc != EOK) { 452 443 free(socket); 453 444 return rc; 454 445 } 455 456 rc = dyn_fifo_initialize(&socket->accepted, SOCKET_INITIAL_ACCEPTED_SIZE);457 if (rc != EOK) {458 dyn_fifo_destroy(&socket->received);459 free(socket);460 return rc;461 }462 446 socket->socket_id = *socket_id; 463 447 rc = socket_cores_add(local_sockets, socket->socket_id, socket); 464 448 if (rc < 0) { 465 dyn_fifo_destroy(&socket->received);466 449 dyn_fifo_destroy(&socket->accepted); 467 450 free(socket); … … 506 489 socket_destroy_core(sess, socket, local_sockets, global_sockets, 507 490 socket_release); 508 509 return EOK;510 }511 512 /** Replies the packet or the packet queue data to the application via the513 * socket.514 *515 * Uses the current message processing fibril.516 *517 * @param[in] packet The packet to be transfered.518 * @param[out] length The total data length.519 * @return EOK on success.520 * @return EBADMEM if the length parameter is NULL.521 * @return ENOMEM if there is not enough memory left.522 * @return Other error codes as defined for the data_reply()523 * function.524 */525 int socket_reply_packets(packet_t *packet, size_t *length)526 {527 packet_t *next_packet;528 size_t fragments;529 size_t *lengths;530 size_t index;531 int rc;532 533 if (!length)534 return EBADMEM;535 536 next_packet = pq_next(packet);537 if (!next_packet) {538 /* Write all if only one fragment */539 rc = data_reply(packet_get_data(packet),540 packet_get_data_length(packet));541 if (rc != EOK)542 return rc;543 /* Store the total length */544 *length = packet_get_data_length(packet);545 } else {546 /* Count the packet fragments */547 fragments = 1;548 next_packet = pq_next(packet);549 while ((next_packet = pq_next(next_packet)))550 ++fragments;551 552 /* Compute and store the fragment lengths */553 lengths = (size_t *) malloc(sizeof(size_t) * fragments +554 sizeof(size_t));555 if (!lengths)556 return ENOMEM;557 558 lengths[0] = packet_get_data_length(packet);559 lengths[fragments] = lengths[0];560 next_packet = pq_next(packet);561 562 for (index = 1; index < fragments; ++index) {563 lengths[index] = packet_get_data_length(next_packet);564 lengths[fragments] += lengths[index];565 next_packet = pq_next(packet);566 }567 568 /* Write the fragment lengths */569 rc = data_reply(lengths, sizeof(int) * (fragments + 1));570 if (rc != EOK) {571 free(lengths);572 return rc;573 }574 next_packet = packet;575 576 /* Write the fragments */577 for (index = 0; index < fragments; ++index) {578 rc = data_reply(packet_get_data(next_packet),579 lengths[index]);580 if (rc != EOK) {581 free(lengths);582 return rc;583 }584 next_packet = pq_next(next_packet);585 }586 587 /* Store the total length */588 *length = lengths[fragments];589 free(lengths);590 }591 491 592 492 return EOK;
Note:
See TracChangeset
for help on using the changeset viewer.