static int is_libvirt_backend (guestfs_h *g) { CLEANUP_FREE char *backend = guestfs_get_backend (g); return backend && (STREQ (backend, "libvirt") || STRPREFIX (backend, "libvirt:")); }
int main (int argc, char *argv[]) { pthread_t thread[NR_THREADS]; int data[NR_THREADS]; int i, r, errors; guestfs_h *g; char *backend; /* Test is only meaningful if the backend "direct" is used. */ g = guestfs_create (); if (!g) error (EXIT_FAILURE, errno, "guestfs_create"); backend = guestfs_get_backend (g); if (backend == NULL) { guestfs_close (g); exit (EXIT_FAILURE); } if (STRNEQ (backend, "direct")) { fprintf (stderr, "%s: test skipped because backend isn't 'direct'.\n", guestfs_int_program_name); free (backend); guestfs_close (g); exit (77); } free (backend); guestfs_close (g); /* Ensure error messages are not translated. */ setenv ("LC_ALL", "C", 1); pthread_barrier_init (&barrier, NULL, NR_THREADS); /* Create the other threads which will set up their own libguestfs * handle then wait at a barrier before launching. */ for (i = 0; i < NR_THREADS; ++i) { data[i] = i; r = pthread_create (&thread[i], NULL, start_thread, &data[i]); if (r != 0) error (EXIT_FAILURE, r, "pthread_create"); } /* Wait for the threads to exit. */ errors = 0; for (i = 0; i < NR_THREADS; ++i) { int *ret; r = pthread_join (thread[i], (void **) &ret); if (r != 0) error (EXIT_FAILURE, r, "pthread_join"); if (*ret == -1) errors++; } exit (errors == 0 ? EXIT_SUCCESS : EXIT_FAILURE); }
char * guestfs_impl_get_attach_method (guestfs_h *g) { if (STREQ (g->backend, "direct")) /* Return 'appliance' here for backwards compatibility. */ return safe_strdup (g, "appliance"); return guestfs_get_backend (g); }
int guestfs__launch (guestfs_h *g) { /* Configured? */ if (g->state != CONFIG) { error (g, _("the libguestfs handle has already been launched")); return -1; } /* Start the clock ... */ gettimeofday (&g->launch_t, NULL); TRACE0 (launch_start); /* Make the temporary directory. */ if (guestfs___lazy_make_tmpdir (g) == -1) return -1; /* Allow anyone to read the temporary directory. The socket in this * directory won't be readable but anyone can see it exists if they * want. (RHBZ#610880). */ if (chmod (g->tmpdir, 0755) == -1) warning (g, "chmod: %s: %m (ignored)", g->tmpdir); /* Some common debugging information. */ if (g->verbose) { CLEANUP_FREE_VERSION struct guestfs_version *v = guestfs_version (g); struct backend *b; CLEANUP_FREE char *backend = guestfs_get_backend (g); debug (g, "launch: program=%s", g->program); debug (g, "launch: version=%"PRIi64".%"PRIi64".%"PRIi64"%s", v->major, v->minor, v->release, v->extra); for (b = backends; b != NULL; b = b->next) debug (g, "launch: backend registered: %s", b->name); debug (g, "launch: backend=%s", backend); debug (g, "launch: tmpdir=%s", g->tmpdir); debug (g, "launch: umask=0%03o", get_umask (g)); debug (g, "launch: euid=%d", geteuid ()); } /* Launch the appliance. */ if (g->backend_ops->launch (g, g->backend_data, g->backend_arg) == -1) return -1; /* If network is enabled, upload /etc/resolv.conf from the host so * the guest will know how to reach the nameservers. */ if (g->enable_network && access ("/etc/resolv.conf", F_OK) == 0) { guestfs_internal_upload (g, "/etc/resolv.conf", "/etc/resolv.conf", 0644); } return 0; }
int guestfs_impl_launch (guestfs_h *g) { /* Configured? */ if (g->state != CONFIG) { error (g, _("the libguestfs handle has already been launched")); return -1; } /* Start the clock ... */ gettimeofday (&g->launch_t, NULL); TRACE0 (launch_start); /* Make the temporary directory. */ if (guestfs_int_lazy_make_tmpdir (g) == -1) return -1; /* Some common debugging information. */ if (g->verbose) { CLEANUP_FREE_VERSION struct guestfs_version *v = guestfs_version (g); struct backend *b; CLEANUP_FREE char *backend = guestfs_get_backend (g); int mask; debug (g, "launch: program=%s", g->program); if (STRNEQ (g->identifier, "")) debug (g, "launch: identifier=%s", g->identifier); debug (g, "launch: version=%"PRIi64".%"PRIi64".%"PRIi64"%s", v->major, v->minor, v->release, v->extra); for (b = backends; b != NULL; b = b->next) debug (g, "launch: backend registered: %s", b->name); debug (g, "launch: backend=%s", backend); debug (g, "launch: tmpdir=%s", g->tmpdir); mask = guestfs_int_getumask (g); if (mask >= 0) debug (g, "launch: umask=0%03o", (unsigned) mask); debug (g, "launch: euid=%ju", (uintmax_t) geteuid ()); } /* Launch the appliance. */ if (g->backend_ops->launch (g, g->backend_data, g->backend_arg) == -1) return -1; return 0; }
int main (int argc, char *argv[]) { guestfs_h *g; virConnectPtr conn; virDomainPtr dom; virErrorPtr err; int r; char *backend; char *cwd; FILE *fp; char libvirt_uri[1024]; cwd = xgetcwd (); /* Create the guestfs handle. */ g = guestfs_create (); if (g == NULL) { fprintf (stderr, "failed to create handle\n"); exit (EXIT_FAILURE); } backend = guestfs_get_backend (g); if (STREQ (backend, "uml")) { printf ("%s: test skipped because UML backend does not support qcow2\n", argv[0]); free (backend); exit (77); } free (backend); /* Create the libvirt XML and test images in the current * directory. */ fp = fopen ("test-add-libvirt-dom.xml", "w"); if (fp == NULL) { perror ("test-add-libvirt-dom.xml"); exit (EXIT_FAILURE); } make_test_xml (fp, cwd); fclose (fp); if (guestfs_disk_create (g, "test-add-libvirt-dom-1.img", "raw", 1024*1024, -1) == -1) exit (EXIT_FAILURE); if (guestfs_disk_create (g, "test-add-libvirt-dom-2.img", "raw", 1024*1024, -1) == -1) exit (EXIT_FAILURE); if (guestfs_disk_create (g, "test-add-libvirt-dom-3.img", "qcow2", 1024*1024, -1) == -1) exit (EXIT_FAILURE); /* Create the libvirt connection. */ snprintf (libvirt_uri, sizeof libvirt_uri, "test://%s/test-add-libvirt-dom.xml", cwd); conn = virConnectOpenReadOnly (libvirt_uri); if (!conn) { err = virGetLastError (); fprintf (stderr, "%s: could not connect to libvirt (code %d, domain %d): %s\n", argv[0], err->code, err->domain, err->message); exit (EXIT_FAILURE); } dom = virDomainLookupByName (conn, "guest"); if (!dom) { err = virGetLastError (); fprintf (stderr, "%s: no libvirt domain called '%s': %s\n", argv[0], "guest", err->message); exit (EXIT_FAILURE); } r = guestfs_add_libvirt_dom (g, dom, GUESTFS_ADD_LIBVIRT_DOM_READONLY, 1, -1); if (r == -1) exit (EXIT_FAILURE); if (r != 3) { fprintf (stderr, "%s: incorrect number of disks added (%d, expected 3)\n", argv[0], r); exit (EXIT_FAILURE); } guestfs_close (g); virDomainFree (dom); virConnectClose (conn); free (cwd); unlink ("test-add-libvirt-dom.xml"); unlink ("test-add-libvirt-dom-1.img"); unlink ("test-add-libvirt-dom-2.img"); unlink ("test-add-libvirt-dom-3.img"); exit (EXIT_SUCCESS); }