X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=src%2Fguestfs.c;h=5743a07181f9e4887f0e8589bd2725ac68d2bdbc;hp=02b3ceb35c30ff0587fafa9fae4b4358b1557664;hb=3d15f7e652340777514ff30c3cfc560a90b612ec;hpb=675411d34f807420d1b714436fc5a58fc0022dae diff --git a/src/guestfs.c b/src/guestfs.c index 02b3ceb..5743a07 100644 --- a/src/guestfs.c +++ b/src/guestfs.c @@ -174,6 +174,8 @@ struct guestfs_h char *qemu; /* Qemu binary. */ char *append; /* Append to kernel command line. */ + int memsize; /* Size of RAM (megabytes). */ + char *last_error; /* Callbacks. */ @@ -246,6 +248,22 @@ guestfs_create (void) if (!g->append) 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 + * memory into core any more. Thus we can safely choose a + * large, generous amount of memory, and it'll just get swapped + * on smaller systems. + */ + str = getenv ("LIBGUESTFS_MEMSIZE"); + if (str) { + if (sscanf (str, "%d", &g->memsize) != 1 || g->memsize <= 256) { + fprintf (stderr, "libguestfs: non-numeric or too small value for LIBGUESTFS_MEMSIZE\n"); + goto error; + } + } else + g->memsize = 500; + g->main_loop = guestfs_get_default_main_loop (); /* Start with large serial numbers so they are easy to spot @@ -597,6 +615,19 @@ guestfs_get_append (guestfs_h *g) return g->append; } +int +guestfs_set_memsize (guestfs_h *g, int memsize) +{ + g->memsize = memsize; + return 0; +} + +int +guestfs_get_memsize (guestfs_h *g) +{ + return g->memsize; +} + /* Add a string to the current command line. */ static void incr_cmdline_size (guestfs_h *g) @@ -763,7 +794,7 @@ int guestfs_launch (guestfs_h *g) { static const char *dir_template = "/tmp/libguestfsXXXXXX"; - int r, i, pmore, memsize; + int r, i, pmore; size_t len; int wfd[2], rfd[2]; int tries; @@ -882,15 +913,6 @@ guestfs_launch (guestfs_h *g) goto cleanup0; } - /* 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 - * memory into core any more. Thus we can safely choose a - * large, generous amount of memory, and it'll just get swapped - * on smaller systems. - */ - memsize = 384; - /* Get qemu help text and version. */ if (test_qemu (g) == -1) goto cleanup0; @@ -936,7 +958,7 @@ guestfs_launch (guestfs_h *g) g->verbose ? " guestfs_verbose=1" : "", g->append ? " " : "", g->append ? g->append : ""); - snprintf (memsize_str, sizeof memsize_str, "%d", memsize); + snprintf (memsize_str, sizeof memsize_str, "%d", g->memsize); add_cmdline (g, "-m"); add_cmdline (g, memsize_str); @@ -1677,7 +1699,7 @@ static void sock_write_event (struct guestfs_main_loop *ml, guestfs_h *g, void *data, int watch, int fd, int events) { - int n; + int n, err; if (g->verbose) fprintf (stderr, @@ -1701,8 +1723,11 @@ sock_write_event (struct guestfs_main_loop *ml, guestfs_h *g, void *data, n = write (g->sock, g->msg_out + g->msg_out_pos, g->msg_out_size - g->msg_out_pos); if (n == -1) { - if (errno != EAGAIN) + err = errno; + if (err != EAGAIN) perrorf (g, "write"); + if (err == EPIPE) /* Disconnected from guest (RHBZ#508713). */ + child_cleanup (g); return; }