diff options
| author | mikeos <mike.osipov@gmail.com> | 2012-12-06 22:36:45 +0400 |
|---|---|---|
| committer | mikeos <mike.osipov@gmail.com> | 2012-12-06 22:36:45 +0400 |
| commit | dc34d7710cac12ccf7b6d1b0fc852cbbac76bf31 (patch) | |
| tree | f47271d2b7da0fad1a421ab8ea322265430f2cac | |
| parent | 346d3137798b5284ecbd9fd6e6b0fb14ebe6fa73 (diff) | |
using lists from sys/queue.h
| -rw-r--r-- | list.h | 248 | ||||
| -rw-r--r-- | main.c | 42 |
2 files changed, 25 insertions, 265 deletions
@@ -1,248 +0,0 @@ -#ifndef _LINUX_LIST_H -#define _LINUX_LIST_H - -/* - * Simple doubly linked list implementation. - * - * Some of the internal functions ("__xxx") are useful when - * manipulating whole lists rather than single entries, as - * sometimes we already know the next/prev entries and we can - * generate better code by using them directly rather than - * using the generic single-entry routines. - */ - -struct list_head { - struct list_head *next, *prev; -}; - -#define LIST_HEAD_INIT(name) { &(name), &(name) } - -#define LIST_HEAD(name) \ - struct list_head name = LIST_HEAD_INIT(name) - -#define INIT_LIST_HEAD(ptr) do { \ - (ptr)->next = (ptr); (ptr)->prev = (ptr); \ -} while (0) - -/* - * Insert a new entry between two known consecutive entries. - * - * This is only for internal list manipulation where we know - * the prev/next entries already! - */ -static inline void __list_add(struct list_head *new, - struct list_head *prev, - struct list_head *next) -{ - next->prev = new; - new->next = next; - new->prev = prev; - prev->next = new; -} - -/** - * list_add - add a new entry - * @new: new entry to be added - * @head: list head to add it after - * - * Insert a new entry after the specified head. - * This is good for implementing stacks. - */ -static inline void list_add(struct list_head *new, struct list_head *head) -{ - __list_add(new, head, head->next); -} - -/** - * list_add_tail - add a new entry - * @new: new entry to be added - * @head: list head to add it before - * - * Insert a new entry before the specified head. - * This is useful for implementing queues. - */ -static inline void list_add_tail(struct list_head *new, struct list_head *head) -{ - __list_add(new, head->prev, head); -} - -/* - * Delete a list entry by making the prev/next entries - * point to each other. - * - * This is only for internal list manipulation where we know - * the prev/next entries already! - */ -static inline void __list_del(struct list_head *prev, struct list_head *next) -{ - next->prev = prev; - prev->next = next; -} - -/** - * list_del - deletes entry from list. - * @entry: the element to delete from the list. - * Note: list_empty on entry does not return true after this, the entry is in an undefined state. - */ -static inline void list_del(struct list_head *entry) -{ - __list_del(entry->prev, entry->next); - entry->next = (void *) 0; - entry->prev = (void *) 0; -} - -/** - * list_del_init - deletes entry from list and reinitialize it. - * @entry: the element to delete from the list. - */ -static inline void list_del_init(struct list_head *entry) -{ - __list_del(entry->prev, entry->next); - INIT_LIST_HEAD(entry); -} - -/** - * list_move - delete from one list and add as another's head - * @list: the entry to move - * @head: the head that will precede our entry - */ -static inline void list_move(struct list_head *list, struct list_head *head) -{ - __list_del(list->prev, list->next); - list_add(list, head); -} - -/** - * list_move_tail - delete from one list and add as another's tail - * @list: the entry to move - * @head: the head that will follow our entry - */ -static inline void list_move_tail(struct list_head *list, - struct list_head *head) -{ - __list_del(list->prev, list->next); - list_add_tail(list, head); -} - -/** - * list_empty - tests whether a list is empty - * @head: the list to test. - */ -static inline int list_empty(struct list_head *head) -{ - return head->next == head; -} - -static inline void __list_splice(struct list_head *list, - struct list_head *head) -{ - struct list_head *first = list->next; - struct list_head *last = list->prev; - struct list_head *at = head->next; - - first->prev = head; - head->next = first; - - last->next = at; - at->prev = last; -} - -/** - * list_splice - join two lists - * @list: the new list to add. - * @head: the place to add it in the first list. - */ -static inline void list_splice(struct list_head *list, struct list_head *head) -{ - if (!list_empty(list)) - __list_splice(list, head); -} - -/** - * list_splice_init - join two lists and reinitialise the emptied list. - * @list: the new list to add. - * @head: the place to add it in the first list. - * - * The list at @list is reinitialised - */ -static inline void list_splice_init(struct list_head *list, - struct list_head *head) -{ - if (!list_empty(list)) { - __list_splice(list, head); - INIT_LIST_HEAD(list); - } -} - -/** - * list_entry - get the struct for this entry - * @ptr: the &struct list_head pointer. - * @type: the type of the struct this is embedded in. - * @member: the name of the list_struct within the struct. - */ -#define list_entry(ptr, type, member) \ - ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) - -/** - * list_for_each - iterate over a list - * @pos: the &struct list_head to use as a loop counter. - * @head: the head for your list. - */ -#define list_for_each(pos, head) \ - for (pos = (head)->next; pos != (head); pos = pos->next) - -/** - * list_for_each_prev - iterate over a list backwards - * @pos: the &struct list_head to use as a loop counter. - * @head: the head for your list. - */ -#define list_for_each_prev(pos, head) \ - for (pos = (head)->prev; pos != (head); pos = pos->prev) - -/** - * list_for_each_safe - iterate over a list safe against removal of list entry - * @pos: the &struct list_head to use as a loop counter. - * @n: another &struct list_head to use as temporary storage - * @head: the head for your list. - */ -#define list_for_each_safe(pos, n, head) \ - for (pos = (head)->next, n = pos->next; pos != (head); \ - pos = n, n = pos->next) - -/** - * list_for_each_entry - iterate over list of given type - * @pos: the type * to use as a loop counter. - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - */ -#define list_for_each_entry(pos, head, member) \ - for (pos = list_entry((head)->next, typeof(*pos), member); \ - &pos->member != (head); \ - pos = list_entry(pos->member.next, typeof(*pos), member)) - -/** - * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry - * @pos: the type * to use as a loop counter. - * @n: another type * to use as temporary storage - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - */ -#define list_for_each_entry_safe(pos, n, head, member) \ - for (pos = list_entry((head)->next, typeof(*pos), member), \ - n = list_entry(pos->member.next, typeof(*pos), member); \ - &pos->member != (head); \ - pos = n, n = list_entry(n->member.next, typeof(*n), member)) - -/** - * list_for_each_entry_continue - iterate over list of given type - * continuing after existing point - * @pos: the type * to use as a loop counter. - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - */ -#define list_for_each_entry_continue(pos, head, member) \ - for (pos = list_entry(pos->member.next, typeof(*pos), member); \ - &pos->member != (head); \ - pos = list_entry(pos->member.next, typeof(*pos), member)) - -#endif @@ -1,6 +1,7 @@ #include <sys/types.h> #include <sys/socket.h> #include <sys/select.h> +#include <sys/queue.h> #include <sys/wait.h> #include <sys/un.h> @@ -20,14 +21,19 @@ #include "buffer.h" #include "debug.h" #include "xwrap.h" -#include "list.h" #include "data.h" +#define LIST_FOREACH_SAFE(var, tmp, head, field) \ + for ( (var) = LIST_FIRST(head), (tmp) = LIST_NEXT(var, field); \ + (var); \ + (var) = (tmp), (tmp) = (var) ? LIST_NEXT(var, field) : NULL) + #define NELEM(p) (sizeof(p) / sizeof(p[0])) #define BUFSIZE 0x1000 -static struct list_head channels; -static struct list_head servers; +LIST_HEAD(channel_list, channel) channels; +SLIST_HEAD(server_list, server) servers; + static int die_childs; static pid_t main_pid; @@ -36,7 +42,8 @@ struct server { char *remote_addr; struct sockaddr_in remote_sa; int nchannel; - struct list_head serv_list; + + SLIST_ENTRY(server) entries; }; struct channel { @@ -47,7 +54,8 @@ struct channel { int connected; char *addr; struct server *server; - struct list_head chan_list; + + LIST_ENTRY(channel) entries; }; static inline int max(int a, int b) @@ -125,13 +133,13 @@ int main(int argc, char *argv[]) main_pid = getpid(); atexit(on_quit); - INIT_LIST_HEAD(&servers); + SLIST_INIT(&servers); setservent(1); read_config_file(argv[1]); endservent(); - INIT_LIST_HEAD(&channels); + LIST_INIT(&channels); init_handlers(); endless_loop(unix_sock); @@ -228,8 +236,8 @@ static struct channel *chan_new(struct server *s, char *addr, int fd1, int fd2) p->addr = addr; p->connected = 0; p->server = s; - INIT_LIST_HEAD(&p->chan_list); - list_add(&p->chan_list, &channels); + + LIST_INSERT_HEAD(&channels, p, entries); s->nchannel++; @@ -249,7 +257,7 @@ static void chan_free(struct channel *chan) shut(&chan->fd2); free(chan->addr); - list_del(&chan->chan_list); + LIST_REMOVE(chan, entries); free(chan); s->nchannel--; @@ -270,8 +278,7 @@ static void serv_add_new(char *local_port, char *host, char *port) makeaddr(&sa, "0.0.0.0", local_port); s->sock = tcp_server((struct sockaddr *) &sa, sizeof(sa)); - INIT_LIST_HEAD(&s->serv_list); - list_add(&s->serv_list, &servers); + SLIST_INSERT_HEAD(&servers, s, entries); } static inline int tcp_socket(void) @@ -416,7 +423,7 @@ static int add_chans(fd_set *readfds, fd_set *writefds, fd_set *exceptfds) int fd1, fd2; int nfds = -1; - list_for_each_entry(chan, &channels, chan_list) { + LIST_FOREACH(chan, &channels, entries) { b1 = &chan->buf1; b2 = &chan->buf2; fd1 = chan->fd1; @@ -457,7 +464,7 @@ static int add_servs(fd_set *readfds) struct server *server; int nfds = -1; - list_for_each_entry(server, &servers, serv_list) { + SLIST_FOREACH(server, &servers, entries) { int fd = server->sock; FD_SET(fd, readfds); @@ -491,7 +498,7 @@ static void test_chans(fd_set *readfds, fd_set *writefds, fd_set *exceptfds) int fd1, fd2; int n; - list_for_each_entry_safe(chan, tmp, &channels, chan_list) { + LIST_FOREACH_SAFE(chan, tmp, &channels, entries) { b1 = &chan->buf1; b2 = &chan->buf2; fd1 = chan->fd1; @@ -623,7 +630,7 @@ static int test_servs(fd_set *readfds) struct server *server; int count = 0; - list_for_each_entry(server, &servers, serv_list) { + SLIST_FOREACH(server, &servers, entries) { int fd = server->sock; if (FD_ISSET(fd, readfds)) { @@ -645,7 +652,8 @@ static int store_info(char **ptr) stream = open_memstream(ptr, &size); if (stream == NULL) sys_err("open_memstream"); - list_for_each_entry(chan, &channels, chan_list) { + + LIST_FOREACH(chan, &channels, entries) { fprintf(stream, "%s => %s", chan->addr, chan->server->remote_addr); if (chan->connected == 0) fprintf(stream, ": not connected"); |
