X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;ds=inline;f=tests%2Fexample_exec.c;h=415da45c4c60bab9afcb67494238550f1b216a06;hb=b950cdb79209e092d20d629bd1b0e9211647bd1e;hp=3a185673e7f06931e583847f89d1d95041054005;hpb=7ea72c40db03659a9d468f000d59ff133aadf47e;p=coloredstderr%2Fcoloredstderr.git
diff --git a/tests/example_exec.c b/tests/example_exec.c
index 3a18567..415da45 100644
--- a/tests/example_exec.c
+++ b/tests/example_exec.c
@@ -17,11 +17,19 @@
* along with this program. If not, see .
*/
+#include
+
+/* For execvpe(). */
+#define _GNU_SOURCE
+
#include
#include
#include
#include
+#include "example.h"
+#include "../src/compiler.h"
+
#define MAGIC "@RUN_"
#define MAGIC_LENGTH (strlen(MAGIC))
@@ -51,6 +59,9 @@ static int find_magic_run_number(char *argv0, int *number) {
return 1;
}
+static int cmp(void const *a, void const *b) {
+ return strcmp(*(char * const *)a, *(char * const *)b);
+}
static void dump(char *argv[]) {
size_t i;
@@ -58,14 +69,23 @@ static void dump(char *argv[]) {
while (*argv) {
printf("argv[%zu] = |%s|\n", i++, *argv++);
}
+
+ /* Order of environment variables is not defined, sort them for consistent
+ * test results. */
i = 0;
char **env = environ;
+ while (*env++) {
+ i++;
+ }
+ qsort(environ, i, sizeof(*env), cmp);
+
+ i = 0;
+ env = environ;
while (*env) {
/* Skip LD_PRELOAD which contains system dependent values. */
if (strncmp(*env, "LD_PRELOAD=", 11)) {
- printf("environ[%zu] = |%s|\n", i, *env);
+ printf("environ[%zu] = |%s|\n", i++, *env);
}
- i++;
env++;
}
printf("\n");
@@ -75,7 +95,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");
@@ -116,7 +136,7 @@ int main(int argc, char **argv) {
printf("\nCHECKING COLORING.\n\n");
fflush(stdout);
- dup2(2, 3);
+ xdup2(2, 3);
char *args[] = { argv0, NULL };
char *envp[] = { ldpreload, NULL };
@@ -124,24 +144,24 @@ int main(int argc, char **argv) {
execve(argv[0], args, envp);
return EXIT_FAILURE;
} else if (!skip--) {
- dup2(2, 4);
+ xdup2(2, 4);
execl(argv[0], argv0, NULL);
return EXIT_FAILURE;
} else if (!skip--) {
- dup2(2, 5);
+ xdup2(2, 5);
execlp(argv[0], argv0, NULL);
return EXIT_FAILURE;
} else if (!skip--) {
- dup2(2, 6);
+ xdup2(2, 6);
char *envp[] = { ldpreload, NULL };
execle(argv[0], argv0, NULL, envp);
return EXIT_FAILURE;
} else if (!skip--) {
- dup2(2, 7);
+ xdup2(2, 7);
/* Test closing a few descriptors. */
close(5);
@@ -152,7 +172,7 @@ int main(int argc, char **argv) {
execv(argv[0], args);
return EXIT_FAILURE;
} else if (!skip--) {
- dup2(2, 8);
+ xdup2(2, 8);
/* And a few more. */
close(7);
@@ -162,9 +182,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);
+
+ xdup2(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 };
+
+ xdup2(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 +314,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] = |COLORED_STDERR_PRIVATE_FDS=2,|");
+ puts("environ[1] = |TEST=54|");
+ puts("");
+ puts("argv[0] = |./example_exec|");
+ puts("argv[1] = |foo|");
+ puts("argv[2] = |bar|");
+ puts("environ[0] = |COLORED_STDERR_PRIVATE_FDS=2,|");
+ puts("environ[1] = |TEST=55|");
+ puts("");
+#endif
}
printf("Done.\n");