00001 #ifndef __CTRLPROXY_LISTENER_H__ 00002 #define __CTRLPROXY_LISTENER_H__ 00003 00004 #include <netdb.h> 00005 #include "ctrlproxy.h" 00006 00007 #ifndef G_MODULE_EXPORT 00008 #define G_MODULE_EXPORT 00009 #endif 00010 00011 struct irc_listener; 00012 00013 typedef void (*listener_log_fn) (enum log_level, const struct irc_listener *, const char *); 00014 00015 struct pending_client; 00016 00017 struct irc_listener_ops { 00018 void (*new_client) (struct pending_client *pc); 00019 gboolean (*handle_client_line) (struct pending_client *pc, const struct irc_line *l); 00020 gboolean (*socks_auth_simple) (struct pending_client *pc, const char *username, const char *password); 00021 gboolean (*socks_connect_ipv4) (struct pending_client *pc); 00022 gboolean (*socks_connect_ipv6) (struct pending_client *pc); 00023 gboolean (*socks_connect_fqdn) (struct pending_client *pc, const char *hostname, uint16_t port); 00024 }; 00025 00029 struct irc_listener { 00030 int active:1; 00031 GIConv iconv; 00032 gboolean ssl; 00033 gpointer ssl_credentials; 00034 GList *incoming; 00035 GList *pending; 00036 struct listener_config *config; 00037 struct irc_network *network; 00038 struct global *global; 00039 listener_log_fn log_fn; 00040 struct irc_listener_ops *ops; 00041 00042 }; 00043 00044 00045 struct socks_method; 00046 00050 struct pending_client { 00052 GIOChannel *connection; 00053 00055 char *user; 00056 00058 char *password; 00059 00060 gint watch_id; 00061 struct sockaddr *clientname; 00062 socklen_t clientname_len; 00063 00065 struct irc_listener *listener; 00066 00068 struct { 00069 struct socks_method *method; 00070 enum state { 00071 SOCKS_UNUSED = -1, 00072 SOCKS_UNKNOWN = 0, 00073 SOCKS_STATE_NEW = 1, 00074 SOCKS_STATE_AUTH, 00075 SOCKS_STATE_NORMAL 00076 } state; 00077 void *method_data; 00078 } socks; 00079 00081 void *private_data; 00082 }; 00083 00084 G_MODULE_EXPORT gboolean listener_start(struct irc_listener *, const char *address, const char *service); 00085 G_MODULE_EXPORT gboolean listener_stop(struct irc_listener *); 00086 G_MODULE_EXPORT void fini_listeners(struct global *); 00087 G_MODULE_EXPORT void free_listener(struct irc_listener *l); 00088 G_MODULE_EXPORT gboolean init_listeners(struct global *global); 00089 G_MODULE_EXPORT void listener_log(enum log_level l, const struct irc_listener *listener, 00090 const char *fmt, ...); 00091 G_MODULE_EXPORT gboolean listener_socks_error(struct pending_client *pc, guint8 err); 00092 G_MODULE_EXPORT gboolean listener_socks_reply(struct pending_client *pc, guint8 err, guint8 atyp, guint8 data_len, gchar *data, guint16 port); 00093 G_MODULE_EXPORT struct pending_client *listener_new_pending_client(struct irc_listener *listener, GIOChannel *c); 00094 00095 #endif