]> ruderich.org/simon Gitweb - coloredstderr/coloredstderr.git/commitdiff
Hook execvpe(), a GNU extension.
authorSimon Ruderich <simon@ruderich.org>
Mon, 10 Jun 2013 15:10:44 +0000 (17:10 +0200)
committerSimon Ruderich <simon@ruderich.org>
Mon, 10 Jun 2013 15:10:44 +0000 (17:10 +0200)
configure.ac
src/coloredstderr.c
tests/example_exec.c
tests/example_exec.expected

index 307b8596a2d91d67ab1e82a3ebabccf9ce777c9d..3efe25d0abb5df9fa059eb7cceb2f1e206356ecc 100644 (file)
@@ -48,6 +48,7 @@ AX_C___ATTRIBUTE__
 AC_FUNC_FORK
 AC_CHECK_FUNCS([memmove setenv],
                [],[AC_MSG_ERROR([function is required])])
+AC_CHECK_FUNCS([execvpe])
 
 dnl Thanks to gperftools' configure.ac (https://code.google.com/p/gperftools).
 AC_MSG_CHECKING([for __builtin_expect])
index e3cc1d6337bd8839b68df218494ee6de1862acbb..d4ffdb6aa5bcb84cc3d9450e5ea8052b534a06cd 100644 (file)
@@ -536,3 +536,13 @@ int execvp(char const *file, char * const argv[]) {
     update_environment();
     return real_execvp(file, argv);
 }
+
+#ifdef HAVE_EXECVPE
+extern char **environ;
+int execvpe(char const *file, char * const argv[], char * const envp[]) {
+    /* Fake the environment so we can reuse execvp(). */
+    environ = (char **)envp;
+
+    return execvp(file, argv);
+}
+#endif
index bd12b5a71f7b5f5ce42436144d966b5a192e3e6c..bd5670079c9e270fb491028d8bbd086588c21402 100644 (file)
@@ -19,6 +19,9 @@
 
 #include <config.h>
 
+/* For execvpe(). */
+#define _GNU_SOURCE
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -269,6 +272,35 @@ int main(int argc unused, char **argv) {
 
         execvp(argv[0], args);
         return EXIT_FAILURE;
+
+#ifdef HAVE_EXECVPE
+    /* execvpe(3), but not testing the p(ath) part */
+    } else if (!skip--) {
+        char *args[] = { argv0, NULL };
+        char *envp[] = { "TEST=54", ldpreload, NULL };
+
+        execvpe(argv[0], args, envp);
+        return EXIT_FAILURE;
+    } else if (!skip--) {
+        char *args[] = { argv0, "foo", "bar", NULL };
+        char *envp[] = { "TEST=55", ldpreload, NULL };
+
+        execvpe(argv[0], args, envp);
+        return EXIT_FAILURE;
+#else
+    /* Fake output to let the test pass. */
+    } else if (!skip--) {
+        puts("argv[0] = |./example_exec|");
+        puts("environ[0] = |TEST=54|");
+        puts("environ[2] = |COLORED_STDERR_FDS=2,|");
+        puts("");
+        puts("argv[0] = |./example_exec|");
+        puts("argv[1] = |foo|");
+        puts("argv[2] = |bar|");
+        puts("environ[0] = |TEST=55|");
+        puts("environ[2] = |COLORED_STDERR_FDS=2,|");
+        puts("");
+#endif
     }
 
     printf("Done.\n");
index 9a8a6ce784ec0b01c4605d0b0096e05561675d4f..c79a3decdd27c65525f1d3393c0609f82fd970a8 100644 (file)
@@ -101,4 +101,14 @@ environ[0] = |TEST=53|
 environ[1] = |FOO=|
 environ[3] = |COLORED_STDERR_FDS=2,|
 
+argv[0] = |./example_exec|
+environ[0] = |TEST=54|
+environ[2] = |COLORED_STDERR_FDS=2,|
+
+argv[0] = |./example_exec|
+argv[1] = |foo|
+argv[2] = |bar|
+environ[0] = |TEST=55|
+environ[2] = |COLORED_STDERR_FDS=2,|
+
 Done.