X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=include%2Flistener.h;h=f2fcd0008600477d64094b0c0e37080b4ea8bddc;hb=refs%2Fheads%2Fupstream;hp=f33564e7ce5a411ee69397c88782ffad2f07f6a1;hpb=9b1f5beca29ec78141f19a19d689f0f7cc3fe3ac;p=ircu2.10.12-pk.git diff --git a/include/listener.h b/include/listener.h index f33564e..f2fcd00 100644 --- a/include/listener.h +++ b/include/listener.h @@ -14,9 +14,10 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * - * $Id$ + */ +/** @file + * @brief Interface and declarations for handling listening sockets. + * @version $Id$ */ #ifndef INCLUDED_listener_h #define INCLUDED_listener_h @@ -29,6 +30,9 @@ #ifndef INCLUDED_res_h #include "res.h" #endif +#ifndef INCLUDED_client_h +#include "client.h" /* flagset stuff. oh well. */ +#endif #ifndef INCLUDED_sys_types_h #include /* size_t, broken BSD system headers */ #define INCLUDED_sys_types_h @@ -36,33 +40,57 @@ struct Client; struct StatDesc; +struct SSLListener; + +enum ListenerFlag { + /** Port is currently accepting connections. */ + LISTEN_ACTIVE, + /** Port is hidden from /STATS P output. */ + LISTEN_HIDDEN, + /** Port accepts only server connections. */ + LISTEN_SERVER, + /** Port listens for IPv4 connections. */ + LISTEN_IPV4, + /** Port listens for IPv6 connections. */ + LISTEN_IPV6, + /** Port listens for SSL connections. */ + LISTEN_SSL, + /** Sentinel for counting listener flags. */ + LISTEN_LAST_FLAG +}; + +DECLARE_FLAGSET(ListenerFlags, LISTEN_LAST_FLAG); +/** Describes a single listening port. */ struct Listener { - struct Listener* next; /* list node pointer */ - int fd; /* file descriptor */ - int ref_count; /* number of connection references */ - unsigned char active; /* current state of listener */ - unsigned char hidden; /* hidden in stats output for clients */ - unsigned char server; /* 1 if port is a server listener */ - unsigned char mask_bits; /* number of bits in mask address */ - int index; /* index into poll array */ - time_t last_accept; /* last time listener accepted */ - struct irc_sockaddr addr; /* virtual address and port */ - struct irc_in_addr mask; /* listener hostmask */ - struct Socket socket; /* describe socket to event system */ + struct Listener* next; /**< list node pointer */ + struct ListenerFlags flags; /**< on-off flags for listener */ + int fd_v4; /**< file descriptor for IPv4 */ + int fd_v6; /**< file descriptor for IPv6 */ + int ref_count; /**< number of connection references */ + unsigned char mask_bits; /**< number of bits in mask address */ + int index; /**< index into poll array */ + time_t last_accept; /**< last time listener accepted */ + struct irc_sockaddr addr; /**< virtual address and port */ + struct irc_in_addr mask; /**< listener hostmask */ + struct Socket socket_v4; /**< describe IPv4 socket to event system */ + struct Socket socket_v6; /**< describe IPv6 socket to event system */ + struct SSLListener* ssl_listener; /**< ssl listener if listening for ssl connections */ }; -extern struct Listener* ListenerPollList; /* GLOBAL - listener list */ +#define listener_server(LISTENER) FlagHas(&(LISTENER)->flags, LISTEN_SERVER) +#define listener_active(LISTENER) FlagHas(&(LISTENER)->flags, LISTEN_ACTIVE) +#define listener_ssl(LISTENER) FlagHas(&(LISTENER)->flags, LISTEN_SSL) extern void add_listener(int port, const char* vaddr_ip, - const char* mask, int is_server, - int is_hidden); + const char* mask, + const struct ListenerFlags *flags); extern void close_listener(struct Listener* listener); extern void close_listeners(void); extern void count_listener_memory(int* count_out, size_t* size_out); extern const char* get_listener_name(const struct Listener* listener); extern void mark_listeners_closing(void); -extern void show_ports(struct Client* client, struct StatDesc* sd, int stat, +extern void show_ports(struct Client* client, const struct StatDesc* sd, char* param); extern void release_listener(struct Listener* listener);