6e15f1ef9369b2c81fde4257627f908de4e12ca9
[cascardo/rnetproxy.git] / improxy.c
1 #include <glib.h>
2 #include <gnet.h>
3 #include <stdio.h>
4
5 void client_event (GConn* conn, GConnEvent* event, gpointer data)
6 {
7   GConn* server;
8   server = (GConn*) data;
9   switch (event->type)
10     {
11     case GNET_CONN_CONNECT:
12       g_debug ("Connected to localhost:80.");
13       gnet_conn_read (conn);
14       break;
15     case GNET_CONN_READ:
16       if (server == NULL)
17         {
18           g_debug ("Establishing connection to localhost:80.");
19           server = gnet_conn_new ("127.0.0.1", 80, client_event, (gpointer) conn);
20           gnet_conn_connect (server);
21           gnet_conn_set_callback (conn, client_event, (gpointer) server);
22         }
23       gnet_conn_write (server, event->buffer, event->length);
24       gnet_conn_read (conn);
25       break;
26     case GNET_CONN_WRITE:
27       break;
28     case GNET_CONN_CLOSE:
29       gnet_conn_unref (server);
30       gnet_conn_unref (conn);
31       break;
32     default:
33       g_warning ("Received an unexpected client event.");
34       break;
35     }
36 }
37
38 void new_client (GServer* server, GConn* conn, gpointer data)
39 {
40   if (conn == NULL)
41     {
42       g_critical ("Server has received an error event.");
43       return;
44     }
45   g_message ("Received connection from %s.", conn->hostname);
46   gnet_conn_set_callback (conn, client_event, NULL);
47   gnet_conn_read (conn);
48 }
49
50 int main ()
51 {
52
53   GKeyFile *keyfile;
54   GInetAddr* inetaddr;
55   gchar* conf_address;
56   gint port;
57
58   gnet_init ();
59
60   keyfile =  g_key_file_new ();
61
62   g_key_file_load_from_file (keyfile, "improxy.conf", G_KEY_FILE_NONE, NULL);
63
64   conf_address = g_key_file_get_string (keyfile, "global", "address", NULL);
65   port = g_key_file_get_integer (keyfile, "global", "port", NULL);
66
67   g_message ("Listen address is %s:%d.", conf_address, port);
68
69   inetaddr = gnet_inetaddr_new_nonblock (conf_address, port);
70   gnet_server_new (inetaddr, port, new_client, NULL);
71
72   g_main_loop_run (g_main_loop_new (g_main_context_default (), TRUE));
73
74   return 0;
75
76 }