X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=popproxy.c;h=3882f7538af4001a0569c8975c505dd97a3594d5;hb=d94d404ce54df23ce24cb7787e83b7747631b4af;hp=fb1a8c13b1b0534a08b9e621cc2fe6b9337049fe;hpb=de2391c71d93512f29cf64ff8edfa80179c1ed1b;p=cascardo%2Frnetproxy.git diff --git a/popproxy.c b/popproxy.c index fb1a8c1..3882f75 100644 --- a/popproxy.c +++ b/popproxy.c @@ -19,29 +19,45 @@ */ #include -#include #include #include #include #include +#include +#include #include "log.h" #include "nethook.h" #include "null.h" #include "ssl.h" +#include "pop.h" + +#include "hcconn.h" +#include "tcp_connect.h" #define CONFFILE SYSCONFDIR "/popproxy.conf" -void new_client (GServer* server, GConn* conn, gpointer data) +struct pop_address +{ + char *server; + char *port; +}; + +void new_client (int fd, struct sockaddr* addr, socklen_t saddr, gpointer data) { + HCConn *conn; net_hook_t* hook; - if (conn == NULL) + struct pop_address *address = data; + if (fd < 0) { g_critical ("Server has received an error event."); return; } - g_message ("Received connection from %s.", conn->hostname); - hook = ssl_hook_new (conn, data); - gnet_conn_read (conn); + g_message ("Received connection from %s.", + inet_ntoa (((struct sockaddr_in *) addr)->sin_addr)); + conn = hc_conn_new (NULL, NULL); + hc_conn_set_driver_channel (conn, fd); + hook = ssl_hook_new (conn, address->server, address->port); + pop_hook_new (hook); } static gchar* configfile; @@ -58,14 +74,15 @@ int main (int argc, char** argv) GOptionContext* opt_ctx; GKeyFile *keyfile; - GInetAddr* inetaddr; GError *error; + int server_fd; gchar* conf_address; - gint port; + gchar* port; gchar *server_address; + gchar *server_port; + struct pop_address pop_address; gnutls_global_init (); - gnet_init (); pop_log_init (); configfile = CONFFILE; @@ -99,10 +116,10 @@ int main (int argc, char** argv) g_error_free (error); } error = NULL; - port = g_key_file_get_integer (keyfile, "global", "port", &error); - if (port == 0 && error != NULL) + port = g_key_file_get_string (keyfile, "global", "port", &error); + if (port == NULL && error != NULL) { - port = 110; + port = g_strdup ("110"); g_error_free (error); } error = NULL; @@ -114,25 +131,38 @@ int main (int argc, char** argv) g_error_free (error); } - inetaddr = gnet_inetaddr_new_nonblock (conf_address, port); - if (gnet_server_new (inetaddr, port, - new_client, server_address) == NULL) + server_port = g_key_file_get_string (keyfile, "global", "server_port", + &error); + if (server_port == NULL && error != NULL) + { + server_port = g_strdup ("995"); + g_error_free (error); + } + + pop_address.server = server_address; + pop_address.port = server_port; + + server_fd = hc_tcp_server (port); + if (server_fd < 0) { fprintf (stderr, "Could not create server.\n"); exit (1); } + hc_server_add_watch (server_fd, new_client, &pop_address); - g_message ("Listening at %s:%d.", conf_address, port); + g_message ("Listening at %s:%s.", conf_address, port); daemon (0, 0); g_free (conf_address); + g_free (port); g_main_loop_run (g_main_loop_new (g_main_context_default (), TRUE)); gnutls_global_deinit (); g_free (server_address); + g_free (server_port); return 0;