add execvpe, execlpe (reviewed by phone)
This commit is contained in:
parent
dbd2779418
commit
718924c8d3
@ -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);
|
||||
|
@ -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 endutxent.3 getutxid.3 \
|
||||
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 \
|
||||
|
@ -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 the ones described above occurs.
|
||||
.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.
|
||||
|
@ -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/06/30 19:46:07 joerg Exp $");
|
||||
#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);
|
||||
}
|
||||
|
@ -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/07/20 12:41:07 yamt Exp $");
|
||||
|
||||
#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 *argv)
|
||||
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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user