示例#1
0
文件: handle.c 项目: myyyy/libguestfs
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;
}
示例#2
0
static void *
start_thread (void *vi)
{
    guestfs_h *g;
    int r, thread_id = *(int *)vi;
    const char *error;

    g = guestfs_create ();
    if (g == NULL) {
        perror ("guestfs_create");
        *(int *)vi = -1;
        pthread_exit (vi);
    }

    if (guestfs_add_drive_opts (g, "/dev/null",
                                GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw",
                                GUESTFS_ADD_DRIVE_OPTS_READONLY, 1,
                                -1) == -1) {
        *(int *)vi = -1;
        pthread_exit (vi);
    }

    /* Fake out hypervisor. */
    if (guestfs_set_hv (g, TOOL_TRUE) == -1) {
        *(int *)vi = -1;
        pthread_exit (vi);
    }

    /* Wait for the other threads to finish starting up. */
    r = pthread_barrier_wait (&barrier);
    if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) {
        fprintf (stderr, "pthread_barrier_wait: [thread %d]: %s\n",
                 thread_id, strerror (r));
        *(int *)vi = -1;
        pthread_exit (vi);
    }

    /* Launch the handle.  Because of the faked out qemu, we expect this
     * will fail with "child process died unexpectedly".  We are
     * interested in other failures.
     */
    guestfs_push_error_handler (g, NULL, NULL);
    r = guestfs_launch (g);
    error = guestfs_last_error (g);

    if (r == 0) { /* This should NOT happen. */
        fprintf (stderr, "rhbz790721: [thread %d]: "
                 "strangeness in test: expected launch to fail, but it didn't!\n",
                 thread_id);
        *(int *)vi = -1;
        pthread_exit (vi);
    }

    if (error == NULL) { /* This also should NOT happen. */
        fprintf (stderr, "rhbz790721: [thread %d]: "
                 "strangeness in test: no error message!\n",
                 thread_id);
        *(int *)vi = -1;
        pthread_exit (vi);
    }

    /* The error message should match the one printed by
     * guestfs_int_launch_failed_error.  If not, it indicates a bug/race
     * in the appliance building code which is what this regression test
     * is designed to spot.
     */
    if (strstr (error, "guestfs_launch failed") == NULL) {
        fprintf (stderr, "rhbz790721: [thread %d]: error: %s\n", thread_id, error);
        *(int *)vi = -1;
        pthread_exit (vi);
    }

    guestfs_pop_error_handler (g);

    /* Close the handle. */
    guestfs_close (g);

    *(int *)vi = 0;
    pthread_exit (vi);
}