X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=popproxy.c;h=3882f7538af4001a0569c8975c505dd97a3594d5;hb=1148a1c1d952687367d755cdc0e779e5ff32b43f;hp=23b17bad3a98f469146c3a88afdec17f4c651b20;hpb=8d71c982795260ba2451de05e28193241387fcb0;p=cascardo%2Frnetproxy.git diff --git a/popproxy.c b/popproxy.c index 23b17ba..3882f75 100644 --- a/popproxy.c +++ b/popproxy.c @@ -19,31 +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); + 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); - gnet_conn_read (conn); } static gchar* configfile; @@ -60,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; @@ -101,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; @@ -116,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;