Re: git: 33a2406eed00 - main - reboot: Use posix_spawn instead of system
Date: Fri, 16 Feb 2024 13:33:10 UTC
On Fri, Feb 16, 2024 at 04:00:19AM +0000, Warner Losh wrote: > The branch main has been updated by imp: > > URL: https://cgit.FreeBSD.org/src/commit/?id=33a2406eed009dbffd7dfa44285c23f0db5a3750 > > commit 33a2406eed009dbffd7dfa44285c23f0db5a3750 > Author: Warner Losh <imp@FreeBSD.org> > AuthorDate: 2024-02-16 03:52:31 +0000 > Commit: Warner Losh <imp@FreeBSD.org> > CommitDate: 2024-02-16 03:59:22 +0000 > > reboot: Use posix_spawn instead of system > > Use posix_spawn to avoid having to allocate memory needed for the system > command line. > > Sponsored by: Netflix > Reviewed by: jrtc27 > Differential Revision: https://reviews.freebsd.org/D43860 > --- > sbin/reboot/reboot.c | 54 ++++++++++++++++++++++++++++++++++++---------------- > 1 file changed, 38 insertions(+), 16 deletions(-) > > diff --git a/sbin/reboot/reboot.c b/sbin/reboot/reboot.c > index e9d6487da6a5..d3f1fc9bbb86 100644 > --- a/sbin/reboot/reboot.c > +++ b/sbin/reboot/reboot.c > @@ -29,19 +29,21 @@ > * SUCH DAMAGE. > */ > > -#include <sys/types.h> > #include <sys/boottrace.h> > #include <sys/mount.h> > #include <sys/reboot.h> > #include <sys/stat.h> > #include <sys/sysctl.h> > #include <sys/time.h> > +#include <sys/types.h> > +#include <sys/wait.h> sys/types.h should go first, the previous location was right > > #include <err.h> > #include <errno.h> > #include <fcntl.h> > #include <pwd.h> > #include <signal.h> > +#include <spawn.h> > #include <stdbool.h> > #include <stdio.h> > #include <stdlib.h> > @@ -69,23 +71,43 @@ static bool donextboot; > static void > zfsbootcfg(const char *pool, bool force) > { > - char *k; > - int rv; > - > - asprintf(&k, > - "zfsbootcfg -z %s -n freebsd:nvstore -k nextboot_enable -v YES", > - pool); > - if (k == NULL) > - E("No memory for zfsbootcfg"); > - > - rv = system(k); > - if (rv == 0) > - return; > + const char * const av[] = { Why not 'static'? > + "zfsbootcfg", > + "-z", > + pool, > + "-n", > + "freebsd:nvstore", > + "-k", > + "nextboot_enable" > + "-v", > + "YES", > + NULL > + }; > + int rv, status; > + pid_t p; > + extern char **environ; > + > + rv = posix_spawnp(&p, av[0], NULL, NULL, __DECONST(char **, av), > + environ); > if (rv == -1) > E("system zfsbootcfg"); > - if (rv == 127) > - E("zfsbootcfg not found in path"); > - E("zfsbootcfg returned %d", rv); > + if (waitpid(p, &status, WEXITED) < 0) { > + if (errno == EINTR) > + return; > + E("waitpid zfsbootcfg"); > + } > + if (WIFEXITED(status)) { > + int e = WEXITSTATUS(status); > + > + if (e == 0) > + return; > + if (e == 127) > + E("zfsbootcfg not found in path"); > + E("zfsbootcfg returned %d", e); > + } > + if (WIFSIGNALED(status)) > + E("zfsbootcfg died with signal %d", WTERMSIG(status)); > + E("zfsbootcfg unexpected status %d", status); > } > > static void