Fixed memory leak for closed connections
[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       fprintf (stderr, "Connected to localhost:80.\n");
13       gnet_conn_read (conn);
14       break;
15     case GNET_CONN_READ:
16       if (server == NULL)
17         {
18           fprintf (stderr, "Establishing connection to localhost:80.\n");
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       fprintf (stderr, "Received an unexpected client event.\n");
34       break;
35     }
36 }
37
38 void new_client (GServer* server, GConn* conn, gpointer data)
39 {
40   if (conn == NULL)
41     {
42       fprintf (stderr, "Server has received an error event.\n");
43       return;
44     }
45   gnet_conn_set_callback (conn, client_event, NULL);
46   gnet_conn_read (conn);
47 }
48
49 int main ()
50 {
51
52   GKeyFile *keyfile;
53   GInetAddr* inetaddr;
54   gchar* conf_address;
55   gint port;
56
57   gnet_init ();
58
59   keyfile =  g_key_file_new ();
60
61   g_key_file_load_from_file (keyfile, "conf", G_KEY_FILE_NONE, NULL);
62
63   conf_address = g_key_file_get_string (keyfile, "global", "address", NULL);
64   port = g_key_file_get_integer (keyfile, "global", "port", NULL);
65
66   printf ("Listen address is %s:%d\n", conf_address, port);
67
68   inetaddr = gnet_inetaddr_new_nonblock (conf_address, port);
69   gnet_server_new (inetaddr, port, new_client, NULL);
70
71   g_main_loop_run (g_main_loop_new (g_main_context_default (), TRUE));
72
73   return 0;
74
75 }