Proxies connections to jabber.org
[cascardo/rnetproxy.git] / proxy.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <errno.h>
5 #include <unistd.h>
6 #include <sys/socket.h>
7 #include <netinet/in.h>
8 #include <arpa/inet.h>
9 #include <netdb.h>
10
11 int server_create ()
12 {
13
14   int fd;
15   struct sockaddr_in saddr;
16
17   fd = socket (PF_INET, SOCK_STREAM, 0);
18
19   saddr.sin_family = AF_INET;
20   saddr.sin_port = htons (5222);
21   saddr.sin_addr.s_addr = INADDR_ANY;
22
23   bind (fd, (struct sockaddr*) &saddr, sizeof (struct sockaddr_in));
24
25   listen (fd, 5);
26
27   return fd;
28
29 }
30
31 int server_loop (int fd)
32 {
33   int client;
34   struct sockaddr_in saddr;
35   socklen_t saddr_size;
36   saddr_size = sizeof (struct sockaddr_in);
37   client = accept (fd, (struct sockaddr*) &saddr, &saddr_size);
38   fprintf (stderr, "Accepted connection from %s:%d.\n",
39            inet_ntoa (saddr.sin_addr), ntohs (saddr.sin_port));
40   return client;
41 }
42
43 int client_create ()
44 {
45
46   int fd;
47   struct sockaddr_in saddr;
48   struct hostent* host;
49
50   host = gethostbyname ("jabber.org");
51
52   fd = socket (PF_INET, SOCK_STREAM, 0);
53
54   saddr.sin_family = AF_INET;
55   saddr.sin_port = htons (5222);
56   saddr.sin_addr = *(struct in_addr*) host->h_addr;
57
58   if (connect (fd, (struct sockaddr*) &saddr, sizeof (struct sockaddr_in)) < 0)
59     {
60       fprintf (stderr, "%s\n", strerror (errno));
61       exit (1);
62     }
63   else
64     {
65       fprintf (stderr, "Connected to jabber.org:5222.\n");
66     }
67
68   return fd;
69
70 }
71
72 int client_loop (int client, int server)
73 {
74
75   char buffer[256];
76   int r;
77
78   fd_set fds;
79
80   while (1)
81     {
82       FD_ZERO (&fds);
83       FD_SET (client, &fds);
84       FD_SET (server, &fds);
85       select (FD_SETSIZE, &fds, NULL, NULL, NULL);
86       if (FD_ISSET (client, &fds))
87         {
88           r = read (client, buffer, 256);
89           if (r <= 0)
90             {
91               close (client);
92               close (server);
93               return r;
94             }
95           write (server, buffer, r);
96         }
97       if (FD_ISSET (server, &fds))
98         {
99           r = read (server, buffer, 256);
100           if (r <= 0)
101             {
102               close (client);
103               close (server);
104               return r;
105             }
106           write (client, buffer, r);
107         }
108     }
109
110   return r;
111
112 }
113
114 int main ()
115 {
116   int proxy;
117   int client;
118   int server;
119   proxy = server_create ();
120   client = server_loop (proxy);
121   server = client_create ();
122   if (client_loop (client, server) < 0)
123     {
124       fprintf (stderr, "%s\n", strerror (errno));
125       exit (1);
126     }
127   return 0;
128 }