/* * tunsetup: Setup a persistent TUN device * Matt Chapman */ #include #include #include #include #include #include #include static void usage(char *program) { fprintf(stderr, "Usage: %s [ -d ] [ -e ] \n", program); } int main(int argc, char *argv[]) { struct ifreq ifr; int fd, c; int delete = 0; int tap = 0; while ((c = getopt(argc, argv, "deh?")) != -1) { switch (c) { case 'd': delete = 1; break; case 'e': tap = 1; break; default: usage(argv[0]); return 1; } } if (optind != argc - 1) { usage(argv[0]); return 1; } fd = open("/dev/net/tun", O_RDWR); if (fd == -1) { perror("/dev/net/tun"); return 1; } memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, argv[optind], sizeof(ifr.ifr_name)); ifr.ifr_flags = IFF_NO_PI; if (tap) ifr.ifr_flags |= IFF_TAP; else ifr.ifr_flags |= IFF_TUN; if (ioctl(fd, TUNSETIFF, &ifr) == -1) { perror("TUNSETIFF"); return 1; } if (ioctl(fd, TUNSETPERSIST, delete ? 0 : 1) == -1) { perror("TUNSETPERSIST"); return 1; } close(fd); return 0; }