int main (int argc, char *argv[]) { gboolean gui_possible; int c; int option_index; char **cmdline = NULL; int cmdline_source = 0; struct config *config = new_config (); setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEBASEDIR); textdomain (PACKAGE); #if ! GLIB_CHECK_VERSION(2,32,0) /* In glib2 < 2.32 you had to call g_thread_init(). In later glib2 * that is not required and should not be called. */ if (glib_check_version (2, 32, 0) != NULL) /* This checks < 2.32 */ g_thread_init (NULL); #endif gdk_threads_init (); gdk_threads_enter (); gui_possible = gtk_init_check (&argc, &argv); for (;;) { c = getopt_long (argc, argv, options, long_options, &option_index); if (c == -1) break; switch (c) { case 0: /* options which are long only */ if (STREQ (long_options[option_index].name, "long-options")) { display_long_options (long_options); } else if (STREQ (long_options[option_index].name, "short-options")) { display_short_options (options); } else if (STREQ (long_options[option_index].name, "cmdline")) { cmdline = parse_cmdline_string (optarg); cmdline_source = CMDLINE_SOURCE_COMMAND_LINE; } else { fprintf (stderr, _("%s: unknown long option: %s (%d)\n"), guestfs_int_program_name, long_options[option_index].name, option_index); exit (EXIT_FAILURE); } break; case 'v': config->verbose = 1; break; case 'V': printf ("%s %s%s\n", guestfs_int_program_name, PACKAGE_VERSION, PACKAGE_VERSION_EXTRA); exit (EXIT_SUCCESS); case HELP_OPTION: usage (EXIT_SUCCESS); default: usage (EXIT_FAILURE); } } if (optind != argc) { fprintf (stderr, _("%s: unused arguments on the command line\n"), guestfs_int_program_name); usage (EXIT_FAILURE); } set_config_defaults (config); /* If /proc/cmdline exists and contains "p2v.server=" then we enable * non-interactive configuration. * If /proc/cmdline contains p2v.debug then we enable verbose mode * even for interactive configuration. */ if (cmdline == NULL) { cmdline = parse_proc_cmdline (); if (cmdline == NULL) goto gui; cmdline_source = CMDLINE_SOURCE_PROC_CMDLINE; } if (get_cmdline_key (cmdline, "p2v.debug") != NULL) config->verbose = 1; if (get_cmdline_key (cmdline, "p2v.server") != NULL) kernel_configuration (config, cmdline, cmdline_source); else { gui: if (!gui_possible) { fprintf (stderr, _("%s: gtk_init_check returned false, indicating that\n" "a GUI is not possible on this host. Check X11, $DISPLAY etc.\n"), guestfs_int_program_name); exit (EXIT_FAILURE); } gui_application (config); } guestfs_int_free_string_list (cmdline); exit (EXIT_SUCCESS); }
int main (int argc, char *argv[]) { gboolean gui_possible; int c; int option_index; char **cmdline = NULL; int cmdline_source = 0; struct config *config = new_config (); setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEBASEDIR); textdomain (PACKAGE); /* There is some raciness between slow devices being discovered by * the kernel and udev and virt-p2v running. This is a partial * workaround, but a real fix involves handling hotplug events * (possible in GUI mode, not easy in kernel mode). */ udevadm_settle (); #if ! GLIB_CHECK_VERSION(2,32,0) /* In glib2 < 2.32 you had to call g_thread_init(). In later glib2 * that is not required and should not be called. */ if (glib_check_version (2, 32, 0) != NULL) /* This checks < 2.32 */ g_thread_init (NULL); #endif gdk_threads_init (); gdk_threads_enter (); gui_possible = gtk_init_check (&argc, &argv); for (;;) { c = getopt_long (argc, argv, options, long_options, &option_index); if (c == -1) break; switch (c) { case 0: /* options which are long only */ if (STREQ (long_options[option_index].name, "long-options")) { display_long_options (long_options); } else if (STREQ (long_options[option_index].name, "short-options")) { display_short_options (options); } else if (STREQ (long_options[option_index].name, "cmdline")) { cmdline = parse_cmdline_string (optarg); cmdline_source = CMDLINE_SOURCE_COMMAND_LINE; } else error (EXIT_FAILURE, 0, _("unknown long option: %s (%d)"), long_options[option_index].name, option_index); break; case 'v': config->verbose = 1; break; case 'V': printf ("%s %s\n", guestfs_int_program_name, PACKAGE_VERSION_FULL); exit (EXIT_SUCCESS); case HELP_OPTION: usage (EXIT_SUCCESS); default: usage (EXIT_FAILURE); } } if (optind != argc) { fprintf (stderr, _("%s: unused arguments on the command line\n"), guestfs_int_program_name); usage (EXIT_FAILURE); } set_config_defaults (config); /* Parse /proc/cmdline (if it exists) or use the --cmdline parameter * to initialize the configuration. This allows defaults to be pass * using the kernel command line, with additional GUI configuration * later. */ if (cmdline == NULL) { cmdline = parse_proc_cmdline (); if (cmdline != NULL) cmdline_source = CMDLINE_SOURCE_PROC_CMDLINE; } if (cmdline) update_config_from_kernel_cmdline (config, cmdline); /* If p2v.server exists, then we use the non-interactive kernel * conversion. Otherwise we run the GUI. */ if (config->server != NULL) kernel_conversion (config, cmdline, cmdline_source); else { if (!gui_possible) error (EXIT_FAILURE, 0, _("gtk_init_check returned false, indicating that\n" "a GUI is not possible on this host. Check X11, $DISPLAY etc.")); gui_conversion (config); } guestfs_int_free_string_list (cmdline); exit (EXIT_SUCCESS); }