From bada4affc0b7d79f9fabba26ab2fb780ed22ae6a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Philipp=20T=C3=B6lke?= Date: Mon, 28 Jun 2010 12:37:34 +0000 Subject: [PATCH] a first simple test-program for the vpn-functionality --- src/vpn/tun.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 src/vpn/tun.c diff --git a/src/vpn/tun.c b/src/vpn/tun.c new file mode 100644 index 000000000..6e184b079 --- /dev/null +++ b/src/vpn/tun.c @@ -0,0 +1,104 @@ +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +int tun_alloc(char *dev) { + struct ifreq ifr; + int fd, err; + + if( (fd = open("/dev/net/tun", O_RDWR)) < 0 ) { + fprintf(stderr, "open: %s\n", strerror(errno)); + return -1; + } + + memset(&ifr, 0, sizeof(ifr)); + + ifr.ifr_flags = IFF_TUN; + if(*dev) + strncpy(ifr.ifr_name, dev, IFNAMSIZ); + + if ((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ){ + close(fd); + fprintf(stderr, "ioctl: %s\n", strerror(errno)); + return err; + } + strcpy(dev, ifr.ifr_name); + return fd; +} + +void n2o(fd) { + char buf[1024]; + int r, w; + for(;;) { + r = read(fd, buf, 1024); + if (r < 0) { + fprintf(stderr, "n2o read: %s\n", strerror(errno)); + exit(1); + } + if (r == 0) { + close(fd); + exit(0); + } + while (r > 0) { + w = write(1, buf, r); + if (w < 0) { + fprintf(stderr, "n2o write: %s\n", strerror(errno)); + close(fd); + exit(1); + } + r -= w; + } + } +} + +void o2n(fd) { + char buf[1024]; + int r, w; + for(;;) { + r = read(0, buf, 1024); + if (r < 0) { + fprintf(stderr, "o2n read: %s\n", strerror(errno)); + exit(1); + } + if (r == 0) { + close(fd); + exit(0); + } + while (r > 0) { + w = write(fd, buf, r); + if (w < 0) { + fprintf(stderr, "o2n write: %s\n", strerror(errno)); + close(fd); + exit(1); + } + r -= w; + } + } +} + +int main(int argc, char** argv) { + char name[IFNAMSIZ]; + int fd; + + memset(name, 0, IFNAMSIZ); + + strncpy(name, "mynet", IFNAMSIZ); + fprintf(stderr, "fd = %d, name = %s\n", fd = tun_alloc(name), name); + + if (fork() == 0) + n2o(fd); + + o2n(fd); + + return 0; +} -- 2.25.1