]> ruderich.org/simon Gitweb - coloredstderr/coloredstderr.git/blobdiff - tests/example_exec.c
Overwrite tracked file descriptors when exporting COLORED_STDERR_FDS.
[coloredstderr/coloredstderr.git] / tests / example_exec.c
index 3a185673e7f06931e583847f89d1d95041054005..2d22ce029fbcd56a267ca1a9d976d23dbfe5ae7e 100644 (file)
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <config.h>
+
+/* For execvpe(). */
+#define _GNU_SOURCE
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 
+#include "../src/compiler.h"
+
 
 #define MAGIC "@RUN_"
 #define MAGIC_LENGTH (strlen(MAGIC))
@@ -75,7 +82,7 @@ static void dump(char *argv[]) {
 }
 
 
-int main(int argc, char **argv) {
+int main(int argc unused, char **argv) {
     char argv0[strlen(argv[0]) + MAGIC_LENGTH + 3 + 1];
 
     char *old_ldpreload = getenv("LD_PRELOAD");
@@ -162,9 +169,38 @@ int main(int argc, char **argv) {
 
         execvp(argv[0], args);
         return EXIT_FAILURE;
-    } else {
+
+    /* Test handling of COLORED_STDERR_FDS. */
+
+    } else if (!skip--) {
+        /* And the rest. */
         close(3);
         close(8);
+
+        dup2(2, 5);
+
+        char *args[] = { argv0, NULL };
+        char *envp[] = { ldpreload, "COLORED_STDERR_FDS=5,", NULL };
+
+        execve(argv[0], args, envp);
+        return EXIT_FAILURE;
+    } else if (!skip--) {
+        char *args[] = { argv0, NULL };
+        char *envp[] = { ldpreload, NULL };
+
+        dup2(5, 6);
+        close(5);
+
+        execve(argv[0], args, envp);
+        return EXIT_FAILURE;
+    } else if (!skip--) {
+        close(6);
+
+        char *args[] = { argv0, NULL };
+        setenv("COLORED_STDERR_FDS", "2,", 1);
+
+        execv(argv[0], args);
+        return EXIT_FAILURE;
     }
 
 
@@ -265,6 +301,35 @@ int main(int argc, 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_PRIVATE_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_PRIVATE_FDS=2,|");
+        puts("");
+#endif
     }
 
     printf("Done.\n");