diff --git a/Makefile b/Makefile index e11f39abc..745319817 100644 --- a/Makefile +++ b/Makefile @@ -560,9 +560,9 @@ else all: haproxy endif -OBJS = src/haproxy.o src/sessionhash.o src/base64.o src/protocols.o \ +OBJS = src/haproxy.o src/sessionhash.o src/base64.o src/protocol.o \ src/uri_auth.o src/standard.o src/buffer.o src/log.o src/task.o \ - src/chunk.o src/channel.o \ + src/chunk.o src/channel.o src/listener.o \ src/time.o src/fd.o src/pipe.o src/regex.o src/cfgparse.o src/server.o \ src/checks.o src/queue.o src/frontend.o src/proxy.o src/peers.o \ src/arg.o src/stick_table.o src/proto_uxst.o src/connection.o \ diff --git a/Makefile.bsd b/Makefile.bsd index ca00c7b89..6fff29bb7 100644 --- a/Makefile.bsd +++ b/Makefile.bsd @@ -105,9 +105,9 @@ LIBS = $(LIBS.$(TARGET)) $(LIBS.$(REGEX)) $(ADDLIB) CFLAGS = -Wall $(COPTS) $(DEBUG) LDFLAGS = -g -OBJS = src/haproxy.o src/sessionhash.o src/base64.o src/protocols.o \ +OBJS = src/haproxy.o src/sessionhash.o src/base64.o src/protocol.o \ src/uri_auth.o src/standard.o src/buffer.o src/log.o src/task.o \ - src/chunk.o src/channel.o \ + src/chunk.o src/channel.o src/listener.o \ src/time.o src/fd.o src/pipe.o src/regex.o src/cfgparse.o src/server.o \ src/checks.o src/queue.o src/frontend.o src/proxy.o src/proto_uxst.o \ src/proto_http.o src/raw_sock.o src/appsession.o src/backend.o \ diff --git a/Makefile.osx b/Makefile.osx index a251c4ffc..8201a6a7a 100644 --- a/Makefile.osx +++ b/Makefile.osx @@ -102,9 +102,9 @@ LIBS = $(LIBS.$(TARGET)) $(LIBS.$(REGEX)) $(ADDLIB) CFLAGS = -Wall $(COPTS) $(DEBUG) -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386 -mmacosx-version-min=10.4 LDFLAGS = -g -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386 -mmacosx-version-min=10.4 -OBJS = src/haproxy.o src/sessionhash.o src/base64.o src/protocols.o \ +OBJS = src/haproxy.o src/sessionhash.o src/base64.o src/protocol.o \ src/uri_auth.o src/standard.o src/buffer.o src/log.o src/task.o \ - src/chunk.o src/channel.o \ + src/chunk.o src/channel.o src/listener.o \ src/time.o src/fd.o src/pipe.o src/regex.o src/cfgparse.o src/server.o \ src/checks.o src/queue.o src/frontend.o src/proxy.o src/proto_uxst.o \ src/proto_http.o src/raw_sock.o src/appsession.o src/backend.o \ diff --git a/include/proto/connection.h b/include/proto/connection.h index 3ed605ff0..32e77cf71 100644 --- a/include/proto/connection.h +++ b/include/proto/connection.h @@ -24,7 +24,7 @@ #include #include -#include +#include /* I/O callback for fd-based connections. It calls the read/write handlers * provided by the connection's sock_ops. Returns 0. diff --git a/include/proto/protocols.h b/include/proto/listener.h similarity index 68% rename from include/proto/protocols.h rename to include/proto/listener.h index ec98e59ce..415b91338 100644 --- a/include/proto/protocols.h +++ b/include/proto/listener.h @@ -1,28 +1,28 @@ /* - include/proto/protocols.h - This file declares generic protocol primitives. + * include/proto/listener.h + * This file declares listener management primitives. + * + * Copyright (C) 2000-2012 Willy Tarreau - w@1wt.eu + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, version 2.1 + * exclusively. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ - Copyright (C) 2000-2007 Willy Tarreau - w@1wt.eu - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation, version 2.1 - exclusively. +#ifndef _PROTO_LISTENER_H +#define _PROTO_LISTENER_H - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef _PROTO_PROTOCOLS_H -#define _PROTO_PROTOCOLS_H - -#include +#include /* This function adds the specified listener's file descriptor to the polling * lists if it is in the LI_LISTEN state. The listener enters LI_READY or @@ -105,35 +105,6 @@ void delete_listener(struct listener *listener); */ int listener_accept(int fd); -/* Registers the protocol */ -void protocol_register(struct protocol *proto); - -/* Unregisters the protocol . Note that all listeners must have - * previously been unbound. - */ -void protocol_unregister(struct protocol *proto); - -/* binds all listeneres of all registered protocols. Returns a composition - * of ERR_NONE, ERR_RETRYABLE, ERR_FATAL. - */ -int protocol_bind_all(char *errmsg, int errlen); - -/* unbinds all listeners of all registered protocols. They are also closed. - * This must be performed before calling exit() in order to get a chance to - * remove file-system based sockets and pipes. - * Returns a composition of ERR_NONE, ERR_RETRYABLE, ERR_FATAL. - */ -int protocol_unbind_all(void); - -/* enables all listeners of all registered protocols. This is intended to be - * used after a fork() to enable reading on all file descriptors. Returns a - * composition of ERR_NONE, ERR_RETRYABLE, ERR_FATAL. - */ -int protocol_enable_all(void); - -/* returns the protocol associated to family or NULL if not found */ -struct protocol *protocol_by_family(int family); - /* allocate an ssl_conf struct for a bind line, and chain it to list head . * If is not NULL, it is duplicated into ->arg to store useful config * information for error reporting. @@ -151,7 +122,7 @@ static inline struct ssl_conf *ssl_conf_alloc(struct list *lh, const char *file, return ssl_conf; } -#endif /* _PROTO_PROTOCOLS_H */ +#endif /* _PROTO_LISTENER_H */ /* * Local variables: diff --git a/include/proto/protocol.h b/include/proto/protocol.h new file mode 100644 index 000000000..1842faf16 --- /dev/null +++ b/include/proto/protocol.h @@ -0,0 +1,63 @@ +/* + * include/proto/protocol.h + * This file declares generic protocol management primitives. + * + * Copyright (C) 2000-2012 Willy Tarreau - w@1wt.eu + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, version 2.1 + * exclusively. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _PROTO_PROTOCOL_H +#define _PROTO_PROTOCOL_H + +#include + +/* Registers the protocol */ +void protocol_register(struct protocol *proto); + +/* Unregisters the protocol . Note that all listeners must have + * previously been unbound. + */ +void protocol_unregister(struct protocol *proto); + +/* binds all listeneres of all registered protocols. Returns a composition + * of ERR_NONE, ERR_RETRYABLE, ERR_FATAL. + */ +int protocol_bind_all(char *errmsg, int errlen); + +/* unbinds all listeners of all registered protocols. They are also closed. + * This must be performed before calling exit() in order to get a chance to + * remove file-system based sockets and pipes. + * Returns a composition of ERR_NONE, ERR_RETRYABLE, ERR_FATAL. + */ +int protocol_unbind_all(void); + +/* enables all listeners of all registered protocols. This is intended to be + * used after a fork() to enable reading on all file descriptors. Returns a + * composition of ERR_NONE, ERR_RETRYABLE, ERR_FATAL. + */ +int protocol_enable_all(void); + +/* returns the protocol associated to family or NULL if not found */ +struct protocol *protocol_by_family(int family); + +#endif /* _PROTO_PROTOCOL_H */ + +/* + * Local variables: + * c-indent-level: 8 + * c-basic-offset: 8 + * End: + */ diff --git a/include/proto/proxy.h b/include/proto/proxy.h index d5fd3e01a..4a4b2857f 100644 --- a/include/proto/proxy.h +++ b/include/proto/proxy.h @@ -27,6 +27,7 @@ #include #include #include +#include #include int start_proxies(int verbose); diff --git a/include/proto/ssl_sock.h b/include/proto/ssl_sock.h index 9d0462442..6192fe8e9 100644 --- a/include/proto/ssl_sock.h +++ b/include/proto/ssl_sock.h @@ -23,7 +23,9 @@ #define _PROTO_SSL_SOCK_H #include -#include +#include +#include +#include #include extern struct data_ops ssl_sock; diff --git a/include/types/connection.h b/include/types/connection.h index 711abf002..8a1b8ee50 100644 --- a/include/types/connection.h +++ b/include/types/connection.h @@ -27,8 +27,10 @@ #include +#include +#include + /* referenced below */ -struct protocol; struct connection; struct buffer; struct pipe; @@ -36,7 +38,6 @@ struct server; struct proxy; struct si_applet; struct task; -struct listener; /* Polling flags that are manipulated by I/O callbacks and handshake callbacks * indicate what they expect from a file descriptor at each layer. For each diff --git a/include/types/global.h b/include/types/global.h index 5775e27dc..4c0e443cb 100644 --- a/include/types/global.h +++ b/include/types/global.h @@ -26,8 +26,7 @@ #include #include -#include -#include +#include #include #include diff --git a/include/types/protocols.h b/include/types/listener.h similarity index 74% rename from include/types/protocols.h rename to include/types/listener.h index bd8b35515..78195ec30 100644 --- a/include/types/protocols.h +++ b/include/types/listener.h @@ -1,8 +1,8 @@ /* - * include/types/protocols.h - * This file defines the structures used by generic network protocols. + * include/types/listener.h + * This file defines the structures needed to manage listeners. * - * Copyright (C) 2000-2011 Willy Tarreau - w@1wt.eu + * Copyright (C) 2000-2012 Willy Tarreau - w@1wt.eu * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -19,13 +19,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef _TYPES_PROTOCOLS_H -#define _TYPES_PROTOCOLS_H +#ifndef _TYPES_LISTENER_H +#define _TYPES_LISTENER_H #include #include -#include -#include #ifdef USE_OPENSSL #include @@ -35,11 +33,12 @@ #include #include -#include -#include - -/* max length of a protcol name, including trailing zero */ -#define PROTO_NAME_LEN 16 +/* Some pointer types reference below */ +struct task; +struct protocol; +struct data_ops; +struct proxy; +struct licounters; /* listener state */ enum { @@ -159,38 +158,7 @@ struct listener { } conf; /* config information */ }; -struct connection; - -/* This structure contains all information needed to easily handle a protocol. - * Its primary goal is to ease listeners maintenance. Specifically, the - * bind_all() primitive must be used before any fork(), and the enable_all() - * primitive must be called after the fork() to enable all fds. Last, the - * unbind_all() primitive closes all listeners. - */ -struct protocol { - char name[PROTO_NAME_LEN]; /* protocol name, zero-terminated */ - int sock_domain; /* socket domain, as passed to socket() */ - int sock_type; /* socket type, as passed to socket() */ - int sock_prot; /* socket protocol, as passed to socket() */ - sa_family_t sock_family; /* socket family, for sockaddr */ - socklen_t sock_addrlen; /* socket address length, used by bind() */ - int l3_addrlen; /* layer3 address length, used by hashes */ - int (*accept)(int fd); /* generic accept function */ - int (*bind)(struct listener *l, char *errmsg, int errlen); /* bind a listener */ - int (*bind_all)(struct protocol *proto, char *errmsg, int errlen); /* bind all unbound listeners */ - int (*unbind_all)(struct protocol *proto); /* unbind all bound listeners */ - int (*enable_all)(struct protocol *proto); /* enable all bound listeners */ - int (*disable_all)(struct protocol *proto); /* disable all bound listeners */ - int (*connect)(struct connection *, int data); /* connect function if any */ - int (*get_src)(int fd, struct sockaddr *, socklen_t, int dir); /* syscall used to retrieve src addr */ - int (*get_dst)(int fd, struct sockaddr *, socklen_t, int dir); /* syscall used to retrieve dst addr */ - - struct list listeners; /* list of listeners using this protocol */ - int nb_listeners; /* number of listeners */ - struct list list; /* list of registered protocols */ -}; - -#endif /* _TYPES_PROTOCOLS_H */ +#endif /* _TYPES_LISTENER_H */ /* * Local variables: diff --git a/include/types/protocol.h b/include/types/protocol.h new file mode 100644 index 000000000..a8e020ca2 --- /dev/null +++ b/include/types/protocol.h @@ -0,0 +1,75 @@ +/* + * include/types/protocol.h + * This file defines the structures used by generic network protocols. + * + * Copyright (C) 2000-2012 Willy Tarreau - w@1wt.eu + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, version 2.1 + * exclusively. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _TYPES_PROTOCOL_H +#define _TYPES_PROTOCOL_H + +#include +#include + +#include +#include +#include + +/* some pointer types referenced below */ +struct listener; +struct connection; + +/* max length of a protcol name, including trailing zero */ +#define PROTO_NAME_LEN 16 + +/* This structure contains all information needed to easily handle a protocol. + * Its primary goal is to ease listeners maintenance. Specifically, the + * bind_all() primitive must be used before any fork(), and the enable_all() + * primitive must be called after the fork() to enable all fds. Last, the + * unbind_all() primitive closes all listeners. + */ +struct protocol { + char name[PROTO_NAME_LEN]; /* protocol name, zero-terminated */ + int sock_domain; /* socket domain, as passed to socket() */ + int sock_type; /* socket type, as passed to socket() */ + int sock_prot; /* socket protocol, as passed to socket() */ + sa_family_t sock_family; /* socket family, for sockaddr */ + socklen_t sock_addrlen; /* socket address length, used by bind() */ + int l3_addrlen; /* layer3 address length, used by hashes */ + int (*accept)(int fd); /* generic accept function */ + int (*bind)(struct listener *l, char *errmsg, int errlen); /* bind a listener */ + int (*bind_all)(struct protocol *proto, char *errmsg, int errlen); /* bind all unbound listeners */ + int (*unbind_all)(struct protocol *proto); /* unbind all bound listeners */ + int (*enable_all)(struct protocol *proto); /* enable all bound listeners */ + int (*disable_all)(struct protocol *proto); /* disable all bound listeners */ + int (*connect)(struct connection *, int data); /* connect function if any */ + int (*get_src)(int fd, struct sockaddr *, socklen_t, int dir); /* syscall used to retrieve src addr */ + int (*get_dst)(int fd, struct sockaddr *, socklen_t, int dir); /* syscall used to retrieve dst addr */ + + struct list listeners; /* list of listeners using this protocol */ + int nb_listeners; /* number of listeners */ + struct list list; /* list of registered protocols */ +}; + +#endif /* _TYPES_PROTOCOL_H */ + +/* + * Local variables: + * c-indent-level: 8 + * c-basic-offset: 8 + * End: + */ diff --git a/include/types/proxy.h b/include/types/proxy.h index 1080568d2..a2355d597 100644 --- a/include/types/proxy.h +++ b/include/types/proxy.h @@ -40,8 +40,8 @@ #include #include #include +#include #include -#include #include #include #include diff --git a/src/backend.c b/src/backend.c index c2ecda828..29d814599 100644 --- a/src/backend.c +++ b/src/backend.c @@ -38,7 +38,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/cfgparse.c b/src/cfgparse.c index c91e996c8..f78f89665 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -51,9 +51,10 @@ #include #include #include +#include #include #include -#include +#include #include #include #include diff --git a/src/dumpstats.c b/src/dumpstats.c index 2e775d945..e28f80811 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -47,7 +47,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/haproxy.c b/src/haproxy.c index 7fb042971..5edde4f1f 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -78,8 +78,9 @@ #include #include #include +#include #include -#include +#include #include #include #include diff --git a/src/protocols.c b/src/listener.c similarity index 83% rename from src/protocols.c rename to src/listener.c index 377c985d4..0e864b2aa 100644 --- a/src/protocols.c +++ b/src/listener.c @@ -1,7 +1,7 @@ /* - * Protocol registration and listener management functions. + * Listener management functions. * - * Copyright 2000-2010 Willy Tarreau + * Copyright 2000-2012 Willy Tarreau * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -28,9 +29,6 @@ #include #include -/* List head of all registered protocols */ -static struct list protocols = LIST_HEAD_INIT(protocols); - /* This function adds the specified listener's file descriptor to the polling * lists if it is in the LI_LISTEN state. The listener enters LI_READY or * LI_FULL state depending on its number of connections. @@ -411,107 +409,6 @@ void listener_accept(int fd) return; } -/* Registers the protocol */ -void protocol_register(struct protocol *proto) -{ - LIST_ADDQ(&protocols, &proto->list); -} - -/* Unregisters the protocol . Note that all listeners must have - * previously been unbound. - */ -void protocol_unregister(struct protocol *proto) -{ - LIST_DEL(&proto->list); - LIST_INIT(&proto->list); -} - -/* binds all listeners of all registered protocols. Returns a composition - * of ERR_NONE, ERR_RETRYABLE, ERR_FATAL. - */ -int protocol_bind_all(char *errmsg, int errlen) -{ - struct protocol *proto; - int err; - - err = 0; - list_for_each_entry(proto, &protocols, list) { - if (proto->bind_all) { - err |= proto->bind_all(proto, errmsg, errlen); - if ( err & ERR_ABORT ) - break; - } - } - return err; -} - -/* unbinds all listeners of all registered protocols. They are also closed. - * This must be performed before calling exit() in order to get a chance to - * remove file-system based sockets and pipes. - * Returns a composition of ERR_NONE, ERR_RETRYABLE, ERR_FATAL, ERR_ABORT. - */ -int protocol_unbind_all(void) -{ - struct protocol *proto; - int err; - - err = 0; - list_for_each_entry(proto, &protocols, list) { - if (proto->unbind_all) { - err |= proto->unbind_all(proto); - } - } - return err; -} - -/* enables all listeners of all registered protocols. This is intended to be - * used after a fork() to enable reading on all file descriptors. Returns a - * composition of ERR_NONE, ERR_RETRYABLE, ERR_FATAL. - */ -int protocol_enable_all(void) -{ - struct protocol *proto; - int err; - - err = 0; - list_for_each_entry(proto, &protocols, list) { - if (proto->enable_all) { - err |= proto->enable_all(proto); - } - } - return err; -} - -/* disables all listeners of all registered protocols. This may be used before - * a fork() to avoid duplicating poll lists. Returns a composition of ERR_NONE, - * ERR_RETRYABLE, ERR_FATAL. - */ -int protocol_disable_all(void) -{ - struct protocol *proto; - int err; - - err = 0; - list_for_each_entry(proto, &protocols, list) { - if (proto->disable_all) { - err |= proto->disable_all(proto); - } - } - return err; -} - -/* Returns the protocol handler for socket family or NULL if not found */ -struct protocol *protocol_by_family(int family) -{ - struct protocol *proto; - - list_for_each_entry(proto, &protocols, list) { - if (proto->sock_domain == family) - return proto; - } - return NULL; -} - /************************************************************************/ /* All supported ACL keywords must be declared here. */ /************************************************************************/ @@ -546,7 +443,7 @@ static struct acl_kw_list acl_kws = {{ },{ }}; __attribute__((constructor)) -static void __protocols_init(void) +static void __listener_init(void) { acl_register_keywords(&acl_kws); } diff --git a/src/peers.c b/src/peers.c index 6af5d9cb1..09e45f733 100644 --- a/src/peers.c +++ b/src/peers.c @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -32,7 +33,6 @@ #include #include #include -#include #include #include #include diff --git a/src/proto_tcp.c b/src/proto_tcp.c index f81914782..092db6918 100644 --- a/src/proto_tcp.c +++ b/src/proto_tcp.c @@ -42,9 +42,10 @@ #include #include #include +#include #include #include -#include +#include #include #include #include diff --git a/src/proto_uxst.c b/src/proto_uxst.c index e4aaeedfe..ed05e0251 100644 --- a/src/proto_uxst.c +++ b/src/proto_uxst.c @@ -36,8 +36,9 @@ #include #include +#include #include -#include +#include #include #include diff --git a/src/protocol.c b/src/protocol.c new file mode 100644 index 000000000..84d23dab0 --- /dev/null +++ b/src/protocol.c @@ -0,0 +1,129 @@ +/* + * Protocol registration functions. + * + * Copyright 2000-2012 Willy Tarreau + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + */ + +#include +#include +#include +#include + +#include + +/* List head of all registered protocols */ +static struct list protocols = LIST_HEAD_INIT(protocols); + +/* Registers the protocol */ +void protocol_register(struct protocol *proto) +{ + LIST_ADDQ(&protocols, &proto->list); +} + +/* Unregisters the protocol . Note that all listeners must have + * previously been unbound. + */ +void protocol_unregister(struct protocol *proto) +{ + LIST_DEL(&proto->list); + LIST_INIT(&proto->list); +} + +/* binds all listeners of all registered protocols. Returns a composition + * of ERR_NONE, ERR_RETRYABLE, ERR_FATAL. + */ +int protocol_bind_all(char *errmsg, int errlen) +{ + struct protocol *proto; + int err; + + err = 0; + list_for_each_entry(proto, &protocols, list) { + if (proto->bind_all) { + err |= proto->bind_all(proto, errmsg, errlen); + if ( err & ERR_ABORT ) + break; + } + } + return err; +} + +/* unbinds all listeners of all registered protocols. They are also closed. + * This must be performed before calling exit() in order to get a chance to + * remove file-system based sockets and pipes. + * Returns a composition of ERR_NONE, ERR_RETRYABLE, ERR_FATAL, ERR_ABORT. + */ +int protocol_unbind_all(void) +{ + struct protocol *proto; + int err; + + err = 0; + list_for_each_entry(proto, &protocols, list) { + if (proto->unbind_all) { + err |= proto->unbind_all(proto); + } + } + return err; +} + +/* enables all listeners of all registered protocols. This is intended to be + * used after a fork() to enable reading on all file descriptors. Returns a + * composition of ERR_NONE, ERR_RETRYABLE, ERR_FATAL. + */ +int protocol_enable_all(void) +{ + struct protocol *proto; + int err; + + err = 0; + list_for_each_entry(proto, &protocols, list) { + if (proto->enable_all) { + err |= proto->enable_all(proto); + } + } + return err; +} + +/* disables all listeners of all registered protocols. This may be used before + * a fork() to avoid duplicating poll lists. Returns a composition of ERR_NONE, + * ERR_RETRYABLE, ERR_FATAL. + */ +int protocol_disable_all(void) +{ + struct protocol *proto; + int err; + + err = 0; + list_for_each_entry(proto, &protocols, list) { + if (proto->disable_all) { + err |= proto->disable_all(proto); + } + } + return err; +} + +/* Returns the protocol handler for socket family or NULL if not found */ +struct protocol *protocol_by_family(int family) +{ + struct protocol *proto; + + list_for_each_entry(proto, &protocols, list) { + if (proto->sock_domain == family) + return proto; + } + return NULL; +} + +/* + * Local variables: + * c-indent-level: 8 + * c-basic-offset: 8 + * End: + */ diff --git a/src/proxy.c b/src/proxy.c index 07e863c6c..56d343eeb 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -31,8 +31,8 @@ #include #include #include +#include #include -#include #include #include #include diff --git a/src/raw_sock.c b/src/raw_sock.c index ea2fa6684..37bea724b 100644 --- a/src/raw_sock.c +++ b/src/raw_sock.c @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include diff --git a/src/session.c b/src/session.c index 4503b41fa..6fb79e3f2 100644 --- a/src/session.c +++ b/src/session.c @@ -32,11 +32,11 @@ #include #include #include +#include #include #include #include #include -#include #include #include #include diff --git a/src/ssl_sock.c b/src/ssl_sock.c index 41983394e..5f259f3a2 100644 --- a/src/ssl_sock.c +++ b/src/ssl_sock.c @@ -64,7 +64,6 @@ #include #include #include -#include #include #include #include