diff options
-rw-r--r-- | generator/generator_actions.ml | 30 | ||||
-rw-r--r-- | src/guestfs-internal.h | 6 | ||||
-rw-r--r-- | src/guestfs.c | 45 |
3 files changed, 81 insertions, 0 deletions
diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml index 0ae87902..a2e7467f 100644 --- a/generator/generator_actions.ml +++ b/generator/generator_actions.ml @@ -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 diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h index 194c8928..0eb395b9 100644 --- a/src/guestfs-internal.h +++ b/src/guestfs-internal.h @@ -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? */ diff --git a/src/guestfs.c b/src/guestfs.c index 79fc5bfa..8b7ab4d7 100644 --- a/src/guestfs.c +++ b/src/guestfs.c @@ -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) |