From: Razvan Deaconescu Date: Thu, 19 May 2011 17:54:39 +0000 (+0300) Subject: Add list management for raw sockets. X-Git-Url: http://p2p-next.cs.pub.ro/gitweb/?a=commitdiff_plain;h=9e99d130cf220bd3379840912c7083ee2b3dd9d1;p=swifty.git Add list management for raw sockets. --- diff --git a/src/raw/swift_raw.c b/src/raw/swift_raw.c index e88a973..7a5da0d 100644 --- a/src/raw/swift_raw.c +++ b/src/raw/swift_raw.c @@ -20,20 +20,77 @@ #include #include +#include "swift_types.h" #include "swift_raw.h" +/* socket management structure */ +struct sock_list { + int s; + struct sockaddr_sw addr; + struct sock_list *next; + struct sock_list *prev; +}; + +static struct sock_list sock_list_head = { + .next = &sock_list_head, + .prev = &sock_list_head +}; + +static struct sock_list *list_add_socket(int s) +{ + struct sock_list *ptr = malloc(sizeof(*ptr)); + if (ptr == NULL) + return NULL; + + ptr->next = &sock_list_head; + ptr->prev = sock_list_head.prev; + sock_list_head.prev->next = ptr; + sock_list_head.prev = ptr; + + return ptr; +} + +static struct sock_list *list_update_socket_address(int s, struct sockaddr_sw *addr) +{ + struct sock_list *ptr; + + for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next) + if (ptr->s == s) { + memcpy(&ptr->addr, addr, sizeof(ptr->addr)); + return ptr; + } + + return NULL; +} + +static struct sock_list *list_unlink_socket(int s) +{ + struct sock_list *ptr; + + for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next) + if (ptr->s == s) { + ptr->next->prev = ptr->prev; + ptr->prev->next = ptr->next; + ptr->next = ptr; + ptr->prev = ptr; + return ptr; + } + + return NULL; +} + /* * Create a new socket of type TYPE in domain DOMAIN, using * protocol PROTOCOL. If PROTOCOL is zero, one is chosen automatically. * Returns a file descriptor for the new socket, or -1 for errors. * - * swift: protocol is IPPROTO_SWIFT. + * swift: PROTOCOL is IPPROTO_SWIFT. Ignore TYPE. */ int sw_socket (int __domain, int __type, int __protocol) { int s; - /* TODO */ + s = socket(__domain, SOCK_RAW, IPPROTO_SWIFT); return s; }