2 * Linked list management for sockets
4 * Use sock_list structure to store information about sockets. Use functions
5 * to add, remove, find and update information in list.
7 * 2011, Razvan Deaconescu, razvan.deaconescu@cs.pub.ro
13 #include <sys/types.h>
14 #include <sys/socket.h>
15 #include <netinet/in.h>
19 #include "swift_types.h"
20 #include "socket_manager.h"
24 enum sock_bind_state {
29 /* socket management structure */
33 enum sock_bind_state bind_state;
34 struct sock_list *next;
35 struct sock_list *prev;
38 /* socket management list head */
39 static struct sock_list sock_list_head = {
40 .next = &sock_list_head,
41 .prev = &sock_list_head
45 * Find socket in socket management list.
48 static struct sock_list *list_get_link(int s)
50 struct sock_list *ptr;
52 for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next)
60 * Find socket in socket management list by address.
63 static struct sock_list *list_get_link_by_address(const struct sockaddr *addr)
65 struct sock_list *ptr;
67 for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next)
68 if (memcmp(addr, &ptr->addr, sizeof(*addr)) == 0)
75 * Unlink socket from list. Called by sm_del.
78 static void list_unlink(struct sock_list *ptr)
80 ptr->next->prev = ptr->prev;
81 ptr->prev->next = ptr->next;
87 * Link socket to list. Add socket to tail of list.
90 static void list_link(struct sock_list *ptr)
92 ptr->next = &sock_list_head;
93 ptr->prev = sock_list_head.prev;
94 sock_list_head.prev->next = ptr;
95 sock_list_head.prev = ptr;
99 * Add new socket to list. Called by sw_socket "syscall".
104 struct sock_list *ptr = malloc(sizeof(*ptr));
115 * Bind socket to given address. Called by sw_bind "syscall".
118 int sm_update_address(int s, const struct sockaddr *addr)
120 struct sock_list *ptr;
122 ptr = list_get_link(s);
126 memcpy(&ptr->addr, addr, sizeof(ptr->addr));
132 * Remove socket from list. Called by sw_close "syscall".
137 struct sock_list *ptr;
139 ptr = list_get_link(s);
150 * Check if a socket is bound.
153 int sm_is_bound(int s)
155 struct sock_list *ptr;
157 ptr = list_get_link(s);
161 if (ptr->bind_state == STATE_BOUND)
168 * Mark socket as bound.
171 int sm_mark_bound(int s)
173 struct sock_list *ptr;
175 ptr = list_get_link(s);
179 ptr->bind_state = STATE_BOUND;
185 * Mark socket as unbound.
188 int sm_mark_unbound(int s)
190 struct sock_list *ptr;
192 ptr = list_get_link(s);
196 ptr->bind_state = STATE_NOTBOUND;
202 * Check if adress is asociated with a given socket.
205 int sm_address_exists(const struct sockaddr *addr)
207 struct sock_list *ptr;
209 ptr = list_get_link_by_address(addr);
217 * Find socket address.
220 struct sockaddr *sm_get_address(int s)
222 struct sock_list *ptr;
224 ptr = list_get_link(s);