Index | Thread | Search

From:
Jason McIntyre <jmc@kerhand.co.uk>
Subject:
Re: env: -u name
To:
tech@openbsd.org
Date:
Sun, 28 Jul 2024 06:33:24 +0100

Download raw body.

Thread
On Sat, Jul 27, 2024 at 07:40:12PM +0000, Klemens Nanni wrote:
>      -u name
>              Remove name from the environment.
> 
> to hide some env var without involving sh -c 'unset A; ...'
> 
>   $ env -i A=1 B=2 ./obj/env -u A
>   B=2
> 
> Trivial addition, I just don't understand why we return 126 on setenv(3) failure.
> 
> I'd return 1 in both un/setenv(3) failure cases, but that's not a hill I'd like
> to die on, so diff below keeps -u failure's exit value consistent.
> 
> FreeBSD and GNU env(1) also have -u, the latter returning 125 on setenv failure.
> With -u in base, I can ditch genv(1) from our sysutils/coreutils port.
> 
> Feedback? Objection? OK?
> 

hi.

no opinion on the addition but if it does go in, can you add adjust
STANDARDS to note that -u is an extension (you can lift the text from
mv(1)).

jmc

> 
> Index: env.1
> ===================================================================
> RCS file: /cvs/src/usr.bin/env/env.1,v
> diff -u -p -r1.20 env.1
> --- env.1	12 Jan 2015 21:42:53 -0000	1.20
> +++ env.1	27 Jul 2024 19:32:55 -0000
> @@ -39,6 +39,7 @@
>  .Sh SYNOPSIS
>  .Nm env
>  .Op Fl i
> +.Op Fl u Ar name
>  .Oo
>  .Ar name Ns = Ns Ar value ...
>  .Oc
> @@ -66,6 +67,10 @@ The options are as follows:
>  Causes
>  .Nm
>  to completely ignore the environment it inherits.
> +.It Fl u Ar name
> +Remove
> +.Ar name
> +from the environment.
>  .El
>  .Pp
>  If no
> Index: env.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/env/env.c,v
> diff -u -p -r1.17 env.c
> --- env.c	28 Oct 2016 07:22:59 -0000	1.17
> +++ env.c	27 Jul 2024 19:33:25 -0000
> @@ -49,13 +49,17 @@ main(int argc, char *argv[])
>  	if (pledge("stdio exec", NULL) == -1)
>  		err(1, "pledge");
>  
> -	while ((ch = getopt(argc, argv, "i-")) != -1)
> +	while ((ch = getopt(argc, argv, "-iu:")) != -1)
>  		switch(ch) {
>  		case '-':			/* obsolete */
>  		case 'i':
>  			if ((environ = calloc(1, sizeof(char *))) == NULL)
>  				err(126, "calloc");
>  			break;
> +		case 'u':
> +			if (unsetenv(optarg) == -1)
> +				err(126, "unsetenv");
> +			break;
>  		default:
>  			usage();
>  		}
> @@ -91,7 +95,7 @@ usage(void)
>  {
>  	extern char *__progname;
>  
> -	(void)fprintf(stderr, "usage: %s [-i] [name=value ...] "
> +	(void)fprintf(stderr, "usage: %s [-i] [-u name] [name=value ...] "
>  	    "[utility [argument ...]]\n", __progname);
>  	exit(1);
>  }
>