aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@member.fsf.org>2016-01-01 17:50:30 +0100
committerMattias Andrée <maandree@member.fsf.org>2016-01-01 17:50:30 +0100
commitd45b0f627409c6646c65012bce6819dae7f9db1b (patch)
treef5c31154f98019f6a934ccdc4983a16be4a576f5
parentportability (diff)
downloadslibc-d45b0f627409c6646c65012bce6819dae7f9db1b.tar.gz
slibc-d45b0f627409c6646c65012bce6819dae7f9db1b.tar.bz2
slibc-d45b0f627409c6646c65012bce6819dae7f9db1b.tar.xz
m
Signed-off-by: Mattias Andrée <maandree@member.fsf.org>
-rw-r--r--src/unistd/exec.c1
-rw-r--r--src/unistd/execat.c15
-rw-r--r--src/unistd/fexec.c17
3 files changed, 25 insertions, 8 deletions
diff --git a/src/unistd/exec.c b/src/unistd/exec.c
index 69edc4e..2d121e7 100644
--- a/src/unistd/exec.c
+++ b/src/unistd/exec.c
@@ -285,6 +285,7 @@ int execve(const char* path, char* const argv[], char* const envp[])
return errno = ENOTSUP, -1;
(void) path, (void) argv, (void) envp;
/* TODO implement execve */
+ /* TODO support wrapping in valgrind, strace, &c. */
}
diff --git a/src/unistd/execat.c b/src/unistd/execat.c
index 87519e4..0005877 100644
--- a/src/unistd/execat.c
+++ b/src/unistd/execat.c
@@ -35,6 +35,17 @@ struct stat { int st_mode; };
/**
+ * The directory where all the process's file descriptors are available.
+ */
+#if defined(_LINUX_)
+# define FD_PATH "/proc/self/fd" /* /dev/fd works but it is a symbolic link. */
+#else
+# define FD_PATH "/dev/fd"
+#endif
+
+
+
+/**
* The current environment variables.
*
* @since Always.
@@ -415,11 +426,11 @@ int execveat(int dirfd, const char* path, char* const argv[], char* const envp[]
return errno = ELOOP, -1;
}
- pathname = malloc(sizeof("/dev/fd//") + (3 * sizeof(int) + strlen(path)) * sizeof(char));
+ pathname = malloc(sizeof(FD_PATH "//") + (3 * sizeof(int) + strlen(path)) * sizeof(char));
if (pathname == NULL)
return -1;
- sprintf(pathname, "/dev/fd/%i%s%s", dirfd, *path ? "/" : "", path);
+ sprintf(pathname, FD_PATH "/%i%s%s", dirfd, *path ? "/" : "", path);
execve(pathname, argv, envp);
saved_errno = errno;
diff --git a/src/unistd/fexec.c b/src/unistd/fexec.c
index 36352ce..ec592d1 100644
--- a/src/unistd/fexec.c
+++ b/src/unistd/fexec.c
@@ -24,6 +24,17 @@
/**
+ * The directory where all the process's file descriptors are available.
+ */
+#if defined(_LINUX_)
+# define FD_PATH "/proc/self/fd" /* /dev/fd works but it is a symbolic link. */
+#else
+# define FD_PATH "/dev/fd"
+#endif
+
+
+
+/**
* The current environment variables.
*
* @since Always.
@@ -186,12 +197,6 @@ int fexecv(int fd, char* const argv[])
*/
int fexecve(int fd, char* const argv[], char* const envp[])
{
-#if defined(_LINUX_)
-# define FD_PATH "/proc/self/fd" /* /dev/fd works but it is a symbolic link. */
-#else
-# define FD_PATH "/dev/fd"
-#endif
-
char pathname[sizeof(FD_PATH "//") + 3 * sizeof(int)];
int saved_errno;