Enable new-style -chardev ... guestfwd command line.
[libguestfs.git] / src / guestfs.c
index 17974fd..c735c1c 100644 (file)
@@ -85,8 +85,8 @@ static void close_handles (void);
 #define UNIX_PATH_MAX 108
 
 /* Also in guestfsd.c */
-#define VMCHANNEL_PORT 6666
-#define VMCHANNEL_ADDR "10.0.2.4"
+#define GUESTFWD_PORT 6666
+#define GUESTFWD_ADDR "10.0.2.4"
 
 /* GuestFS handle and connection. */
 enum state { CONFIG, LAUNCHING, READY, BUSY, NO_HANDLE };
@@ -983,7 +983,7 @@ guestfs__launch (guestfs_h *g)
   }
 
   if (r == 0) {                        /* Child (qemu). */
-    char vmchannel[256];
+    char buf[256];
     char append[256];
     char memsize_str[256];
 
@@ -1003,11 +1003,9 @@ guestfs__launch (guestfs_h *g)
     /* Linux kernel command line. */
     snprintf (append, sizeof append,
               LINUX_CMDLINE
-              "guestfs=%s:%d "
               "%s"              /* (selinux) */
               "%s"              /* (verbose) */
               "%s",             /* (append) */
-              VMCHANNEL_ADDR, VMCHANNEL_PORT,
               g->selinux ? "selinux=1 enforcing=0 " : "selinux=0 ",
               g->verbose ? "guestfs_verbose=1 " : " ",
               g->append ? g->append : "");
@@ -1027,37 +1025,43 @@ guestfs__launch (guestfs_h *g)
     add_cmdline (g, "-serial");
     add_cmdline (g, "stdio");
 
-#if 0
-    /* Doesn't work.  See:
-     * http://lists.gnu.org/archive/html/qemu-devel/2009-07/threads.html
-     * Subject "guestfwd option doesn't allow supplementary ,server,nowait"
-     */
-    if (qemu_supports (g, "guestfwd")) {
-      /* New-style -net user,guestfwd=... syntax for vmchannel.  See:
+    if (qemu_supports (g, "-chardev") && qemu_supports (g, "guestfwd")) {
+      /* New-style -net user,guestfwd=... syntax for guestfwd.  See:
+       *
        * http://git.savannah.gnu.org/cgit/qemu.git/commit/?id=c92ef6a22d3c71538fcc48fb61ad353f7ba03b62
+       *
+       * The original suggested format doesn't work, see:
+       *
+       * http://lists.gnu.org/archive/html/qemu-devel/2009-07/msg01654.html
+       *
+       * However Gerd Hoffman privately suggested to me using -chardev
+       * instead, which does work.
        */
-      snprintf (vmchannel, sizeof vmchannel,
-                "user,vlan=0,net=10.0.2.0/8,guestfwd=tcp:%s:%d-unix:%s,server,nowait",
-                VMCHANNEL_ADDR, VMCHANNEL_PORT, unixsock);
+      snprintf (buf, sizeof buf,
+                "socket,id=guestfsvmc,path=%s,server,nowait", unixsock);
+
+      add_cmdline (g, "-chardev");
+      add_cmdline (g, buf);
+
+      snprintf (buf, sizeof buf,
+                "user,vlan=0,net=10.0.2.0/8,"
+                "guestfwd=tcp:%s:%d-chardev:guestfsvmc",
+                GUESTFWD_ADDR, GUESTFWD_PORT);
 
       add_cmdline (g, "-net");
-      add_cmdline (g, vmchannel);
+      add_cmdline (g, buf);
     } else {
-#endif
       /* Not guestfwd.  HOPEFULLY this qemu uses the older -net channel
        * syntax, or if not then we'll get a quick failure.
        */
-      snprintf (vmchannel, sizeof vmchannel,
-                "channel,%d:unix:%s,server,nowait",
-                VMCHANNEL_PORT, unixsock);
+      snprintf (buf, sizeof buf,
+                "channel,%d:unix:%s,server,nowait", GUESTFWD_PORT, unixsock);
 
       add_cmdline (g, "-net");
-      add_cmdline (g, vmchannel);
+      add_cmdline (g, buf);
       add_cmdline (g, "-net");
       add_cmdline (g, "user,vlan=0,net=10.0.2.0/8");
-#if 0
     }
-#endif
     add_cmdline (g, "-net");
     add_cmdline (g, "nic,model=" NET_IF ",vlan=0");
 
@@ -1900,20 +1904,20 @@ recv_from_daemon (guestfs_h *g, uint32_t *size_rtn, void **buf_rtn)
   }
 
   /* Got the full message, caller can start processing it. */
-#if 0
+#ifdef ENABLE_PACKET_DUMP
   if (g->verbose) {
-    size_t i, j;
+    ssize_t i, j;
 
     for (i = 0; i < nr; i += 16) {
-      printf ("%04x: ", i);
+      printf ("%04zx: ", i);
       for (j = i; j < MIN (i+16, nr); ++j)
-        printf ("%02x ", (unsigned char) (*buf_rtn)[j]);
+        printf ("%02x ", (*(unsigned char **)buf_rtn)[j]);
       for (; j < i+16; ++j)
         printf ("   ");
       printf ("|");
-      for (j = i; j < MIN (i+16, g->nr); ++j)
-        if (isprint ((*buf_rtn)[j]))
-          printf ("%c", (*buf_rtn)[j]);
+      for (j = i; j < MIN (i+16, nr); ++j)
+        if (isprint ((*(char **)buf_rtn)[j]))
+          printf ("%c", (*(char **)buf_rtn)[j]);
         else
           printf (".");
       for (; j < i+16; ++j)