#include <sys/select.h>
#include <dirent.h>
#include <signal.h>
+#include <assert.h>
#include <rpc/types.h>
#include <rpc/xdr.h>
}
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)
{
}
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;
/* Enable user networking. */
if (g->enable_network) {
add_cmdline (g, "-netdev");
- add_cmdline (g, "user,id=usernet");
+ add_cmdline (g, "user,id=usernet,net=169.254.0.0/16");
add_cmdline (g, "-device");
add_cmdline (g, NET_IF ",netdev=usernet");
}
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. */
/* 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)
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.
}
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;