Example #1
0
static int
is_libvirt_backend (guestfs_h *g)
{
  CLEANUP_FREE char *backend = guestfs_get_backend (g);

  return backend &&
    (STREQ (backend, "libvirt") || STRPREFIX (backend, "libvirt:"));
}
Example #2
0
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);
}
Example #3
0
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);
}
Example #4
0
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;
}
Example #5
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);
}