diff options
author | Philipp Tölke <toelke@in.tum.de> | 2010-08-03 18:58:54 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2010-08-03 18:58:54 +0000 |
commit | e73d970dd27383525462df253f157222221a987f (patch) | |
tree | 02544b0f4b5f198854036bdec85ba84d4a605037 /src/vpn/gnunet-helper-vpn.c | |
parent | b839e3d732b529cc81a78d67968026cb0f8649e6 (diff) | |
download | gnunet-e73d970dd27383525462df253f157222221a987f.tar.gz gnunet-e73d970dd27383525462df253f157222221a987f.zip |
Give the tun-interface an IPv4-Address
Diffstat (limited to 'src/vpn/gnunet-helper-vpn.c')
-rw-r--r-- | src/vpn/gnunet-helper-vpn.c | 54 |
1 files changed, 52 insertions, 2 deletions
diff --git a/src/vpn/gnunet-helper-vpn.c b/src/vpn/gnunet-helper-vpn.c index 0307607d8..6a6aaf9dc 100644 --- a/src/vpn/gnunet-helper-vpn.c +++ b/src/vpn/gnunet-helper-vpn.c | |||
@@ -67,7 +67,7 @@ void term(int sig) { | |||
67 | running = 0; | 67 | running = 0; |
68 | } | 68 | } |
69 | 69 | ||
70 | static void set_address(char* dev, char* address, unsigned long prefix_len) { /* {{{ */ | 70 | static void set_address6(char* dev, char* address, unsigned long prefix_len) { /* {{{ */ |
71 | int fd = socket(AF_INET6, SOCK_DGRAM, 0); | 71 | int fd = socket(AF_INET6, SOCK_DGRAM, 0); |
72 | 72 | ||
73 | struct ifreq ifr; | 73 | struct ifreq ifr; |
@@ -100,6 +100,47 @@ static void set_address(char* dev, char* address, unsigned long prefix_len) { /* | |||
100 | /* FIXME */ ioctl(fd, SIOCSIFFLAGS, &ifr); | 100 | /* FIXME */ ioctl(fd, SIOCSIFFLAGS, &ifr); |
101 | } /* }}} */ | 101 | } /* }}} */ |
102 | 102 | ||
103 | static void set_address4(char* dev, char* address, char* mask) { /* {{{ */ | ||
104 | int fd=0; | ||
105 | struct sockaddr_in* addr; | ||
106 | struct ifreq ifr; | ||
107 | |||
108 | memset(&ifr, 0, sizeof(struct ifreq)); | ||
109 | addr = (struct sockaddr_in *)&(ifr.ifr_addr); | ||
110 | memset(addr, 0, sizeof(struct sockaddr_in)); | ||
111 | addr->sin_family = AF_INET; | ||
112 | addr->sin_addr.s_addr = inet_addr(address); | ||
113 | |||
114 | /* FIXME */ inet_pton(AF_INET, address, &addr->sin_addr.s_addr); | ||
115 | |||
116 | fd = socket(PF_INET, SOCK_DGRAM, 0); | ||
117 | if(fd < 0) { | ||
118 | perror("socket()"); | ||
119 | return; | ||
120 | } | ||
121 | |||
122 | strncpy(ifr.ifr_name, dev, IFNAMSIZ); | ||
123 | |||
124 | if(ioctl(fd, SIOCSIFADDR, &ifr) != 0 ) { | ||
125 | perror("SIOCSIFADDR"); | ||
126 | close(fd); | ||
127 | return; | ||
128 | } | ||
129 | |||
130 | addr = (struct sockaddr_in*)&(ifr.ifr_netmask); | ||
131 | /* FIXME */ inet_pton(AF_INET, mask, &addr->sin_addr.s_addr); | ||
132 | |||
133 | if(ioctl(fd, SIOCSIFNETMASK, &ifr) != 0 ) { | ||
134 | perror("SIOCSIFNETMASK"); | ||
135 | close(fd); | ||
136 | return; | ||
137 | } | ||
138 | |||
139 | /* FIXME */ ioctl(fd, SIOCGIFFLAGS, &ifr); | ||
140 | ifr.ifr_flags |= IFF_UP | IFF_RUNNING; | ||
141 | /* FIXME */ ioctl(fd, SIOCSIFFLAGS, &ifr); | ||
142 | } /* }}} */ | ||
143 | |||
103 | void setnonblocking(int fd) {/*{{{*/ | 144 | void setnonblocking(int fd) {/*{{{*/ |
104 | int opts; | 145 | int opts; |
105 | 146 | ||
@@ -131,11 +172,20 @@ int main(int argc, char** argv) { | |||
131 | 172 | ||
132 | fprintf(stderr, "Initialized the interface %s as %d.\n", dev, fd_tun); | 173 | fprintf(stderr, "Initialized the interface %s as %d.\n", dev, fd_tun); |
133 | 174 | ||
175 | { | ||
134 | // TODO: get this out of argv | 176 | // TODO: get this out of argv |
135 | char address[] = "1234::1"; | 177 | char address[] = "1234::1"; |
136 | unsigned long prefix_len = 16; | 178 | unsigned long prefix_len = 16; |
137 | 179 | ||
138 | set_address(dev, address, prefix_len); | 180 | set_address6(dev, address, prefix_len); |
181 | } | ||
182 | |||
183 | { | ||
184 | char address[] = "10.10.10.1"; | ||
185 | char mask[] = "255.255.255.252"; | ||
186 | |||
187 | set_address4(dev, address, mask); | ||
188 | } | ||
139 | 189 | ||
140 | uid_t uid = getuid (); | 190 | uid_t uid = getuid (); |
141 | if (setresuid (uid, uid, uid) != 0 ) | 191 | if (setresuid (uid, uid, uid) != 0 ) |