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