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 "swift_list.h"
25 * Add new socket to list. Called by sw_socket "syscall".
28 struct sock_list *list_add_socket(int s)
30 struct sock_list *ptr = malloc(sizeof(*ptr));
34 ptr->next = &sock_list_head;
35 ptr->prev = sock_list_head.prev;
36 sock_list_head.prev->next = ptr;
37 sock_list_head.prev = ptr;
44 * Bind socket to given address. Called by sw_bind "syscall".
47 struct sock_list *list_update_socket_address(int s, __CONST_SOCKADDR_ARG addr)
49 struct sock_list *ptr;
51 for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next)
53 memcpy(&ptr->addr, addr, sizeof(ptr->addr));
54 ptr->bind_state = STATE_BOUND;
62 * Get list element containing socket s. Called by sw_send* "syscalls".
65 struct sock_list *list_elem_from_socket(int s)
67 struct sock_list *ptr;
69 for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next)
77 * Get list element containing address addr. Called by sw_bind "syscall".
80 struct sock_list *list_elem_from_address(__CONST_SOCKADDR_ARG addr)
82 struct sock_list *ptr;
84 for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next) {
85 dprintf("socket address to be checked\n");
86 if (ptr->bind_state == STATE_NOTBOUND)
88 dprintf("bound socket address to be checked\n");
89 if (memcmp(&ptr->addr, addr, sizeof(addr)) == 0)
97 * Unlink socket from list. Called by list_remove_socket.
99 static struct sock_list *list_unlink_socket(int s)
101 struct sock_list *ptr;
103 for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next)
105 ptr->next->prev = ptr->prev;
106 ptr->prev->next = ptr->next;
116 * Remove socket from list. Called by sw_close "syscall".
119 int list_remove_socket(int s)
121 struct sock_list *ptr;
123 ptr = list_unlink_socket(s);
132 * Check if a socket is bound.
134 int list_socket_is_bound(int s)
136 struct sock_list *ptr;
138 for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next)
140 if (ptr->bind_state == STATE_BOUND)