/* virt-rescue
- * Copyright (C) 2010 Red Hat Inc.
+ * Copyright (C) 2010-2011 Red Hat Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <inttypes.h>
#include <unistd.h>
#include <getopt.h>
#include <errno.h>
+#include <locale.h>
#include <assert.h>
+#include <libintl.h>
+#include "ignore-value.h"
#include "progname.h"
#include "xvasprintf.h"
guestfs_h *g;
int read_only = 0;
+int live = 0;
int verbose = 0;
int keys_from_stdin = 0;
int echo_keys = 0;
" --network Enable network\n"
" -r|--ro Access read-only\n"
" --selinux Enable SELinux\n"
+ " --smp N Enable SMP with N >= 2 virtual CPUs\n"
" -v|--verbose Verbose messages\n"
" -V|--version Display version and exit\n"
+ " -w|--rw Mount read-write\n"
" -x Trace libguestfs API calls\n"
"For more information, see the manpage %s(1).\n"),
program_name, program_name, program_name,
bindtextdomain (PACKAGE, LOCALEBASEDIR);
textdomain (PACKAGE);
+ parse_config ();
+
enum { HELP_OPTION = CHAR_MAX + 1 };
static const char *options = "a:c:d:m:rvVx";
{ "memsize", 1, 0, 'm' },
{ "network", 0, 0, 0 },
{ "ro", 0, 0, 'r' },
+ { "rw", 0, 0, 'w' },
{ "selinux", 0, 0, 0 },
+ { "smp", 1, 0, 0 },
{ "verbose", 0, 0, 'v' },
{ "version", 0, 0, 'V' },
{ 0, 0, 0, 0 }
};
struct drv *drvs = NULL;
struct drv *drv;
- char *p, *file = NULL;
const char *format = NULL;
int c;
int option_index;
const char *append = NULL;
char *append_full;
int memsize = 0;
+ int smp = 0;
g = guestfs_create ();
if (g == NULL) {
format = NULL;
else
format = optarg;
+ } else if (STREQ (long_options[option_index].name, "smp")) {
+ if (sscanf (optarg, "%u", &smp) != 1) {
+ fprintf (stderr, _("%s: could not parse --smp parameter '%s'\n"),
+ program_name, optarg);
+ exit (EXIT_FAILURE);
+ }
+ if (smp < 1) {
+ fprintf (stderr, _("%s: --smp parameter '%s' should be >= 1\n"),
+ program_name, optarg);
+ exit (EXIT_FAILURE);
+ }
} else {
fprintf (stderr, _("%s: unknown long option: %s (%d)\n"),
program_name, long_options[option_index].name, option_index);
OPTION_V;
break;
+ case 'w':
+ OPTION_w;
+ break;
+
case 'x':
OPTION_x;
break;
assert (inspector == 0);
assert (keys_from_stdin == 0);
assert (echo_keys == 0);
+ assert (live == 0);
/* Must be no extra arguments on the command line. */
if (optind != argc)
guestfs_set_memsize (g, memsize);
if (network)
guestfs_set_network (g, 1);
+ if (smp >= 1)
+ guestfs_set_smp (g, smp);
/* Kernel command line must include guestfs_rescue=1 (see
* appliance/init) as well as other options.
* appliance.
*/
guestfs_set_error_handler (g, NULL, NULL);
- guestfs_launch (g);
- /* launch() expects guestfsd to start. However, virt-rescue doesn't
- * run guestfsd, so this will always fail with ECHILD when the
- * appliance exits unexpectedly.
- */
- if (errno != ECHILD) {
- fprintf (stderr, "%s: %s\n", program_name, guestfs_last_error (g));
- guestfs_close (g);
- exit (EXIT_FAILURE);
- }
+ /* We expect launch to fail, so ignore the return value. */
+ ignore_value (guestfs_launch (g));
guestfs_close (g);