Re: git: 33a2406eed00 - main - reboot: Use posix_spawn instead of system

From: Konstantin Belousov <kostikbel_at_gmail.com>
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