Re: git: 33a2406eed00 - main - reboot: Use posix_spawn instead of system
- In reply to: Konstantin Belousov : "Re: git: 33a2406eed00 - main - reboot: Use posix_spawn instead of system"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 16 Feb 2024 19:45:14 UTC
On Fri, Feb 16, 2024 at 6:34 AM Konstantin Belousov <kostikbel@gmail.com> wrote: > 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 > Yea, it's not needed at all, so I'm removing it. > > > > #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 > > + }; > Because 'pool' is not a compile time constant? Warner > > + 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 >