]> git.sesse.net Git - greproxy/blob - greproxy.cpp
030ea1f335da90ea4a9b3704db8d9cd8e7e151f5
[greproxy] / greproxy.cpp
1 #include <arpa/inet.h>
2 #include <netinet/in.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <sys/select.h>
6 #include <sys/socket.h>
7
8 #include "greprotocol.h"
9 #include "reorderer.h"
10
11 using namespace std;
12
13 in6_addr get_addr(const char *str) {
14         in6_addr ret;
15         if (inet_pton(AF_INET6, str, &ret) != 1) {
16                 fprintf(stderr, "Could not parse %s\n", str);
17                 exit(1);
18         }
19         return ret;
20 }
21
22 int main(int argc, char **argv)
23 {
24         in6_addr addr_a = get_addr(argv[1]);
25         in6_addr addr_b = get_addr(argv[2]);
26         in6_addr myaddr = get_addr(argv[3]);
27         GREProtocol gre_a(myaddr, addr_a);
28         GREProtocol gre_b(myaddr, addr_b);
29         Reorderer dst_a(&gre_a);
30         Reorderer dst_b(&gre_b);
31
32         fd_set fds;
33         FD_ZERO(&fds);
34         for ( ;; ) {
35                 FD_SET(gre_a.fd(), &fds);
36                 FD_SET(gre_b.fd(), &fds);
37                 int ret = select(1024, &fds, NULL, NULL, NULL);
38                 if (ret == -1) {
39                         perror("select");
40                         continue;
41                 }
42
43                 if (FD_ISSET(gre_a.fd(), &fds)) {
44                         gre_a.read_packet(&dst_b);
45                 }
46                 if (FD_ISSET(gre_b.fd(), &fds)) {
47                         gre_b.read_packet(&dst_a);
48                 }
49         }
50 }