Author: jrm (ports committer)
Date: Thu Nov  7 17:14:59 2019
New Revision: 354450
URL: https://svnweb.freebsd.org/changeset/base/354450

Log:
  Add -0 option to ENV(1)
  
  With the -0 option added to ENV(1), some ports will no longer require genv
  from sysutils/coreutils.
  
  Reviewed by:  kevans (prior version), swills
  Approved by:  bcr (manpages), imp
  Differential Revision:        https://reviews.freebsd.org/D22230

Modified:
  head/usr.bin/env/env.1
  head/usr.bin/env/env.c

Modified: head/usr.bin/env/env.1
==============================================================================
--- head/usr.bin/env/env.1      Thu Nov  7 17:10:33 2019        (r354449)
+++ head/usr.bin/env/env.1      Thu Nov  7 17:14:59 2019        (r354450)
@@ -31,7 +31,7 @@
 .\" From FreeBSD: src/usr.bin/printenv/printenv.1,v 1.17 2002/11/26 17:33:35 
ru Exp
 .\" $FreeBSD$
 .\"
-.Dd April 17, 2008
+.Dd November 7, 2019
 .Dt ENV 1
 .Os
 .Sh NAME
@@ -39,7 +39,7 @@
 .Nd set environment and execute command, or print environment
 .Sh SYNOPSIS
 .Nm
-.Op Fl iv
+.Op Fl 0iv
 .Op Fl P Ar altpath
 .Op Fl S Ar string
 .Op Fl u Ar name
@@ -64,6 +64,8 @@ is executed.
 .Pp
 The options are as follows:
 .Bl -tag -width indent
+.It Fl 0
+End each output line with NUL, not newline.
 .It Fl i
 Execute the
 .Ar utility
@@ -130,8 +132,15 @@ If no
 .Ar utility
 is specified,
 .Nm
-prints out the names and values
-of the variables in the environment, with one name/value pair per line.
+prints out the names and values of the variables in the environment.
+Each name/value pair is separated by a new line unless
+.Fl 0
+is specified, in which case name/value pairs are separated by NUL.
+Both
+.Fl 0
+and
+.Ar utility
+may not be specified together.
 .\"
 .Ss Details of Fl S \&Ss (split-string) processing
 The processing of the

Modified: head/usr.bin/env/env.c
==============================================================================
--- head/usr.bin/env/env.c      Thu Nov  7 17:10:33 2019        (r354449)
+++ head/usr.bin/env/env.c      Thu Nov  7 17:14:59 2019        (r354450)
@@ -59,22 +59,33 @@ int  env_verbosity;
 
 static void usage(void);
 
+/*
+ * Exit codes.
+ */
+#define EXIT_CANCELED      125 /* Internal error prior to exec attempt. */
+#define EXIT_CANNOT_INVOKE 126 /* Program located, but not usable. */
+#define EXIT_ENOENT        127 /* Could not find program to exec. */
+
 int
 main(int argc, char **argv)
 {
-       char *altpath, **ep, *p, **parg;
+       char *altpath, **ep, *p, **parg, term;
        char *cleanenv[1];
        int ch, want_clear;
        int rtrn;
 
        altpath = NULL;
        want_clear = 0;
-       while ((ch = getopt(argc, argv, "-iP:S:u:v")) != -1)
+       term = '\n';
+       while ((ch = getopt(argc, argv, "-0iP:S:u:v")) != -1)
                switch(ch) {
                case '-':
                case 'i':
                        want_clear = 1;
                        break;
+               case '0':
+                       term = '\0';
+                       break;
                case 'P':
                        altpath = strdup(optarg);
                        break;
@@ -118,6 +129,8 @@ main(int argc, char **argv)
                        err(EXIT_FAILURE, "setenv %s", *argv);
        }
        if (*argv) {
+               if (term == '\0')
+                       errx(EXIT_CANCELED, "cannot specify command with -0");
                if (altpath)
                        search_paths(altpath, argv);
                if (env_verbosity) {
@@ -129,10 +142,11 @@ main(int argc, char **argv)
                                sleep(1);
                }
                execvp(*argv, argv);
-               err(errno == ENOENT ? 127 : 126, "%s", *argv);
+               err(errno == ENOENT ? EXIT_ENOENT : EXIT_CANNOT_INVOKE,
+                   "%s", *argv);
        }
        for (ep = environ; *ep; ep++)
-               (void)printf("%s\n", *ep);
+               (void)printf("%s%c", *ep, term);
        exit(0);
 }
 
@@ -140,7 +154,7 @@ static void
 usage(void)
 {
        (void)fprintf(stderr,
-           "usage: env [-iv] [-P utilpath] [-S string] [-u name]\n"
+           "usage: env [-0iv] [-P utilpath] [-S string] [-u name]\n"
            "           [name=value ...] [utility [argument ...]]\n");
        exit(1);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to