From e73d970dd27383525462df253f157222221a987f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Philipp=20T=C3=B6lke?= Date: Tue, 3 Aug 2010 18:58:54 +0000 Subject: [PATCH] Give the tun-interface an IPv4-Address --- src/vpn/gnunet-helper-vpn.c | 54 +++++++++++++++++++++++++++-- src/vpn/tests/test-helper-ifaddr.sh | 17 ++++++--- 2 files changed, 65 insertions(+), 6 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) { running = 0; } -static void set_address(char* dev, char* address, unsigned long prefix_len) { /* {{{ */ +static void set_address6(char* dev, char* address, unsigned long prefix_len) { /* {{{ */ int fd = socket(AF_INET6, SOCK_DGRAM, 0); struct ifreq ifr; @@ -100,6 +100,47 @@ static void set_address(char* dev, char* address, unsigned long prefix_len) { /* /* FIXME */ ioctl(fd, SIOCSIFFLAGS, &ifr); } /* }}} */ +static void set_address4(char* dev, char* address, char* mask) { /* {{{ */ + int fd=0; + struct sockaddr_in* addr; + struct ifreq ifr; + + memset(&ifr, 0, sizeof(struct ifreq)); + addr = (struct sockaddr_in *)&(ifr.ifr_addr); + memset(addr, 0, sizeof(struct sockaddr_in)); + addr->sin_family = AF_INET; + addr->sin_addr.s_addr = inet_addr(address); + + /* FIXME */ inet_pton(AF_INET, address, &addr->sin_addr.s_addr); + + fd = socket(PF_INET, SOCK_DGRAM, 0); + if(fd < 0) { + perror("socket()"); + return; + } + + strncpy(ifr.ifr_name, dev, IFNAMSIZ); + + if(ioctl(fd, SIOCSIFADDR, &ifr) != 0 ) { + perror("SIOCSIFADDR"); + close(fd); + return; + } + + addr = (struct sockaddr_in*)&(ifr.ifr_netmask); + /* FIXME */ inet_pton(AF_INET, mask, &addr->sin_addr.s_addr); + + if(ioctl(fd, SIOCSIFNETMASK, &ifr) != 0 ) { + perror("SIOCSIFNETMASK"); + close(fd); + return; + } + + /* FIXME */ ioctl(fd, SIOCGIFFLAGS, &ifr); + ifr.ifr_flags |= IFF_UP | IFF_RUNNING; + /* FIXME */ ioctl(fd, SIOCSIFFLAGS, &ifr); +} /* }}} */ + void setnonblocking(int fd) {/*{{{*/ int opts; @@ -131,11 +172,20 @@ int main(int argc, char** argv) { fprintf(stderr, "Initialized the interface %s as %d.\n", dev, fd_tun); + { // TODO: get this out of argv char address[] = "1234::1"; unsigned long prefix_len = 16; - set_address(dev, address, prefix_len); + set_address6(dev, address, prefix_len); + } + + { + char address[] = "10.10.10.1"; + char mask[] = "255.255.255.252"; + + set_address4(dev, address, mask); + } uid_t uid = getuid (); if (setresuid (uid, uid, uid) != 0 ) diff --git a/src/vpn/tests/test-helper-ifaddr.sh b/src/vpn/tests/test-helper-ifaddr.sh index ced529226..f64f9aa53 100755 --- a/src/vpn/tests/test-helper-ifaddr.sh +++ b/src/vpn/tests/test-helper-ifaddr.sh @@ -6,7 +6,7 @@ rm $FIFO mkfifo $FIFO -/opt/gnunet/bin/gnunet-vpn-helper > $FIFO 2>&1 & +/opt/gnunet/bin/gnunet-helper-vpn > $FIFO 2>&1 & PID=$! @@ -20,13 +20,22 @@ while read line < $FIFO; do fi done +r=0 if /sbin/ifconfig $IF | grep inet6 | grep -q '1234::1/16'; then echo OK - exit 0 else - echo FAILED: Interface-Address not set! - exit 1 + echo FAILED: Interface-Address not set for IPv6! + r=1 +fi + +if /sbin/ifconfig $IF | grep "inet " | grep -q '10.10.10.1'; then + echo OK +else + echo FAILED: Interface-Address not set for IPv4! + r=1 fi rm $FIFO kill $PID + +exit $r -- 2.25.1