/* Common function to create the handle and set various defaults. */ static guestfs_h * create_handle (void) { guestfs_h *g; CLEANUP_FREE char *full_append = NULL; g = guestfs_create (); if (!g) error (EXIT_FAILURE, errno, "guestfs_create"); if (memsize != 0) if (guestfs_set_memsize (g, memsize) == -1) exit (EXIT_FAILURE); if (smp >= 2) if (guestfs_set_smp (g, smp) == -1) exit (EXIT_FAILURE); /* This changes some details in appliance/init and enables a * detailed trace of calls to initcall functions in the kernel. */ if (asprintf (&full_append, "guestfs_boot_analysis=1 " "ignore_loglevel initcall_debug " "%s", append != NULL ? append : "") == -1) error (EXIT_FAILURE, errno, "asprintf"); if (guestfs_set_append (g, full_append) == -1) exit (EXIT_FAILURE); return g; }
static int parse_environment (guestfs_h *g, char *(*do_getenv) (const void *data, const char *), const void *data) { int memsize, b; char *str; /* Don't bother checking the return values of functions * that cannot return errors. */ str = do_getenv (data, "LIBGUESTFS_TRACE"); if (str) { b = guestfs_int_is_true (str); if (b == -1) { error (g, _("%s=%s: non-boolean value"), "LIBGUESTFS_TRACE", str); return -1; } guestfs_set_trace (g, b); } str = do_getenv (data, "LIBGUESTFS_DEBUG"); if (str) { b = guestfs_int_is_true (str); if (b == -1) { error (g, _("%s=%s: non-boolean value"), "LIBGUESTFS_TRACE", str); return -1; } guestfs_set_verbose (g, b); } str = do_getenv (data, "LIBGUESTFS_TMPDIR"); if (str && STRNEQ (str, "")) { if (guestfs_set_tmpdir (g, str) == -1) return -1; } str = do_getenv (data, "LIBGUESTFS_CACHEDIR"); if (str && STRNEQ (str, "")) { if (guestfs_set_cachedir (g, str) == -1) return -1; } str = do_getenv (data, "TMPDIR"); if (guestfs_int_set_env_tmpdir (g, str) == -1) return -1; str = do_getenv (data, "LIBGUESTFS_PATH"); if (str && STRNEQ (str, "")) guestfs_set_path (g, str); str = do_getenv (data, "LIBGUESTFS_HV"); if (str && STRNEQ (str, "")) guestfs_set_hv (g, str); else { str = do_getenv (data, "LIBGUESTFS_QEMU"); if (str && STRNEQ (str, "")) guestfs_set_hv (g, str); } str = do_getenv (data, "LIBGUESTFS_APPEND"); if (str) guestfs_set_append (g, str); str = do_getenv (data, "LIBGUESTFS_MEMSIZE"); if (str && STRNEQ (str, "")) { if (sscanf (str, "%d", &memsize) != 1) { error (g, _("non-numeric value for LIBGUESTFS_MEMSIZE")); return -1; } if (guestfs_set_memsize (g, memsize) == -1) { /* set_memsize produces an error message already. */ return -1; } } str = do_getenv (data, "LIBGUESTFS_BACKEND"); if (str && STRNEQ (str, "")) { if (guestfs_set_backend (g, str) == -1) return -1; } else { str = do_getenv (data, "LIBGUESTFS_ATTACH_METHOD"); if (str && STRNEQ (str, "")) { if (guestfs_set_backend (g, str) == -1) return -1; } } str = do_getenv (data, "LIBGUESTFS_BACKEND_SETTINGS"); if (str) { CLEANUP_FREE_STRING_LIST char **settings = guestfs_int_split_string (':', str); if (settings == NULL) { perrorf (g, "split_string: malloc"); return -1; } if (guestfs_set_backend_settings (g, settings) == -1) return -1; } return 0; }