Revert "Add 'set-kernel'/'get-kernel'/LIBGUESTFS_KERNEL to override appliance kernel."
[libguestfs.git] / src / guestfs.c
index f445ada..db6db91 100644 (file)
@@ -875,7 +875,8 @@ static const char *supermin_hostfiles_name =
 int
 guestfs_launch (guestfs_h *g)
 {
-  static const char *dir_template = "/tmp/libguestfsXXXXXX";
+  const char *tmpdir;
+  char dir_template[PATH_MAX];
   int r, i, pmore;
   size_t len;
   int wfd[2], rfd[2];
@@ -885,6 +886,15 @@ guestfs_launch (guestfs_h *g)
   char unixsock[256];
   struct sockaddr_un addr;
 
+#ifdef P_tmpdir
+  tmpdir = P_tmpdir;
+#else
+  tmpdir = "/tmp";
+#endif
+
+  tmpdir = getenv ("TMPDIR") ? : tmpdir;
+  snprintf (dir_template, sizeof dir_template, "%s/libguestfsXXXXXX", tmpdir);
+
   /* Configured? */
   if (!g->cmdline) {
     error (g, _("you must call guestfs_add_drive before guestfs_launch"));
@@ -1028,14 +1038,16 @@ guestfs_launch (guestfs_h *g)
      */
     g->cmdline[0] = g->qemu;
 
-    /* Construct the -net channel parameter for qemu. */
-    snprintf (vmchannel, sizeof vmchannel,
-             "channel,%d:unix:%s,server,nowait",
-             VMCHANNEL_PORT, unixsock);
+#define LINUX_CMDLINE                                                  \
+    "panic=1 "         /* force kernel to panic if daemon exits */     \
+    "console=ttyS0 "   /* serial console */                            \
+    "udevtimeout=300 " /* good for very slow systems (RHBZ#480319) */  \
+    "noapic "          /* workaround for RHBZ#502058 - ok if not SMP */ \
+    "acpi=off "        /* we don't need ACPI, turn it off */
 
     /* Linux kernel command line. */
     snprintf (append, sizeof append,
-             "panic=1 console=ttyS0 guestfs=%s:%d%s%s%s",
+             LINUX_CMDLINE "guestfs=%s:%d%s%s%s",
              VMCHANNEL_ADDR, VMCHANNEL_PORT,
              g->verbose ? " guestfs_verbose=1" : "",
              g->append ? " " : "", g->append ? g->append : "");
@@ -1054,10 +1066,38 @@ guestfs_launch (guestfs_h *g)
     add_cmdline (g, "-nographic");
     add_cmdline (g, "-serial");
     add_cmdline (g, "stdio");
-    add_cmdline (g, "-net");
-    add_cmdline (g, vmchannel);
-    add_cmdline (g, "-net");
-    add_cmdline (g, "user,vlan=0");
+
+#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:
+       * http://git.savannah.gnu.org/cgit/qemu.git/commit/?id=c92ef6a22d3c71538fcc48fb61ad353f7ba03b62
+       */
+      snprintf (vmchannel, sizeof vmchannel,
+               "user,vlan=0,guestfwd=tcp:%s:%d-unix:%s,server,nowait",
+               VMCHANNEL_ADDR, VMCHANNEL_PORT, unixsock);
+
+      add_cmdline (g, "-net");
+      add_cmdline (g, vmchannel);
+    } 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);
+
+      add_cmdline (g, "-net");
+      add_cmdline (g, vmchannel);
+      add_cmdline (g, "-net");
+      add_cmdline (g, "user,vlan=0");
+#if 0
+    }
+#endif
     add_cmdline (g, "-net");
     add_cmdline (g, "nic,model=virtio,vlan=0");