X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=src%2Fguestfs.c;h=cab264a4fc37329f37f64604d1dc6cb5cb9d036b;hb=99f68f259f92eee884c6c7396f61b9c16e2bf354;hp=84da8d69239ebbf49511fd8e2a3058a9e39bac52;hpb=8358ea9524509c02448fe52d5bea205c9c3f869e;p=libguestfs.git diff --git a/src/guestfs.c b/src/guestfs.c index 84da8d6..cab264a 100644 --- a/src/guestfs.c +++ b/src/guestfs.c @@ -58,9 +58,10 @@ static void error (guestfs_h *g, const char *fs, ...); static void perrorf (guestfs_h *g, const char *fs, ...); -static void *safe_malloc (guestfs_h *g, int nbytes); +static void *safe_malloc (guestfs_h *g, size_t nbytes); static void *safe_realloc (guestfs_h *g, void *ptr, int nbytes); static char *safe_strdup (guestfs_h *g, const char *str); +static void *safe_memdup (guestfs_h *g, void *ptr, size_t size); static void default_error_cb (guestfs_h *g, void *data, const char *msg); static void stdout_event (void *data, int watch, int fd, int events); @@ -328,7 +329,7 @@ perrorf (guestfs_h *g, const char *fs, ...) } static void * -safe_malloc (guestfs_h *g, int nbytes) +safe_malloc (guestfs_h *g, size_t nbytes) { void *ptr = malloc (nbytes); if (!ptr) g->abort_cb (); @@ -351,6 +352,15 @@ safe_strdup (guestfs_h *g, const char *str) return s; } +static void * +safe_memdup (guestfs_h *g, void *ptr, size_t size) +{ + void *p = malloc (size); + if (!p) g->abort_cb (); + memcpy (p, ptr, size); + return p; +} + void guestfs_set_out_of_memory_handler (guestfs_h *g, guestfs_abort_cb cb) { @@ -377,10 +387,11 @@ guestfs_get_error_handler (guestfs_h *g, void **data_rtn) return g->error_cb; } -void +int guestfs_set_verbose (guestfs_h *g, int v) { - g->verbose = v; + g->verbose = !!v; + return 0; } int @@ -389,10 +400,11 @@ guestfs_get_verbose (guestfs_h *g) return g->verbose; } -void +int guestfs_set_autosync (guestfs_h *g, int a) { - g->autosync = a; + g->autosync = !!a; + return 0; } int @@ -401,13 +413,14 @@ guestfs_get_autosync (guestfs_h *g) return g->autosync; } -void +int guestfs_set_path (guestfs_h *g, const char *path) { if (path == NULL) g->path = GUESTFS_DEFAULT_PATH; else g->path = path; + return 0; } const char * @@ -488,6 +501,11 @@ guestfs_add_drive (guestfs_h *g, const char *filename) return -1; } + if (access (filename, F_OK) == -1) { + perrorf (g, "%s", filename); + return -1; + } + snprintf (buf, len, "file=%s", filename); return guestfs_config (g, "-drive", buf); @@ -501,6 +519,11 @@ guestfs_add_cdrom (guestfs_h *g, const char *filename) return -1; } + if (access (filename, F_OK) == -1) { + perrorf (g, "%s", filename); + return -1; + } + return guestfs_config (g, "-cdrom", filename); } @@ -508,7 +531,7 @@ int guestfs_launch (guestfs_h *g) { static const char *dir_template = "/tmp/libguestfsXXXXXX"; - int r, i, len; + int r, i, len, pmore; int wfd[2], rfd[2]; int tries; const char *kernel_name = "vmlinuz." REPO "." host_cpu; @@ -533,6 +556,7 @@ guestfs_launch (guestfs_h *g) pelem = path = safe_strdup (g, g->path); do { pend = strchrnul (pelem, ':'); + pmore = *pend == ':'; *pend = '\0'; len = pend - pelem; @@ -564,8 +588,8 @@ guestfs_launch (guestfs_h *g) kernel = initrd = NULL; } - pelem = pend; - } while (*pelem++ != '\0'); + pelem = pend + 1; + } while (pmore); free (path); @@ -1008,6 +1032,28 @@ sock_read_event (void *data, int watch, int fd, int events) goto cleanup; } + /* Got the full message, begin processing it. */ + if (g->verbose) { + int i, j; + + for (i = 0; i < g->msg_in_size; i += 16) { + printf ("%04x: ", i); + for (j = i; j < MIN (i+16, g->msg_in_size); ++j) + printf ("%02x ", (unsigned char) g->msg_in[j]); + for (; j < i+16; ++j) + printf (" "); + printf ("|"); + for (j = i; j < MIN (i+16, g->msg_in_size); ++j) + if (isprint (g->msg_in[j])) + printf ("%c", g->msg_in[j]); + else + printf ("."); + for (; j < i+16; ++j) + printf (" "); + printf ("|\n"); + } + } + /* Not in the expected state. */ if (g->state != BUSY) error (g, "state %d != BUSY", g->state); @@ -1220,6 +1266,37 @@ check_reply_header (guestfs_h *g, */ #include "guestfs-actions.c" +/* Structure-freeing functions. These rely on the fact that the + * structure format is identical to the XDR format. See note in + * generator.ml. + */ +void +guestfs_free_int_bool (struct guestfs_int_bool *x) +{ + free (x); +} + +void +guestfs_free_lvm_pv_list (struct guestfs_lvm_pv_list *x) +{ + xdr_free ((xdrproc_t) xdr_guestfs_lvm_int_pv_list, (char *) x); + free (x); +} + +void +guestfs_free_lvm_vg_list (struct guestfs_lvm_vg_list *x) +{ + xdr_free ((xdrproc_t) xdr_guestfs_lvm_int_vg_list, (char *) x); + free (x); +} + +void +guestfs_free_lvm_lv_list (struct guestfs_lvm_lv_list *x) +{ + xdr_free ((xdrproc_t) xdr_guestfs_lvm_int_lv_list, (char *) x); + free (x); +} + /* This is the default main loop implementation, using select(2). */ struct handle_cb_data {