qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] -tun-fd option


From: Rusty Russell
Subject: [Qemu-devel] [PATCH] -tun-fd option
Date: Thu, 18 Sep 2003 10:55:06 +1000

Hi all,

        Played a bit with getting qemu to work with uml_switch, but I
found it too baroque.  This approach worked really well for me: get a
helper to open and configure the tun file descriptor and hand it off
to vl.

Like so: (in practice I use a variant of this which takes a uid, since
I ended up running it as root from an init script).

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <net/if.h>
#include <linux/if_tun.h>

/* Tiny code to open tap/tun device, and hand the fd to vl.
   Run setuid root, drops privs. */
int main(int argc, char *argv[])
{
        struct ifreq ifr;
        int fd;

        if (argc == 1) {
                fprintf(stderr, "Usage: tundev vl <vl options>...\n");
                exit(1);
        }

        fd = open("/dev/net/tun", O_RDWR);
        if (fd < 0) {
                perror("Could not open /dev/net/tun");
                exit(1);
        }

        memset(&ifr, 0, sizeof(ifr));
        ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
        strncpy(ifr.ifr_name, "tun%d", IFNAMSIZ);
        if (ioctl(fd, TUNSETIFF, (void *) &ifr) != 0) {
                perror("Could not get tun device");
                exit(1);
        }
        printf("Got tun device %s on fd %i\n", ifr.ifr_name, fd);

        /* Drop effective uid. */
        setuid(getuid());

        /* Insert -tun-fd=3 arg. */
        argv[0] = argv[1];
        asprintf(&argv[1], "-tun-fd=%d", fd);
        execvp(argv[0], argv);
        perror("Exec of vl failed");
        exit(1);
}
--
  Anyone who quotes me in their sig is an idiot. -- Rusty Russell.


diff -ur qemu-0.4.3/vl.c qemu-0.4.3-umlswitch/qemu-0.4.3-umlswitch/vl.c
--- qemu-0.4.3/vl.c     2003-07-14 08:12:05.000000000 +1000
+++ qemu-0.4.3/vl.c     2003-09-16 16:33:49.000000000 +1000
@@ -2635,6 +2639,7 @@
           "-snapshot      write to temporary files instead of disk image 
files\n"
            "-m megs        set virtual RAM size to megs MB\n"
            "-n script      set network init script [default=%s]\n"
+           "-tun-fd=fd     this fd talks to tap/tun, use it.\n"
            "\n"
            "Debug options:\n"
            "-s             wait gdb connection to port %d\n"
@@ -2652,6 +2657,7 @@
     { "hda", 1, NULL, 0, },
     { "hdb", 1, NULL, 0, },
     { "snapshot", 0, NULL, 0, },
+    { "tun-fd", 1, NULL, 0, },
     { NULL, 0, NULL, 0 },
 };
 
@@ -2695,6 +2702,9 @@
             case 3:
                 snapshot = 1;
                 break;
+           case 4:
+               net_fd = atoi(optarg);
+               break;
             }
             break;
         case 'h':
@@ -2739,7 +2749,8 @@
     }
 
     /* init network tun interface */
-    net_init();
+    if (net_fd < 0)
+       net_init();
 
     /* init the memory */
     tmpdir = getenv("VLTMPDIR");




reply via email to

[Prev in Thread] Current Thread [Next in Thread]