implement fexecve in terms of execveat when it exists
authorJoseph C. Sible <josephcsible@gmail.com>
Sun, 2 Sep 2018 17:42:26 +0000 (13:42 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 4 Sep 2018 23:26:52 +0000 (19:26 -0400)
This lets fexecve work even when /proc isn't mounted.

src/process/fexecve.c

index 6507b42..8be3f76 100644 (file)
@@ -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);