2 * $Id: tundev.c 325 2008-08-09 21:39:16Z aurel32 $
5 #define _GNU_SOURCE /* asprintf */
12 #include <sys/ioctl.h>
17 #include <linux/if_tun.h>
19 /* Tiny code to open tap/tun device, and hand the fd to qemu.
20 Run as root, drops to given user. */
21 int main(int argc, char *argv[])
26 char *newargs[argc + 1];
31 "Usage: tundev user logfile qemu <qemu options>...\n");
35 fd = open("/dev/net/tun", O_RDWR);
37 perror("Could not open /dev/net/tun");
41 memset(&ifr, 0, sizeof(ifr));
42 ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
43 strncpy(ifr.ifr_name, "tun%d", IFNAMSIZ);
44 if (ioctl(fd, TUNSETIFF, (void *) &ifr) != 0) {
45 perror("Could not get tun device");
50 p = getpwnam(argv[1]);
52 fprintf(stderr, "No user '%s'\n", argv[1]);
57 if (setuid(p->pw_uid) != 0) {
58 perror("setting uid");
64 newargs[1] = "-tun-fd";
65 asprintf(&newargs[2], "%d", fd);
66 for (i = 4; i <= argc; i++)
67 newargs[i-1] = argv[i];
69 if (strcmp(argv[2], "-") == 0) {
70 execvp(newargs[0], newargs);
78 open(argv[2], O_WRONLY|O_APPEND);
79 open(argv[2], O_WRONLY|O_APPEND);
81 execvp(newargs[0], newargs);
85 perror("fork failed");
88 printf("%s\n", ifr.ifr_name);