diff --git a/daemon/daemon.h b/daemon/daemon.h index abec087cd..332e2966a 100644 --- a/daemon/daemon.h +++ b/daemon/daemon.h @@ -142,6 +142,8 @@ extern int parse_btrfsvol (const char *desc, mountable_t *mountable); extern int prog_exists (const char *prog); +extern void udev_settle_file (const char *file); + extern void udev_settle (void); extern int random_name (char *template); diff --git a/daemon/guestfsd.c b/daemon/guestfsd.c index a848fe139..1daa46471 100644 --- a/daemon/guestfsd.c +++ b/daemon/guestfsd.c @@ -1213,20 +1213,34 @@ random_name (char *template) * fussed if it fails. */ void -udev_settle (void) +udev_settle_file (const char *file) { - char cmd[80]; + const size_t MAX_ARGS = 64; + const char *argv[MAX_ARGS]; + CLEANUP_FREE char *err = NULL; + size_t i = 0; int r; - snprintf (cmd, sizeof cmd, "%s%s settle", - str_udevadm, verbose ? " --debug" : ""); + ADD_ARG (argv, i, str_udevadm); if (verbose) - printf ("%s\n", cmd); - r = system (cmd); + ADD_ARG (argv, i, "--debug"); + + ADD_ARG (argv, i, "settle"); + if (file) { + ADD_ARG (argv, i, "-E"); + ADD_ARG (argv, i, file); + } + ADD_ARG (argv, i, NULL); + + r = commandv (NULL, &err, argv); if (r == -1) - perror ("system"); - else if (!WIFEXITED (r) || WEXITSTATUS (r) != 0) - fprintf (stderr, "warning: udevadm command failed\n"); + fprintf (stderr, "udevadm settle: %s\n", err); +} + +void +udev_settle (void) +{ + udev_settle_file (NULL); } char *