Module Name:    src
Committed By:   christos
Date:           Fri Sep 26 19:28:03 UTC 2014

Modified Files:
        src/include: unistd.h
        src/lib/libc: shlib_version
        src/lib/libc/gen: Makefile.inc exec.3 execlp.c execvp.c
        src/lib/libc/include: namespace.h

Log Message:
add execvpe, execlpe (reviewed by phone)


To generate a diff of this commit:
cvs rdiff -u -r1.142 -r1.143 src/include/unistd.h
cvs rdiff -u -r1.255 -r1.256 src/lib/libc/shlib_version
cvs rdiff -u -r1.188 -r1.189 src/lib/libc/gen/Makefile.inc
cvs rdiff -u -r1.22 -r1.23 src/lib/libc/gen/exec.3
cvs rdiff -u -r1.12 -r1.13 src/lib/libc/gen/execlp.c
cvs rdiff -u -r1.30 -r1.31 src/lib/libc/gen/execvp.c
cvs rdiff -u -r1.175 -r1.176 src/lib/libc/include/namespace.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/include/unistd.h
diff -u src/include/unistd.h:1.142 src/include/unistd.h:1.143
--- src/include/unistd.h:1.142	Fri Jul 25 04:30:47 2014
+++ src/include/unistd.h	Fri Sep 26 15:28:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: unistd.h,v 1.142 2014/07/25 08:30:47 dholland Exp $	*/
+/*	$NetBSD: unistd.h,v 1.143 2014/09/26 19:28:03 christos Exp $	*/
 
 /*-
  * Copyright (c) 1998, 1999, 2008 The NetBSD Foundation, Inc.
@@ -328,6 +328,8 @@ int	 des_setkey(const char *);
 int	 dup3(int, int, int);
 void	 endusershell(void);
 int	 exect(const char *, char * const *, char * const *);
+int	 execvpe(const char *, char * const *, char * const *);
+int	 execlpe(const char *, const char *, ...);
 int	 fchroot(int);
 int	 fdiscard(int, off_t, off_t);
 int	 fsync_range(int, int, off_t, off_t);

Index: src/lib/libc/shlib_version
diff -u src/lib/libc/shlib_version:1.255 src/lib/libc/shlib_version:1.256
--- src/lib/libc/shlib_version:1.255	Wed Sep 24 14:16:37 2014
+++ src/lib/libc/shlib_version	Fri Sep 26 15:28:03 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: shlib_version,v 1.255 2014/09/24 18:16:37 christos Exp $
+#	$NetBSD: shlib_version,v 1.256 2014/09/26 19:28:03 christos Exp $
 #	Remember to update distrib/sets/lists/base/shl.* when changing
 #
 # things we wish to do on next major version bump:
@@ -42,4 +42,4 @@
 # - move gethostbyname to a compat library
 # - remove arc4random(3) API
 major=12
-minor=194
+minor=195

Index: src/lib/libc/gen/Makefile.inc
diff -u src/lib/libc/gen/Makefile.inc:1.188 src/lib/libc/gen/Makefile.inc:1.189
--- src/lib/libc/gen/Makefile.inc:1.188	Fri Jun 13 11:45:05 2014
+++ src/lib/libc/gen/Makefile.inc	Fri Sep 26 15:28:03 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.inc,v 1.188 2014/06/13 15:45:05 joerg Exp $
+#	$NetBSD: Makefile.inc,v 1.189 2014/09/26 19:28:03 christos Exp $
 #	from: @(#)Makefile.inc	8.6 (Berkeley) 5/4/95
 
 # gen sources
@@ -94,8 +94,8 @@ MLINKS+=endutxent.3 getutxent.3 endutxen
 MLINKS+=err.3 verr.3 err.3 errx.3 err.3 verrx.3 err.3 warn.3 err.3 vwarn.3 \
         err.3 warnx.3 err.3 vwarnx.3 err.3 errc.3 err.3 verrc.3 err.3 warnc.3 \
 	err.3 vwarnc.3
-MLINKS+=exec.3 execl.3 exec.3 execle.3 exec.3 execlp.3 exec.3 execv.3 \
-	exec.3 execvp.3 exec.3 exect.3
+MLINKS+=exec.3 execl.3 exec.3 execle.3 exec.3 execlp.3 exec.3 execlpe.3 \
+	exec.3 execv.3 exec.3 execvp.3 exec.3 execvpe.3 exec.3 exect.3 
 MLINKS+=extattr_namespace_to_string.3 extattr_string_to_namespace.3 \
 	extattr_copy_file.3 extattr_copy_fd.3 \
 	extattr_copy_file.3 extattr_copy_link.3 \

Index: src/lib/libc/gen/exec.3
diff -u src/lib/libc/gen/exec.3:1.22 src/lib/libc/gen/exec.3:1.23
--- src/lib/libc/gen/exec.3:1.22	Thu Nov 22 11:19:49 2012
+++ src/lib/libc/gen/exec.3	Fri Sep 26 15:28:03 2014
@@ -1,4 +1,4 @@
-.\"	$NetBSD: exec.3,v 1.22 2012/11/22 16:19:49 abs Exp $
+.\"	$NetBSD: exec.3,v 1.23 2014/09/26 19:28:03 christos Exp $
 .\"
 .\" Copyright (c) 1991, 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -29,7 +29,7 @@
 .\"
 .\"     @(#)exec.3	8.3 (Berkeley) 1/24/94
 .\"
-.Dd May 6, 2005
+.Dd September 26, 2014
 .Dt EXEC 3
 .Os
 .Sh NAME
@@ -50,6 +50,8 @@
 .Ft int
 .Fn execlp "const char *file" "const char *arg" ...
 .Ft int
+.Fn execlpe "const char *path" "const char *arg" ... "char *const envp[]"
+.Ft int
 .Fn execle "const char *path" "const char *arg" ... "char *const envp[]"
 .Ft int
 .Fn exect "const char *path" "char *const argv[]"  "char *const envp[]"
@@ -57,6 +59,8 @@
 .Fn execv "const char *path" "char *const argv[]"
 .Ft int
 .Fn execvp "const char *file" "char *const argv[]"
+.Ft int
+.Fn execvpe "const char *file" "char *const argv[], char *const envp[]"
 .Sh DESCRIPTION
 The
 .Fn exec
@@ -80,6 +84,7 @@ The
 and subsequent ellipses in the
 .Fn execl ,
 .Fn execlp ,
+.Fn execlpe ,
 and
 .Fn execle
 functions can be thought of as
@@ -100,8 +105,9 @@ pointer.
 The
 .Fn exect ,
 .Fn execv ,
+.Fn execvp ,
 and
-.Fn execvp
+.Fn execvpe
 functions provide an array of pointers to null-terminated strings that
 represent the argument list available to the new program.
 The first argument, by convention, should point to the file name associated
@@ -135,9 +141,11 @@ in the current process.
 Some of these functions have special semantics.
 .Pp
 The functions
-.Fn execlp
-and
+.Fn execlp ,
+.Fn execlpe ,
 .Fn execvp
+and
+.Fn execvpe
 will duplicate the actions of the shell in searching for an executable file
 if the specified file name does not contain a slash
 .Dq Li \&/
@@ -198,16 +206,20 @@ The shell.
 .Sh COMPATIBILITY
 Historically, the default path for the
 .Fn execlp
+.Fn execlpe ,
+.Fn execvp ,
 and
-.Fn execvp
+.Fn execvpe
 functions was
 .Dq Pa :/bin:/usr/bin .
 This was changed to improve security and behaviour.
 .Pp
 The behavior of
-.Fn execlp
+.Fn execlp ,
+.Fn execlpe ,
+.Fn execvp ,
 and
-.Fn execvp
+.Fn execvpe
 when errors occur while attempting to execute the file is historic
 practice, but has not traditionally been documented and is not specified
 by the
@@ -215,9 +227,11 @@ by the
 standard.
 .Pp
 Traditionally, the functions
-.Fn execlp
+.Fn execlp ,
+.Fn execlpe ,
+.Fn execvp ,
 and
-.Fn execvp
+.Fn execvpe
 ignored all errors except for the ones described above and
 .Er ENOMEM
 and
@@ -227,9 +241,11 @@ They now return if any error other than 
 .Sh ERRORS
 .Fn execl ,
 .Fn execle ,
-.Fn execlp
-and
+.Fn execlp ,
+.Fn execlpe ,
 .Fn execvp
+and
+.Fn execvpe
 may fail and set
 .Va errno
 for any of the errors specified for the library functions
@@ -260,3 +276,11 @@ and
 .Fn execvp
 conform to
 .St -p1003.1-90 .
+.Pp
+The
+.Fn execlpe
+function appeared first in QNX and the
+.Fn execvpe
+is on both
+.Lx
+and QNX.

Index: src/lib/libc/gen/execlp.c
diff -u src/lib/libc/gen/execlp.c:1.12 src/lib/libc/gen/execlp.c:1.13
--- src/lib/libc/gen/execlp.c:1.12	Thu Jun 30 15:46:07 2011
+++ src/lib/libc/gen/execlp.c	Fri Sep 26 15:28:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: execlp.c,v 1.12 2011/06/30 19:46:07 joerg Exp $	*/
+/*	$NetBSD: execlp.c,v 1.13 2014/09/26 19:28:03 christos Exp $	*/
 
 /*-
  * Copyright (c) 1991, 1993
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)exec.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: execlp.c,v 1.12 2011/06/30 19:46:07 joerg Exp $");
+__RCSID("$NetBSD: execlp.c,v 1.13 2014/09/26 19:28:03 christos Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -42,9 +42,11 @@ __RCSID("$NetBSD: execlp.c,v 1.12 2011/0
 #include <stdarg.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <errno.h>
 
 #ifdef __weak_alias
 __weak_alias(execlp,_execlp)
+__weak_alias(execlpe,_execlpe)
 #endif
 
 int
@@ -52,7 +54,7 @@ execlp(const char *name, const char *arg
 {
 	va_list ap;
 	char **argv;
-	int i;
+	size_t i;
 
 	va_start(ap, arg);
 	for (i = 2; va_arg(ap, char *) != NULL; i++)
@@ -69,3 +71,27 @@ execlp(const char *name, const char *arg
 	
 	return execvp(name, argv);
 }
+
+int
+execlpe(const char *name, const char *arg, ...)
+{
+	va_list ap;
+	char **argv, **envp;
+	size_t i;
+
+	va_start(ap, arg);
+	for (i = 2; va_arg(ap, char *) != NULL; i++)
+		continue;
+	va_end(ap);
+
+	argv = alloca(i * sizeof (char *));
+	
+	va_start(ap, arg);
+	argv[0] = __UNCONST(arg);
+	for (i = 1; (argv[i] = va_arg(ap, char *)) != NULL; i++) 
+		continue;
+	envp = va_arg(ap, char **);
+	va_end(ap);
+
+	return execvpe(name, argv, envp);
+}

Index: src/lib/libc/gen/execvp.c
diff -u src/lib/libc/gen/execvp.c:1.30 src/lib/libc/gen/execvp.c:1.31
--- src/lib/libc/gen/execvp.c:1.30	Fri Jul 20 08:41:07 2007
+++ src/lib/libc/gen/execvp.c	Fri Sep 26 15:28:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: execvp.c,v 1.30 2007/07/20 12:41:07 yamt Exp $	*/
+/*	$NetBSD: execvp.c,v 1.31 2014/09/26 19:28:03 christos Exp $	*/
 
 /*-
  * Copyright (c) 1991, 1993
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)exec.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: execvp.c,v 1.30 2007/07/20 12:41:07 yamt Exp $");
+__RCSID("$NetBSD: execvp.c,v 1.31 2014/09/26 19:28:03 christos Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -51,12 +51,11 @@ __RCSID("$NetBSD: execvp.c,v 1.30 2007/0
 
 #ifdef __weak_alias
 __weak_alias(execvp,_execvp)
+__weak_alias(execvpe,_execvpe)
 #endif
 
-extern char **environ;
-
 int
-execvp(const char *name, char * const *argv)
+execvpe(const char *name, char * const *argv, char * const * envp)
 {
 	const char **memp;
 	int cnt;
@@ -116,7 +115,7 @@ execvp(const char *name, char * const *a
 		memcpy(buf + lp + 1, name, ln);
 		buf[lp + ln + 1] = '\0';
 
-retry:		(void)execve(bp, argv, environ);
+retry:		(void)execve(bp, argv, envp);
 		switch (errno) {
 		case EACCES:
 			eacces = 1;
@@ -136,7 +135,7 @@ retry:		(void)execve(bp, argv, environ);
 			memp[0] = _PATH_BSHELL;
 			memp[1] = bp;
 			(void)memcpy(&memp[2], &argv[1], cnt * sizeof(*memp));
-			(void)execve(_PATH_BSHELL, __UNCONST(memp), environ);
+			(void)execve(_PATH_BSHELL, __UNCONST(memp), envp);
 			goto done;
 		case ETXTBSY:
 			if (etxtbsy < 3)
@@ -153,3 +152,11 @@ retry:		(void)execve(bp, argv, environ);
 done:
 	return (-1);
 }
+
+extern char **environ;
+
+int
+execvp(const char *name, char * const *argv)
+{
+	return execvpe(name, argv, environ);
+}

Index: src/lib/libc/include/namespace.h
diff -u src/lib/libc/include/namespace.h:1.175 src/lib/libc/include/namespace.h:1.176
--- src/lib/libc/include/namespace.h:1.175	Thu Sep 25 11:08:29 2014
+++ src/lib/libc/include/namespace.h	Fri Sep 26 15:28:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: namespace.h,v 1.175 2014/09/25 15:08:29 manu Exp $	*/
+/*	$NetBSD: namespace.h,v 1.176 2014/09/26 19:28:03 christos Exp $	*/
 
 /*-
  * Copyright (c) 1997-2004 The NetBSD Foundation, Inc.
@@ -278,8 +278,10 @@
 #define execl			_execl
 #define execle			_execle
 #define execlp			_execlp
+#define execlpe			_execlpe
 #define execv			_execv
 #define execvp			_execvp
+#define execvpe			_execvpe
 #define explicit_memset		_explicit_memset
 #define fdiscard		_fdiscard
 #define fdopen			_fdopen

Reply via email to