Rev 4738 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4738 | Rev 4756 | ||
|---|---|---|---|
| Line 29... | Line 29... | ||
| 29 | /** @addtogroup socket |
29 | /** @addtogroup socket |
| 30 | * @{ |
30 | * @{ |
| 31 | */ |
31 | */ |
| 32 | 32 | ||
| 33 | /** @file |
33 | /** @file |
| 34 | * \todo |
34 | * Socket common core implementation. |
| 35 | */ |
35 | */ |
| 36 | 36 | ||
| 37 | #include "../err.h" |
37 | #include "../err.h" |
| 38 | 38 | ||
| 39 | #include "../include/in.h" |
39 | #include "../include/in.h" |
| Line 49... | Line 49... | ||
| 49 | 49 | ||
| 50 | #include "../modules.h" |
50 | #include "../modules.h" |
| 51 | 51 | ||
| 52 | #include "socket_core.h" |
52 | #include "socket_core.h" |
| 53 | 53 | ||
| 54 | /** \todo |
54 | /** Bound port sockets. |
| 55 | */ |
55 | */ |
| 56 | struct socket_port{ |
56 | struct socket_port{ |
| - | 57 | /** The bound sockets map. |
|
| - | 58 | */ |
|
| 57 | socket_port_map_t map; |
59 | socket_port_map_t map; |
| - | 60 | /** The bound sockets count. |
|
| - | 61 | */ |
|
| 58 | int count; |
62 | int count; |
| 59 | }; |
63 | }; |
| 60 | 64 | ||
| 61 | /** \todo |
65 | /** Binds the socket to the port. |
| - | 66 | * The SOCKET_MAP_KEY_LISTENING key identifier is used. |
|
| - | 67 | * @param[in] global_sockets The global sockets to be updated. |
|
| - | 68 | * @param[in] socket The socket to be added. |
|
| - | 69 | * @param[in] port The port number to be bound to. |
|
| - | 70 | * @returns EOK on success. |
|
| - | 71 | * @returns ENOMEM if there is not enough memory left. |
|
| - | 72 | * @returns Other error codes as defined for the socket_ports_add() function. |
|
| 62 | */ |
73 | */ |
| 63 | int socket_bind_insert( socket_ports_ref global_sockets, socket_core_ref socket, int port ); |
74 | int socket_bind_insert( socket_ports_ref global_sockets, socket_core_ref socket, int port ); |
| 64 | 75 | ||
| 65 | /** \todo |
76 | /** Destroys the socket. |
| - | 77 | * If the socket is bound, the port is released. |
|
| - | 78 | * Releases all buffered packets, calls the release function and removes the socket from the local sockets. |
|
| - | 79 | * @param[in] packet_phone The packet server phone to release buffered packets. |
|
| - | 80 | * @param[in] socket The socket to be destroyed. |
|
| - | 81 | * @param[in,out] local_sockets The local sockets to be updated. |
|
| - | 82 | * @param[in,out] global_sockets The global sockets to be updated. |
|
| - | 83 | * @param[in] socket_release The client release callback function. |
|
| 66 | */ |
84 | */ |
| 67 | void socket_destroy_core( int packet_phone, socket_core_ref socket, socket_cores_ref local_sockets, socket_ports_ref global_sockets, void ( * socket_release )( socket_core_ref socket )); |
85 | void socket_destroy_core( int packet_phone, socket_core_ref socket, socket_cores_ref local_sockets, socket_ports_ref global_sockets, void ( * socket_release )( socket_core_ref socket )); |
| 68 | 86 | ||
| - | 87 | /** Adds the socket to a socket port. |
|
| - | 88 | * @param[in,out] socket_port The socket port structure. |
|
| - | 89 | * @param[in] socket The socket to be added. |
|
| - | 90 | * @param[in] key The socket key identifier. |
|
| - | 91 | * @param[in] key_length The socket key length. |
|
| 69 | /** \todo |
92 | * @returns EOK on success. |
| - | 93 | * @returns ENOMEM if there is not enough memory left. |
|
| 70 | */ |
94 | */ |
| 71 | int socket_port_add_core( socket_port_ref socket_port, socket_core_ref socket, const char * key, size_t key_length ); |
95 | int socket_port_add_core( socket_port_ref socket_port, socket_core_ref socket, const char * key, size_t key_length ); |
| 72 | 96 | ||
| 73 | INT_MAP_IMPLEMENT( socket_cores, socket_core_t ); |
97 | INT_MAP_IMPLEMENT( socket_cores, socket_core_t ); |
| 74 | 98 | ||
| Line 265... | Line 289... | ||
| 265 | packet_t next_packet; |
289 | packet_t next_packet; |
| 266 | size_t fragments; |
290 | size_t fragments; |
| 267 | size_t * lengths; |
291 | size_t * lengths; |
| 268 | size_t index; |
292 | size_t index; |
| 269 | 293 | ||
| 270 | if( ! length ){ |
294 | if( ! length ) return EBADMEM; |
| 271 | return EINVAL; |
- | |
| 272 | } |
- | |
| 273 | next_packet = pq_next( packet ); |
295 | next_packet = pq_next( packet ); |
| 274 | if( ! next_packet ){ |
296 | if( ! next_packet ){ |
| 275 | // write all if only one fragment |
297 | // write all if only one fragment |
| 276 | ERROR_PROPAGATE( data_reply( packet_get_data( packet ), packet_get_data_length( packet ))); |
298 | ERROR_PROPAGATE( data_reply( packet_get_data( packet ), packet_get_data_length( packet ))); |
| 277 | // store the total length |
299 | // store the total length |