New APIs: set-attach-method, get-attach-method.
authorRichard W.M. Jones <rjones@redhat.com>
Thu, 27 Jan 2011 11:20:43 +0000 (11:20 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Thu, 3 Feb 2011 18:41:49 +0000 (18:41 +0000)
These allow you to get and set the attach method.  The format
is one of:

* appliance
* unix:<path>

It's stored broken out into an enum and a string in the handle.

generator/generator_actions.ml
src/guestfs-internal.h
src/guestfs.c

index 0ae8790..a2e7467 100644 (file)
@@ -1368,6 +1368,36 @@ part of a set.
 
 Please read L<guestfs(3)/INSPECTION> for more details.");
 
+  ("set_attach_method", (RErr, [String "attachmethod"], []), -1, [FishAlias "attach-method"],
+   [],
+   "set the attach method",
+   "\
+Set the method that libguestfs uses to connect to the back end
+guestfsd daemon.  Possible methods are:
+
+=over 4
+
+=item C<appliance>
+
+Launch an appliance and connect to it.  This is the ordinary method
+and the default.
+
+=item C<unix:I<path>>
+
+Connect to the Unix domain socket I<path>.
+
+This method lets you connect to an existing daemon or (using
+virtio-serial) to a live guest.
+
+=back");
+
+  ("get_attach_method", (RString "attachmethod", [], []), -1, [],
+   [InitNone, Always, TestOutput (
+      [["get_attach_method"]], "appliance")],
+   "get the attach method",
+   "\
+Return the current attach method.  See C<guestfs_set_attach_method>.");
+
 ]
 
 (* daemon_functions are any functions which cause some action
index 194c892..0eb395b 100644 (file)
@@ -84,6 +84,9 @@
 /* GuestFS handle and connection. */
 enum state { CONFIG, LAUNCHING, READY, BUSY, NO_HANDLE };
 
+/* Attach method. */
+enum attach_method { ATTACH_METHOD_APPLIANCE = 0, ATTACH_METHOD_UNIX };
+
 struct guestfs_h
 {
   struct guestfs_h *next;      /* Linked list of open handles. */
@@ -116,6 +119,9 @@ struct guestfs_h
   char *qemu;                  /* Qemu binary. */
   char *append;                        /* Append to kernel command line. */
 
+  enum attach_method attach_method;
+  char *attach_method_arg;
+
   int memsize;                 /* Size of RAM (megabytes). */
 
   int selinux;                  /* selinux enabled? */
index 79fc5bf..8b7ab4d 100644 (file)
@@ -645,6 +645,51 @@ guestfs__get_network (guestfs_h *g)
   return g->enable_network;
 }
 
+int
+guestfs__set_attach_method (guestfs_h *g, const char *method)
+{
+  if (STREQ (method, "appliance")) {
+    g->attach_method = ATTACH_METHOD_APPLIANCE;
+    free (g->attach_method_arg);
+    g->attach_method_arg = NULL;
+  }
+  else if (STRPREFIX (method, "unix:") && strlen (method) > 5) {
+    g->attach_method = ATTACH_METHOD_UNIX;
+    free (g->attach_method_arg);
+    g->attach_method_arg = safe_strdup (g, method + 5);
+    /* Note that we don't check the path exists until launch is called. */
+  }
+  else {
+    error (g, "invalid attach method: %s", method);
+    return -1;
+  }
+
+  return 0;
+}
+
+char *
+guestfs__get_attach_method (guestfs_h *g)
+{
+  char *ret;
+
+  switch (g->attach_method) {
+  case ATTACH_METHOD_APPLIANCE:
+    ret = safe_strdup (g, "appliance");
+    break;
+
+  case ATTACH_METHOD_UNIX:
+    ret = safe_malloc (g, strlen (g->attach_method_arg) + 5 + 1);
+    strcpy (ret, "unix:");
+    strcat (ret, g->attach_method_arg);
+    break;
+
+  default: /* keep GCC happy - this is not reached */
+    abort ();
+  }
+
+  return ret;
+}
+
 void
 guestfs_set_log_message_callback (guestfs_h *g,
                                   guestfs_log_message_cb cb, void *opaque)