static void print_event_set (uint64_t event_bitmask, FILE *fp) { if (event_bitmask == GUESTFS_EVENT_ALL) fputs ("*", fp); else { CLEANUP_FREE char *str = guestfs_event_to_string (event_bitmask); if (!str) error (EXIT_FAILURE, errno, "guestfs_event_to_string"); fputs (str, fp); } }
/* Convert source to a printable string. The caller must free the * returned string. */ char * source_to_string (uint64_t source) { char *ret; if (source == SOURCE_LIBVIRT) { ret = strdup ("libvirt"); if (ret == NULL) error (EXIT_FAILURE, errno, "strdup"); } else ret = guestfs_event_to_string (source); return ret; /* caller frees */ }
/* Guestfs.event_to_string */ value ocaml_guestfs_event_to_string (value events) { CAMLparam1 (events); CAMLlocal1 (rv); char *r; uint64_t event_bitmask; event_bitmask = event_bitmask_of_event_list (events); r = guestfs_event_to_string (event_bitmask); if (r == NULL) unix_error (errno, (char *) "Guestfs.event_to_string", Nothing); rv = caml_copy_string (r); free (r); CAMLreturn (rv); }
JNIEXPORT jstring JNICALL Java_com_redhat_et_libguestfs_GuestFS__1event_1to_1string (JNIEnv *env, jclass cl, jlong jevents) { uint64_t events = (uint64_t) jevents; char *str; jstring jr; str = guestfs_event_to_string (events); if (str == NULL) { perror ("guestfs_event_to_string"); return NULL; } jr = (*env)->NewStringUTF (env, str); free (str); return jr; }
static void do_event_handler (guestfs_h *g, void *opaque, uint64_t event, int event_handle, int flags, const char *buf, size_t buf_len, const uint64_t *array, size_t array_len) { pid_t pid; const char *argv[8 + array_len]; const char *shell; struct entry *entry = opaque; size_t i, j; char *s; pid = fork (); if (pid == -1) { perror ("event handler: fork"); return; } if (pid == 0) { /* Child process. */ char *str; shell = getenv ("SHELL"); if (!shell) shell = "/bin/sh"; str = guestfs_event_to_string (event); setenv ("EVENT", str, 1); free (str); /* Construct the command and arguments. */ i = 0; argv[i++] = shell; argv[i++] = "-c"; argv[i++] = entry->command; argv[i++] = ""; /* $0 */ if (buf != NULL) /* XXX: So far, buf is always ASCII NUL-terminated. There is no * way to pass arbitrary 8 bit buffers. */ argv[i++] = buf; for (j = 0; j < array_len; ++j) { if (asprintf (&s, "%" PRIu64, array[j]) == -1) { perror ("event handler: asprintf"); _exit (EXIT_FAILURE); } argv[i++] = s; } argv[i++] = NULL; execvp (argv[0], (void *) argv); perror (argv[0]); _exit (EXIT_FAILURE); } if (waitpid (pid, NULL, 0) == -1) perror ("event handler: waitpid"); }