2 * Array management for sockets
4 * Use an array similar to a descriptor table to store information about
5 * sockets. Use functions to add, remove, find and update information.
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;
37 * Socket management array
38 * Size is assumed size of descriptor table. Socket descriptor is an array
41 #define ARRAY_SIZE 1024
42 static struct sock *sock_array[ARRAY_SIZE];
45 * Find socket in socket management array.
48 static struct sock *array_get_sock(int s)
50 if (s < 0 || s >= ARRAY_SIZE)
57 * Find socket in socket management array by address.
60 static struct sock *array_get_sock_by_address(const struct sockaddr *addr)
65 for (i = 0; i < ARRAY_SIZE; i++) {
69 if (memcmp(addr, &ptr->addr, sizeof(*addr)) == 0)
77 * Add new socket to list. Called by sw_socket "syscall".
82 struct sock *ptr = malloc(sizeof(*ptr));
93 * Bind socket to given address. Called by sw_bind "syscall".
96 int sm_update_address(int s, const struct sockaddr *addr)
100 ptr = array_get_sock(s);
104 memcpy(&ptr->addr, addr, sizeof(ptr->addr));
110 * Remove socket from list. Called by sw_close "syscall".
117 ptr = array_get_sock(s);
121 sock_array[s] = NULL;
128 * Check if a socket is bound.
131 int sm_is_bound(int s)
135 ptr = array_get_sock(s);
139 if (ptr->bind_state == STATE_BOUND)
146 * Mark socket as bound.
149 int sm_mark_bound(int s)
153 ptr = array_get_sock(s);
157 ptr->bind_state = STATE_BOUND;
163 * Mark socket as unbound.
166 int sm_mark_unbound(int s)
170 ptr = array_get_sock(s);
174 ptr->bind_state = STATE_NOTBOUND;
180 * Check if adress is asociated with a given socket.
183 int sm_address_exists(const struct sockaddr *addr)
187 ptr = array_get_sock_by_address(addr);
195 * Find socket address.
198 struct sockaddr *sm_get_address(int s)
202 ptr = array_get_sock(s);