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; }
int guestfs_impl_set_attach_method (guestfs_h *g, const char *method) { return guestfs_set_backend (g, method); }
static int connect_live (guestfs_h *g, virDomainPtr dom) { int i; CLEANUP_XMLFREEDOC xmlDocPtr doc = NULL; CLEANUP_XMLXPATHFREECONTEXT xmlXPathContextPtr xpathCtx = NULL; CLEANUP_XMLXPATHFREEOBJECT xmlXPathObjectPtr xpathObj = NULL; CLEANUP_FREE char *path = NULL, *backend = NULL; xmlNodeSetPtr nodes; /* Domain XML. */ if ((doc = get_domain_xml (g, dom)) == NULL) return -1; xpathCtx = xmlXPathNewContext (doc); if (xpathCtx == NULL) { error (g, _("unable to create new XPath context")); return -1; } /* This gives us a set of all the <channel> nodes related to the * guestfsd virtio-serial channel. */ xpathObj = xmlXPathEvalExpression (BAD_CAST "//devices/channel[@type=\"unix\" and " "./source/@mode=\"bind\" and " "./source/@path and " "./target/@type=\"virtio\" and " "./target/@name=\"org.libguestfs.channel.0\"]", xpathCtx); if (xpathObj == NULL) { error (g, _("unable to evaluate XPath expression")); return -1; } nodes = xpathObj->nodesetval; if (nodes != NULL) { for (i = 0; i < nodes->nodeNr; ++i) { CLEANUP_XMLXPATHFREEOBJECT xmlXPathObjectPtr xppath = NULL; xmlAttrPtr attr; /* See note in function above. */ xpathCtx->node = nodes->nodeTab[i]; /* The path is in <source path=..> attribute. */ xppath = xmlXPathEvalExpression (BAD_CAST "./source/@path", xpathCtx); if (xppath == NULL || xppath->nodesetval == NULL || xppath->nodesetval->nodeNr == 0) { xmlXPathFreeObject (xppath); continue; /* no type attribute, skip it */ } assert (xppath->nodesetval->nodeTab[0]); assert (xppath->nodesetval->nodeTab[0]->type == XML_ATTRIBUTE_NODE); attr = (xmlAttrPtr) xppath->nodesetval->nodeTab[0]; path = (char *) xmlNodeListGetString (doc, attr->children, 1); break; } } if (path == NULL) { error (g, _("this guest has no libvirt <channel> definition for guestfsd\n" "See ATTACHING TO RUNNING DAEMONS in guestfs(3) for further information.")); return -1; } /* Got a path. */ backend = safe_asprintf (g, "unix:%s", path); return guestfs_set_backend (g, backend); }