]> git.sesse.net Git - greproxy/blob - tungre.cpp
89339bba2455aa9ab4616f99f18ce0736e3f6ea0
[greproxy] / tungre.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 #include "tunprotocol.h"
11
12 using namespace std;
13
14 in6_addr get_addr(const char *str) {
15         in6_addr ret;
16         if (inet_pton(AF_INET6, str, &ret) != 1) {
17                 fprintf(stderr, "Could not parse %s\n", str);
18                 exit(1);
19         }
20         return ret;
21 }
22
23 int main(int argc, char **argv)
24 {
25         in6_addr myaddr = get_addr(argv[1]);
26         in6_addr remoteaddr = get_addr(argv[2]);
27         GREProtocol gre(myaddr, remoteaddr);
28         TUNProtocol tun("tungre");
29
30         Reorderer tun_reorderer(&tun);
31
32         fd_set fds;
33         FD_ZERO(&fds);
34         for ( ;; ) {
35                 FD_SET(gre.fd(), &fds);
36                 FD_SET(tun.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.fd(), &fds)) {
44                         gre.read_packet(&tun_reorderer);
45                 }
46                 if (FD_ISSET(tun.fd(), &fds)) {
47                         tun.read_packet(&gre);
48                 }
49         }
50 }