From 34d2df41626f1ee4172a6d40b06d72d6ed9d6348 Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Wed, 22 Jul 2009 13:35:48 +0100 Subject: [PATCH] Add 'set-kernel'/'get-kernel'/LIBGUESTFS_KERNEL to override appliance kernel. This allows you to override the appliance kernel with an easy command or environment variable. --- guestfish.pod | 4 ++++ guestfs.pod | 4 ++++ src/generator.ml | 25 +++++++++++++++++++++++++ src/guestfs.c | 25 ++++++++++++++++++++++++- 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/guestfish.pod b/guestfish.pod index f2255f1..6f35ac4 100644 --- a/guestfish.pod +++ b/guestfish.pod @@ -553,6 +553,10 @@ Pass additional options to the guest kernel. Set C to enable verbose messages. This has the same effect as using the B<-v> option. +=item LIBGUESTFS_KERNEL + +Override the ordinary selection of appliance kernel. + =item LIBGUESTFS_MEMSIZE Set the memory allocated to the qemu process, in megabytes. For diff --git a/guestfs.pod b/guestfs.pod index 4235454..9e0d4d3 100644 --- a/guestfs.pod +++ b/guestfs.pod @@ -917,6 +917,10 @@ Pass additional options to the guest kernel. Set C to enable verbose messages. This has the same effect as calling C. +=item LIBGUESTFS_KERNEL + +Override the ordinary selection of appliance kernel. + =item LIBGUESTFS_MEMSIZE Set the memory allocated to the qemu process, in megabytes. For diff --git a/src/generator.ml b/src/generator.ml index 8751bb5..398fd04 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -530,6 +530,31 @@ guest kernel command line. If C then no options are added."); + ("set_kernel", (RErr, [String "kernel"]), -1, [FishAlias "kernel"], + [], + "override the normal appliance kernel", + "\ +This function lets you override the ordinary selection +of kernel used in the appliance. + +The default is C unless overridden by setting +C environment variable. + +Setting C to C means the ordinary appliance +kernel is selected by the usual means."); + + ("get_kernel", (RConstString "kernel", []), -1, [], + (* This cannot be tested with the current framework. The + * function can return NULL in normal operations, which the + * test framework interprets as an error. + *) + [], + "get the override appliance kernel", + "\ +Return the override appliance kernel (see C). + +If C then the ordinary appliance kernel is used."); + ("set_autosync", (RErr, [Bool "autosync"]), -1, [FishAlias "autosync"], [], "set autosync mode", diff --git a/src/guestfs.c b/src/guestfs.c index db6db91..5750a4f 100644 --- a/src/guestfs.c +++ b/src/guestfs.c @@ -174,6 +174,7 @@ struct guestfs_h char *path; /* Path to kernel, initrd. */ char *qemu; /* Qemu binary. */ char *append; /* Append to kernel command line. */ + char *kernel; /* Override appliance kernel. */ int memsize; /* Size of RAM (megabytes). */ @@ -249,6 +250,12 @@ guestfs_create (void) if (!g->append) goto error; } + str = getenv ("LIBGUESTFS_KERNEL"); + if (str) { + g->kernel = strdup (str); + if (!g->kernel) goto error; + } + /* Choose a suitable memory size. Previously we tried to choose * a minimal memory size, but this isn't really necessary since * recent QEMU and KVM don't do anything nasty like locking @@ -674,6 +681,22 @@ guestfs_get_append (guestfs_h *g) } int +guestfs_set_kernel (guestfs_h *g, const char *kernel) +{ + free (g->kernel); + g->kernel = NULL; + + g->kernel = kernel ? safe_strdup (g, kernel) : NULL; + return 0; +} + +const char * +guestfs_get_kernel (guestfs_h *g) +{ + return g->kernel; +} + +int guestfs_set_memsize (guestfs_h *g, int memsize) { g->memsize = memsize; @@ -1058,7 +1081,7 @@ guestfs_launch (guestfs_h *g) add_cmdline (g, memsize_str); add_cmdline (g, "-no-reboot"); /* Force exit instead of reboot on panic */ add_cmdline (g, "-kernel"); - add_cmdline (g, (char *) kernel); + add_cmdline (g, g->kernel ? : (char *) kernel); add_cmdline (g, "-initrd"); add_cmdline (g, (char *) initrd); add_cmdline (g, "-append"); -- 1.8.3.1