Remove local LIBGUESTFS_PATH detection from guestfish and guestmount.
[libguestfs.git] / src / launch.c
index 261136d..a60ef7b 100644 (file)
@@ -1,5 +1,5 @@
 /* libguestfs
- * Copyright (C) 2009-2010 Red Hat Inc.
+ * Copyright (C) 2009-2011 Red Hat Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -71,6 +71,7 @@
 #include "guestfs_protocol.h"
 
 static int launch_appliance (guestfs_h *g);
+static int64_t timeval_diff (const struct timeval *x, const struct timeval *y);
 static int connect_unix_socket (guestfs_h *g, const char *sock);
 static int qemu_supports (guestfs_h *g, const char *option);
 
@@ -393,7 +394,7 @@ launch_appliance (guestfs_h *g)
 {
   int r;
   int wfd[2], rfd[2];
-  char unixsock[256];
+  char guestfsd_sock[256];
   struct sockaddr_un addr;
 
   /* At present you must add drives before starting the appliance.  In
@@ -406,12 +407,15 @@ launch_appliance (guestfs_h *g)
 
   /* Start the clock ... */
   gettimeofday (&g->launch_t, NULL);
+  guestfs___launch_send_progress (g, 0);
 
   /* Locate and/or build the appliance. */
   char *kernel = NULL, *initrd = NULL, *appliance = NULL;
   if (guestfs___build_appliance (g, &kernel, &initrd, &appliance) == -1)
     return -1;
 
+  guestfs___launch_send_progress (g, 3);
+
   if (g->verbose)
     guestfs___print_timestamped_message (g, "begin testing qemu features");
 
@@ -422,8 +426,8 @@ launch_appliance (guestfs_h *g)
   /* Using virtio-serial, we need to create a local Unix domain socket
    * for qemu to connect to.
    */
-  snprintf (unixsock, sizeof unixsock, "%s/sock", g->tmpdir);
-  unlink (unixsock);
+  snprintf (guestfsd_sock, sizeof guestfsd_sock, "%s/guestfsd.sock", g->tmpdir);
+  unlink (guestfsd_sock);
 
   g->sock = socket (AF_UNIX, SOCK_STREAM, 0);
   if (g->sock == -1) {
@@ -437,7 +441,7 @@ launch_appliance (guestfs_h *g)
   }
 
   addr.sun_family = AF_UNIX;
-  strncpy (addr.sun_path, unixsock, UNIX_PATH_MAX);
+  strncpy (addr.sun_path, guestfsd_sock, UNIX_PATH_MAX);
   addr.sun_path[UNIX_PATH_MAX-1] = '\0';
 
   if (bind (g->sock, &addr, sizeof addr) == -1) {
@@ -546,7 +550,7 @@ launch_appliance (guestfs_h *g)
 
     /* Set up virtio-serial for the communications channel. */
     add_cmdline (g, "-chardev");
-    snprintf (buf, sizeof buf, "socket,path=%s,id=channel0", unixsock);
+    snprintf (buf, sizeof buf, "socket,path=%s,id=channel0", guestfsd_sock);
     add_cmdline (g, buf);
     add_cmdline (g, "-device");
     add_cmdline (g, "virtserialport,chardev=channel0,name=org.libguestfs.channel.0");
@@ -760,6 +764,8 @@ launch_appliance (guestfs_h *g)
     goto cleanup1;
   }
 
+  guestfs___launch_send_progress (g, 12);
+
   return 0;
 
  cleanup1:
@@ -861,6 +867,36 @@ connect_unix_socket (guestfs_h *g, const char *sockpath)
   return -1;
 }
 
+/* launch (of the ordinary appliance) generates approximate progress
+ * messages.  Currently these are defined as follows:
+ *
+ *    0 / 12: launch clock starts
+ *    3 / 12: appliance created
+ *    6 / 12: detected that guest kernel started
+ *    9 / 12: detected that /init script is running
+ *   12 / 12: launch completed successfully
+ *
+ * Notes:
+ * (1) This is not a documented ABI and the behaviour may be changed
+ * or removed in future.
+ * (2) Messages are only sent if more than 5 seconds has elapsed
+ * since the launch clock started.
+ * (3) There is a gross hack in proto.c to make this work.
+ */
+void
+guestfs___launch_send_progress (guestfs_h *g, int perdozen)
+{
+  struct timeval tv;
+
+  gettimeofday (&tv, NULL);
+  if (timeval_diff (&g->launch_t, &tv) >= 5000) {
+    guestfs_progress progress_message =
+      { .proc = 0, .serial = 0, .position = perdozen, .total = 12 };
+
+    guestfs___progress_message_callback (g, &progress_message);
+  }
+}
+
 /* Return the location of the tmpdir (eg. "/tmp") and allow users
  * to override it at runtime using $TMPDIR.
  * http://www.pathname.com/fhs/pub/fhs-2.3.html#TMPTEMPORARYFILES