diff options
author | Philipp Tölke <toelke@in.tum.de> | 2010-07-20 05:45:25 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2010-07-20 05:45:25 +0000 |
commit | 729f0bb2677eb1f22ecff2284e987e99212541a3 (patch) | |
tree | a24e1233b50518d6aa555e513c5f846767d170c8 /src/vpn/gnunet-vpn-helper.c | |
parent | aea5d092050795eb39acd379283774360d352f3b (diff) | |
download | gnunet-729f0bb2677eb1f22ecff2284e987e99212541a3.tar.gz gnunet-729f0bb2677eb1f22ecff2284e987e99212541a3.zip |
start the helper from the daemon, end it correctly
Diffstat (limited to 'src/vpn/gnunet-vpn-helper.c')
-rw-r--r-- | src/vpn/gnunet-vpn-helper.c | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/src/vpn/gnunet-vpn-helper.c b/src/vpn/gnunet-vpn-helper.c index a5a569b9a..602bc4cfd 100644 --- a/src/vpn/gnunet-vpn-helper.c +++ b/src/vpn/gnunet-vpn-helper.c | |||
@@ -10,6 +10,8 @@ | |||
10 | 10 | ||
11 | #include <string.h> | 11 | #include <string.h> |
12 | 12 | ||
13 | #include <signal.h> | ||
14 | |||
13 | #include <stdio.h> | 15 | #include <stdio.h> |
14 | #include <unistd.h> | 16 | #include <unistd.h> |
15 | 17 | ||
@@ -27,6 +29,14 @@ struct in6_ifreq { | |||
27 | 29 | ||
28 | #endif | 30 | #endif |
29 | 31 | ||
32 | int running = 1; | ||
33 | |||
34 | void term(int sig) { | ||
35 | fprintf(stderr, "Got SIGTERM...\n"); | ||
36 | if (sig == SIGTERM) | ||
37 | running = 0; | ||
38 | } | ||
39 | |||
30 | static void set_address(char* dev, char* address, unsigned long prefix_len) { /* {{{ */ | 40 | static void set_address(char* dev, char* address, unsigned long prefix_len) { /* {{{ */ |
31 | int fd = socket(AF_INET6, SOCK_DGRAM, 0); | 41 | int fd = socket(AF_INET6, SOCK_DGRAM, 0); |
32 | 42 | ||
@@ -87,11 +97,12 @@ static int copy (int in, int out) { | |||
87 | return 0; | 97 | return 0; |
88 | } | 98 | } |
89 | 99 | ||
90 | |||
91 | int main(int argc, char** argv) { | 100 | int main(int argc, char** argv) { |
92 | char dev[IFNAMSIZ]; | 101 | char dev[IFNAMSIZ]; |
93 | memset(dev, 0, IFNAMSIZ); | 102 | memset(dev, 0, IFNAMSIZ); |
94 | 103 | ||
104 | signal(SIGTERM, &term); | ||
105 | |||
95 | int fd_tun = init_tun(dev); | 106 | int fd_tun = init_tun(dev); |
96 | fprintf(stderr, "Initialized the interface %s as %d.\n", dev, fd_tun); | 107 | fprintf(stderr, "Initialized the interface %s as %d.\n", dev, fd_tun); |
97 | 108 | ||
@@ -111,26 +122,42 @@ int main(int argc, char** argv) { | |||
111 | 122 | ||
112 | fd_set fds_w; | 123 | fd_set fds_w; |
113 | fd_set fds_r; | 124 | fd_set fds_r; |
114 | for(;;) { | 125 | |
126 | int r = 1; | ||
127 | int w = 1; | ||
128 | while(r != 0 && w != 0 && running == 1) { | ||
115 | FD_ZERO(&fds_w); | 129 | FD_ZERO(&fds_w); |
116 | FD_ZERO(&fds_r); | 130 | FD_ZERO(&fds_r); |
117 | 131 | ||
118 | FD_SET(0, &fds_r); | 132 | if (r) { |
119 | FD_SET(fd_tun, &fds_r); | 133 | FD_SET(fd_tun, &fds_r); |
134 | FD_SET(1, &fds_w); | ||
135 | } | ||
120 | 136 | ||
121 | FD_SET(1, &fds_w); | 137 | if (w) { |
122 | FD_SET(fd_tun, &fds_w); | 138 | FD_SET(0, &fds_r); |
139 | FD_SET(fd_tun, &fds_w); | ||
140 | } | ||
123 | 141 | ||
124 | int r = select(fd_tun+1, &fds_r, &fds_w, (fd_set*)0, 0); | 142 | int r = select(fd_tun+1, &fds_r, &fds_w, (fd_set*)0, 0); |
125 | 143 | ||
126 | if(r > 0) { | 144 | if(r > 0) { |
127 | if (FD_ISSET(0, &fds_r) && FD_ISSET(fd_tun, &fds_w)) { | 145 | if (FD_ISSET(0, &fds_r) && FD_ISSET(fd_tun, &fds_w)) { |
128 | copy(0, fd_tun); | 146 | if (copy(0, fd_tun) < 0) { |
147 | fprintf(stderr, "Closing Write\n"); | ||
148 | shutdown(fd_tun, SHUT_WR); | ||
149 | w = 0; | ||
150 | } | ||
129 | } else if (FD_ISSET(1, &fds_w) && FD_ISSET(fd_tun, &fds_r)) { | 151 | } else if (FD_ISSET(1, &fds_w) && FD_ISSET(fd_tun, &fds_r)) { |
130 | copy(fd_tun, 1); | 152 | if (copy(fd_tun, 1) < 0) { |
153 | fprintf(stderr, "Closing Read\n"); | ||
154 | shutdown(fd_tun, SHUT_RD); | ||
155 | r = 0; | ||
156 | } | ||
131 | } | 157 | } |
132 | } | 158 | } |
133 | } | 159 | } |
160 | fprintf(stderr, "Quitting!\n"); | ||
134 | 161 | ||
135 | return 0; | 162 | return 0; |
136 | } | 163 | } |