summaryrefslogtreecommitdiff
path: root/src/process
diff options
context:
space:
mode:
authorJoseph C. Sible <josephcsible@gmail.com>2018-09-02 13:42:26 -0400
committerRich Felker <dalias@aerifal.cx>2018-09-04 19:26:52 -0400
commite36f80cba6d5eefcc1ee664f16c2c72054b83134 (patch)
tree88e85d4a1c0291ea8c6c0d9f5c993a4fa70482f1 /src/process
parent0fa1e638e87cf257e9f96b4019b2076afd674a19 (diff)
downloadmusl-e36f80cba6d5eefcc1ee664f16c2c72054b83134.tar.gz
implement fexecve in terms of execveat when it exists
This lets fexecve work even when /proc isn't mounted.
Diffstat (limited to 'src/process')
-rw-r--r--src/process/fexecve.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/process/fexecve.c b/src/process/fexecve.c
index 6507b429..8be3f760 100644
--- a/src/process/fexecve.c
+++ b/src/process/fexecve.c
@@ -1,10 +1,15 @@
+#define _GNU_SOURCE
#include <unistd.h>
#include <errno.h>
+#include <fcntl.h>
+#include "syscall.h"
void __procfdname(char *, unsigned);
int fexecve(int fd, char *const argv[], char *const envp[])
{
+ int r = __syscall(SYS_execveat, fd, "", argv, envp, AT_EMPTY_PATH);
+ if (r != -ENOSYS) return __syscall_ret(r);
char buf[15 + 3*sizeof(int)];
__procfdname(buf, fd);
execve(buf, argv, envp);