From: James R. L. <jl...@mi...> - 2002-02-14 16:52:03
|
I made the command line to tunctl a little more usable. -I added the ability to specify the tap interfaces to create. -Setting the UID is optional. -My tun device is /dev/misc/net/tun so I added an option to specify it. -Usage() now is a bit more informational. Jim -- James R. Leu ----------------------------- snip -------------------------------------- --- tunctl.c Thu Feb 14 11:38:02 2002 +++ tunctl.c.new Thu Feb 14 11:48:38 2002 @@ -7,49 +7,70 @@ #include <string.h> #include <errno.h> #include <fcntl.h> +#include <unistd.h> #include <net/if.h> #include <sys/ioctl.h> #include <linux/if_tun.h> -static void Usage(void) +static void Usage(char *name) { - fprintf(stderr, "persist uid\n"); - fprintf(stderr, "persist -nopersist device-name\n"); + fprintf(stderr, "Create: %s [-u owner] [-t device-name] [-f /dev/misc/net/tun]\n", name); + fprintf(stderr, "Delete: %s -d -t device-name [-f /dev/misc/net/tun]\n", name); exit(1); } int main(int argc, char **argv) { struct ifreq ifr; - char *end, *dev = ""; - long owner; + long owner = -1; int tap_fd; + char *tun = ""; + char *file = "/dev/net/tun"; + int opt; + int delete = 0; - argc--; - argv++; - if(argc == 0) Usage(); - if(!strcmp(*argv, "-nopersist")){ - if(argc < 2) Usage(); - dev = argv[1]; + if(argc == 1) Usage(argv[0]); + + while ((opt = getopt(argc,argv,"dt:u:f:h")) > 0) { + switch(opt) { + case 'f': + file = optarg; + break; + case 'd': + delete = 1; + break; + case 't': + tun = optarg; + break; + case 'p': + owner = strtol(optarg,NULL,0); + break; + case 'h': + default: + Usage(argv[0]); + return -1; + } } - else if(argc > 0){ - owner = strtol(*argv, &end, 0); - if(*end != '\0') Usage(); + + if (delete && *tun == '\0') { + Usage(argv[0]); + return -1; } - else Usage(); - if((tap_fd = open("/dev/net/tun", O_RDWR)) < 0){ - perror("opening /dev/net/tun"); + if((tap_fd = open(file, O_RDWR)) < 0){ + perror("opening tun device"); exit(1); } + memset(&ifr, 0, sizeof(ifr)); ifr.ifr_flags = IFF_TAP | IFF_NO_PI; - strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name) - 1); + strncpy(ifr.ifr_name, tun, sizeof(ifr.ifr_name) - 1); if(ioctl(tap_fd, TUNSETIFF, (void *) &ifr) < 0){ perror("TUNSETIFF"); exit(1); } - if(*dev != '\0'){ + + if(delete) { if(ioctl(tap_fd, TUNSETPERSIST, 0) < 0){ perror("TUNSETPERSIST"); exit(1); @@ -61,9 +82,13 @@ perror("TUNSETPERSIST"); exit(1); } - if(ioctl(tap_fd, TUNSETOWNER, owner) < 0){ - perror("TUNSETPERSIST"); - exit(1); + if (owner != -1) { + if(ioctl(tap_fd, TUNSETOWNER, owner) < 0){ + perror("TUNSETPERSIST"); + exit(1); + } + } else { + owner = getuid(); } printf("Set '%s' persistent and owned by uid %ld\n", ifr.ifr_name, owner); } |