#include "nethook.h"
#include "null.h"
#include "ssl.h"
+#include "pop.h"
#define CONFFILE SYSCONFDIR "/popproxy.conf"
+struct pop_address
+{
+ char *server;
+ int port;
+};
+
void new_client (GServer* server, GConn* conn, gpointer data)
{
net_hook_t* hook;
+ struct pop_address *address = data;
if (conn == NULL)
{
g_critical ("Server has received an error event.");
return;
}
g_message ("Received connection from %s.", conn->hostname);
- hook = ssl_hook_new (conn, data);
+ hook = ssl_hook_new (conn, address->server, address->port);
+ pop_hook_new (hook);
gnet_conn_read (conn);
}
GOptionContext* opt_ctx;
GKeyFile *keyfile;
GInetAddr* inetaddr;
+ GError *error;
gchar* conf_address;
gint port;
gchar *server_address;
+ gint server_port;
+ struct pop_address pop_address;
gnutls_global_init ();
gnet_init ();
keyfile = g_key_file_new ();
- g_key_file_load_from_file (keyfile, configfile, G_KEY_FILE_NONE, NULL);
+ error = NULL;
+ if (g_key_file_load_from_file (keyfile, configfile,
+ G_KEY_FILE_NONE, &error) == FALSE)
+ {
+ fprintf (stderr, "Could not load configuration file %s: %s.\n",
+ configfile, error->message);
+ g_error_free (error);
+ exit (1);
+ }
- conf_address = g_key_file_get_string (keyfile, "global", "address", NULL);
- port = g_key_file_get_integer (keyfile, "global", "port", NULL);
- server_address = g_key_file_get_string (keyfile, "global", "server", NULL);
+ error = NULL;
+ conf_address = g_key_file_get_string (keyfile, "global", "address",
+ &error);
+ if (conf_address == NULL && error != NULL)
+ {
+ conf_address = g_strdup ("0.0.0.0");
+ g_error_free (error);
+ }
+ error = NULL;
+ port = g_key_file_get_integer (keyfile, "global", "port", &error);
+ if (port == 0 && error != NULL)
+ {
+ port = 110;
+ g_error_free (error);
+ }
+ error = NULL;
+ server_address = g_key_file_get_string (keyfile, "global", "server",
+ &error);
+ if (server_address == NULL && error != NULL)
+ {
+ server_address = g_strdup ("127.0.0.1");
+ g_error_free (error);
+ }
+
+ server_port = g_key_file_get_integer (keyfile, "global", "server_port",
+ &error);
+ if (server_port == 0 && error != NULL)
+ {
+ port = 995;
+ g_error_free (error);
+ }
+
+ pop_address.server = server_address;
+ pop_address.port = server_port;
inetaddr = gnet_inetaddr_new_nonblock (conf_address, port);
if (gnet_server_new (inetaddr, port,
- new_client, server_address) == NULL)
+ new_client, &pop_address) == NULL)
{
fprintf (stderr, "Could not create server.\n");
exit (1);
daemon (0, 0);
+ g_free (conf_address);
+
g_main_loop_run (g_main_loop_new (g_main_context_default (), TRUE));
gnutls_global_deinit ();
+ g_free (server_address);
+
return 0;
}