Exemple #1
0
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 */
}
Exemple #3
0
/* 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);
}
Exemple #4
0
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;
}
Exemple #5
0
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");
}