#include <config.h>
#define _BSD_SOURCE /* for mkdtemp, usleep */
-#define _GNU_SOURCE /* for vasprintf, GNU strerror_r, strchrnul */
#include <stdio.h>
#include <stdlib.h>
#endif
#include "guestfs.h"
+#include "guestfs-internal-actions.h"
#include "guestfs_protocol.h"
#include "ignore-value.h"
#ifdef HAVE_GETTEXT
#include "gettext.h"
#define _(str) dgettext(PACKAGE, (str))
-#define N_(str) dgettext(PACKAGE, (str))
+//#define N_(str) dgettext(PACKAGE, (str))
#else
#define _(str) str
-#define N_(str) str
+//#define N_(str) str
#endif
#define error guestfs_error
#define safe_malloc guestfs_safe_malloc
#define safe_realloc guestfs_safe_realloc
#define safe_strdup guestfs_safe_strdup
-#define safe_memdup guestfs_safe_memdup
+//#define safe_memdup guestfs_safe_memdup
static void default_error_cb (guestfs_h *g, void *data, const char *msg);
static void stdout_event (struct guestfs_main_loop *ml, guestfs_h *g, void *data, int watch, int fd, int events);
int cmdline_size;
int verbose;
+ int trace;
int autosync;
char *path; /* Path to kernel, initrd. */
/* Messages sent and received from the daemon. */
char *msg_in;
- int msg_in_size, msg_in_allocated;
+ unsigned int msg_in_size, msg_in_allocated;
char *msg_out;
- int msg_out_size, msg_out_pos;
+ unsigned int msg_out_size, msg_out_pos;
int msg_next_serial;
};
str = getenv ("LIBGUESTFS_DEBUG");
g->verbose = str != NULL && strcmp (str, "1") == 0;
+ str = getenv ("LIBGUESTFS_TRACE");
+ g->trace = str != NULL && strcmp (str, "1") == 0;
+
str = getenv ("LIBGUESTFS_PATH");
g->path = str != NULL ? strdup (str) : strdup (GUESTFS_DEFAULT_PATH);
if (!g->path) goto error;
g->fd[1] = -1;
g->sock = -1;
+ /* Wait for subprocess(es) to exit. */
+ waitpid (g->pid, NULL, 0);
+ if (g->recoverypid > 0) waitpid (g->recoverypid, NULL, 0);
+
/* Remove tmpfiles. */
if (g->tmpdir) {
snprintf (filename, sizeof filename, "%s/sock", g->tmpdir);
}
int
-guestfs_set_verbose (guestfs_h *g, int v)
+guestfs__set_verbose (guestfs_h *g, int v)
{
g->verbose = !!v;
return 0;
}
int
-guestfs_get_verbose (guestfs_h *g)
+guestfs__get_verbose (guestfs_h *g)
{
return g->verbose;
}
int
-guestfs_set_autosync (guestfs_h *g, int a)
+guestfs__set_autosync (guestfs_h *g, int a)
{
g->autosync = !!a;
return 0;
}
int
-guestfs_get_autosync (guestfs_h *g)
+guestfs__get_autosync (guestfs_h *g)
{
return g->autosync;
}
int
-guestfs_set_path (guestfs_h *g, const char *path)
+guestfs__set_path (guestfs_h *g, const char *path)
{
free (g->path);
g->path = NULL;
}
const char *
-guestfs_get_path (guestfs_h *g)
+guestfs__get_path (guestfs_h *g)
{
return g->path;
}
int
-guestfs_set_qemu (guestfs_h *g, const char *qemu)
+guestfs__set_qemu (guestfs_h *g, const char *qemu)
{
free (g->qemu);
g->qemu = NULL;
}
const char *
-guestfs_get_qemu (guestfs_h *g)
+guestfs__get_qemu (guestfs_h *g)
{
return g->qemu;
}
int
-guestfs_set_append (guestfs_h *g, const char *append)
+guestfs__set_append (guestfs_h *g, const char *append)
{
free (g->append);
g->append = NULL;
}
const char *
-guestfs_get_append (guestfs_h *g)
+guestfs__get_append (guestfs_h *g)
{
return g->append;
}
int
-guestfs_set_memsize (guestfs_h *g, int memsize)
+guestfs__set_memsize (guestfs_h *g, int memsize)
{
g->memsize = memsize;
return 0;
}
int
-guestfs_get_memsize (guestfs_h *g)
+guestfs__get_memsize (guestfs_h *g)
{
return g->memsize;
}
int
-guestfs_set_selinux (guestfs_h *g, int selinux)
+guestfs__set_selinux (guestfs_h *g, int selinux)
{
g->selinux = selinux;
return 0;
}
int
-guestfs_get_selinux (guestfs_h *g)
+guestfs__get_selinux (guestfs_h *g)
{
return g->selinux;
}
int
-guestfs_get_pid (guestfs_h *g)
+guestfs__get_pid (guestfs_h *g)
{
if (g->pid > 0)
return g->pid;
}
struct guestfs_version *
-guestfs_version (guestfs_h *g)
+guestfs__version (guestfs_h *g)
{
struct guestfs_version *r;
return r;
}
+int
+guestfs__set_trace (guestfs_h *g, int t)
+{
+ g->trace = !!t;
+ return 0;
+}
+
+int
+guestfs__get_trace (guestfs_h *g)
+{
+ return g->trace;
+}
+
/* Add a string to the current command line. */
static void
incr_cmdline_size (guestfs_h *g)
}
int
-guestfs_config (guestfs_h *g,
- const char *qemu_param, const char *qemu_value)
+guestfs__config (guestfs_h *g,
+ const char *qemu_param, const char *qemu_value)
{
if (qemu_param[0] != '-') {
error (g, _("guestfs_config: parameter must begin with '-' character"));
}
int
-guestfs_add_drive (guestfs_h *g, const char *filename)
+guestfs__add_drive (guestfs_h *g, const char *filename)
{
size_t len = strlen (filename) + 64;
char buf[len];
}
int
-guestfs_add_drive_ro (guestfs_h *g, const char *filename)
+guestfs__add_drive_ro (guestfs_h *g, const char *filename)
{
size_t len = strlen (filename) + 64;
char buf[len];
}
int
-guestfs_add_cdrom (guestfs_h *g, const char *filename)
+guestfs__add_cdrom (guestfs_h *g, const char *filename)
{
if (strchr (filename, ',') != NULL) {
error (g, _("filename cannot contain ',' (comma) character"));
"initramfs." REPO "." host_cpu ".supermin.hostfiles";
int
-guestfs_launch (guestfs_h *g)
+guestfs__launch (guestfs_h *g)
{
const char *tmpdir;
char dir_template[PATH_MAX];
close (wfd[1]);
close (rfd[0]);
- int fail = 0;
- fail |= dup (wfd[0]);
- fail |= dup (rfd[1]);
- close (wfd[0]);
- close (rfd[1]);
-
- if (fail) {
+ if (dup (wfd[0]) == -1) {
+ dup_failed:
perror ("dup failed");
_exit (1);
}
+ if (dup (rfd[1]) == -1)
+ goto dup_failed;
+
+ close (wfd[0]);
+ close (rfd[1]);
#if 0
/* Set up a new process group, so we can signal this process
}
int
-guestfs_wait_ready (guestfs_h *g)
+guestfs__wait_ready (guestfs_h *g)
{
int finished = 0, r;
}
int
-guestfs_kill_subprocess (guestfs_h *g)
+guestfs__kill_subprocess (guestfs_h *g)
{
if (g->state == CONFIG) {
error (g, _("no subprocess to kill"));
/* Access current state. */
int
-guestfs_is_config (guestfs_h *g)
+guestfs__is_config (guestfs_h *g)
{
return g->state == CONFIG;
}
int
-guestfs_is_launching (guestfs_h *g)
+guestfs__is_launching (guestfs_h *g)
{
return g->state == LAUNCHING;
}
int
-guestfs_is_ready (guestfs_h *g)
+guestfs__is_ready (guestfs_h *g)
{
return g->state == READY;
}
int
-guestfs_is_busy (guestfs_h *g)
+guestfs__is_busy (guestfs_h *g)
{
return g->state == BUSY;
}
int
-guestfs_get_state (guestfs_h *g)
+guestfs__get_state (guestfs_h *g)
{
return g->state;
}
int
-guestfs_set_ready (guestfs_h *g)
+guestfs__set_ready (guestfs_h *g)
{
if (g->state != BUSY) {
error (g, _("guestfs_set_ready: called when in state %d != BUSY"),
}
int
-guestfs_set_busy (guestfs_h *g)
+guestfs__set_busy (guestfs_h *g)
{
if (g->state != READY) {
error (g, _("guestfs_set_busy: called when in state %d != READY"),
}
int
-guestfs_end_busy (guestfs_h *g)
+guestfs__end_busy (guestfs_h *g)
{
switch (g->state)
{
case CONFIG:
case READY:
break;
+
case LAUNCHING:
case NO_HANDLE:
+ default:
error (g, _("guestfs_end_busy: called when in state %d"), g->state);
return -1;
}
return -1;
}
- while ((r = receive_file_data_sync (g, NULL, NULL)) > 0)
+ while (receive_file_data_sync (g, NULL, NULL) > 0)
; /* just discard it */
return -1;
}
static int
+__attribute__((noreturn))
select_add_timeout (guestfs_main_loop *mlv, guestfs_h *g, int interval,
guestfs_handle_timeout_cb cb, void *data)
{
}
static int
+__attribute__((noreturn))
select_remove_timeout (guestfs_main_loop *mlv, guestfs_h *g, int timer)
{
//struct select_main_loop *ml = (struct select_main_loop *) mlv;