X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=src%2Flaunch.c;h=a7a86b97f135533a5ec2dfc5349e22d3f25cea19;hb=61a1a2b71c4811b9d6233a43db74229b9364f0c6;hp=047a1e154df540fc03cba1b0bad1342aa40cf61d;hpb=61da709722ec244da1c3c7d4f1a8706f76687cb3;p=libguestfs.git diff --git a/src/launch.c b/src/launch.c index 047a1e1..a7a86b9 100644 --- a/src/launch.c +++ b/src/launch.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -101,6 +102,49 @@ add_cmdline (guestfs_h *g, const char *str) } int +guestfs___checkpoint_cmdline (guestfs_h *g) +{ + return g->cmdline_size; +} + +void +guestfs___rollback_cmdline (guestfs_h *g, int pos) +{ + int i; + + assert (g->cmdline_size >= pos); + + for (i = g->cmdline_size - 1; i >= pos; --i) + free (g->cmdline[i]); + + g->cmdline_size = pos; +} + +/* Internal command to return the command line. */ +char ** +guestfs__debug_cmdline (guestfs_h *g) +{ + int i; + char **r; + + if (g->cmdline == NULL) { + r = safe_malloc (g, sizeof (char *) * 1); + r[0] = NULL; + return r; + } + + r = safe_malloc (g, sizeof (char *) * (g->cmdline_size + 1)); + r[0] = safe_strdup (g, g->qemu); /* g->cmdline[0] is always NULL */ + + for (i = 1; i < g->cmdline_size; ++i) + r[i] = safe_strdup (g, g->cmdline[i]); + + r[g->cmdline_size] = NULL; + + return r; /* caller frees */ +} + +int guestfs__config (guestfs_h *g, const char *qemu_param, const char *qemu_value) { @@ -302,14 +346,12 @@ guestfs__add_cdrom (guestfs_h *g, const char *filename) } static int is_openable (guestfs_h *g, const char *path, int flags); -static void print_cmdline (guestfs_h *g); int guestfs__launch (guestfs_h *g) { int r; int wfd[2], rfd[2]; - int tries; char unixsock[256]; struct sockaddr_un addr; @@ -546,7 +588,7 @@ guestfs__launch (guestfs_h *g) g->cmdline[g->cmdline_size-1] = NULL; if (g->verbose) - print_cmdline (g); + guestfs___print_timestamped_argv (g, (const char **)g->cmdline); if (!g->direct) { /* Set up stdin, stdout. */ @@ -728,6 +770,7 @@ guestfs__launch (guestfs_h *g) /* 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 */ const char * guestfs_tmpdir (void) @@ -746,31 +789,21 @@ guestfs_tmpdir (void) return tmpdir; } -/* This function is used to print the qemu command line before it gets - * executed, when in verbose mode. +/* Return the location of the persistent tmpdir (eg. "/var/tmp") and + * allow users to override it at runtime using $TMPDIR. + * http://www.pathname.com/fhs/pub/fhs-2.3.html#VARTMPTEMPORARYFILESPRESERVEDBETWEE */ -static void -print_cmdline (guestfs_h *g) +const char * +guestfs___persistent_tmpdir (void) { - int i = 0; - int needs_quote; - - while (g->cmdline[i]) { - if (g->cmdline[i][0] == '-') /* -option starts a new line */ - fprintf (stderr, " \\\n "); - - if (i > 0) fputc (' ', stderr); + const char *tmpdir; - /* Does it need shell quoting? This only deals with simple cases. */ - needs_quote = strcspn (g->cmdline[i], " ") != strlen (g->cmdline[i]); + tmpdir = "/var/tmp"; - if (needs_quote) fputc ('\'', stderr); - fprintf (stderr, "%s", g->cmdline[i]); - if (needs_quote) fputc ('\'', stderr); - i++; - } + const char *t = getenv ("TMPDIR"); + if (t) tmpdir = t; - fputc ('\n', stderr); + return tmpdir; } /* Compute Y - X and return the result in milliseconds. @@ -788,6 +821,34 @@ timeval_diff (const struct timeval *x, const struct timeval *y) } void +guestfs___print_timestamped_argv (guestfs_h *g, const char * argv[]) +{ + int i = 0; + int needs_quote; + + struct timeval tv; + gettimeofday (&tv, NULL); + fprintf (stderr, "[%05" PRIi64 "ms] ", timeval_diff (&g->launch_t, &tv)); + + while (argv[i]) { + if (argv[i][0] == '-') /* -option starts a new line */ + fprintf (stderr, " \\\n "); + + if (i > 0) fputc (' ', stderr); + + /* Does it need shell quoting? This only deals with simple cases. */ + needs_quote = strcspn (argv[i], " ") != strlen (argv[i]); + + if (needs_quote) fputc ('\'', stderr); + fprintf (stderr, "%s", argv[i]); + if (needs_quote) fputc ('\'', stderr); + i++; + } + + fputc ('\n', stderr); +} + +void guestfs___print_timestamped_message (guestfs_h *g, const char *fs, ...) { va_list args;