mirror of
https://github.com/FAUSheppy/colorredstderr-mirror
synced 2025-12-09 16:38:32 +01:00
Overwrite tracked file descriptors when exporting COLORED_STDERR_FDS.
If the list of tracked file descriptors is modified to contain unwanted values (e.g. when a parent process closes or redirects stderr), this makes it possible to set the tracked file descriptors back to a given list. This problem occurred with startx which somehow closes or redirects stderr. As COLORED_STDERR_FDS was set in the shell running startx, this disabled coloring stderr for all processes started in the X11 session. This is no longer an issue. As COLORED_STDERR_FDS is set in the shell configuration file, it automatically sets the list to the correct value when a shell is opened in the terminal emulator once X11 is running.
This commit is contained in:
@@ -169,9 +169,38 @@ int main(int argc unused, 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -292,13 +321,13 @@ int main(int argc unused, char **argv) {
|
||||
} else if (!skip--) {
|
||||
puts("argv[0] = |./example_exec|");
|
||||
puts("environ[0] = |TEST=54|");
|
||||
puts("environ[2] = |COLORED_STDERR_FDS=2,|");
|
||||
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_FDS=2,|");
|
||||
puts("environ[2] = |COLORED_STDERR_PRIVATE_FDS=2,|");
|
||||
puts("");
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1,114 +1,125 @@
|
||||
argv[0] = |./example_exec|
|
||||
environ[1] = |COLORED_STDERR_FDS=2,|
|
||||
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,|
|
||||
|
||||
|
||||
CHECKING COLORING.
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[1] = |COLORED_STDERR_FDS=2,3,|
|
||||
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,3,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[1] = |COLORED_STDERR_FDS=2,3,4,|
|
||||
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,3,4,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[1] = |COLORED_STDERR_FDS=2,3,4,5,|
|
||||
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,3,4,5,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[1] = |COLORED_STDERR_FDS=2,3,4,5,6,|
|
||||
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,3,4,5,6,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[1] = |COLORED_STDERR_FDS=2,3,4,7,|
|
||||
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,3,4,7,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[1] = |COLORED_STDERR_FDS=2,3,8,|
|
||||
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,3,8,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[1] = |COLORED_STDERR_FDS=5,|
|
||||
environ[2] = |COLORED_STDERR_PRIVATE_FDS=2,5,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[1] = |COLORED_STDERR_PRIVATE_FDS=6,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[1] = |COLORED_STDERR_PRIVATE_FDS=|
|
||||
environ[2] = |COLORED_STDERR_FDS=2,|
|
||||
|
||||
|
||||
CHECKING TRANSPARENCY.
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[1] = |COLORED_STDERR_FDS=2,|
|
||||
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[0] = |TEST=42|
|
||||
environ[2] = |COLORED_STDERR_FDS=2,|
|
||||
environ[2] = |COLORED_STDERR_PRIVATE_FDS=2,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
argv[1] = |foo|
|
||||
argv[2] = |bar|
|
||||
environ[0] = |TEST=43|
|
||||
environ[1] = |FOO=|
|
||||
environ[3] = |COLORED_STDERR_FDS=2,|
|
||||
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[0] = |TEST=44|
|
||||
environ[1] = |FOO=|
|
||||
environ[3] = |COLORED_STDERR_FDS=2,|
|
||||
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
argv[1] = |foo|
|
||||
argv[2] = |bar|
|
||||
environ[0] = |TEST=45|
|
||||
environ[1] = |FOO=|
|
||||
environ[3] = |COLORED_STDERR_FDS=2,|
|
||||
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[0] = |TEST=46|
|
||||
environ[1] = |FOO=|
|
||||
environ[3] = |COLORED_STDERR_FDS=2,|
|
||||
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
argv[1] = |foo|
|
||||
argv[2] = |bar|
|
||||
environ[0] = |TEST=47|
|
||||
environ[1] = |FOO=|
|
||||
environ[3] = |COLORED_STDERR_FDS=2,|
|
||||
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[1] = |COLORED_STDERR_FDS=2,|
|
||||
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[0] = |TEST=48|
|
||||
environ[2] = |COLORED_STDERR_FDS=2,|
|
||||
environ[2] = |COLORED_STDERR_PRIVATE_FDS=2,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
argv[1] = |foo|
|
||||
argv[2] = |bar|
|
||||
environ[0] = |TEST=49|
|
||||
environ[1] = |FOO=|
|
||||
environ[3] = |COLORED_STDERR_FDS=2,|
|
||||
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[0] = |TEST=50|
|
||||
environ[1] = |FOO=|
|
||||
environ[3] = |COLORED_STDERR_FDS=2,|
|
||||
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
argv[1] = |foo|
|
||||
argv[2] = |bar|
|
||||
environ[0] = |TEST=51|
|
||||
environ[1] = |FOO=|
|
||||
environ[3] = |COLORED_STDERR_FDS=2,|
|
||||
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[0] = |TEST=52|
|
||||
environ[1] = |FOO=|
|
||||
environ[3] = |COLORED_STDERR_FDS=2,|
|
||||
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
argv[1] = |foo|
|
||||
argv[2] = |bar|
|
||||
environ[0] = |TEST=53|
|
||||
environ[1] = |FOO=|
|
||||
environ[3] = |COLORED_STDERR_FDS=2,|
|
||||
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
environ[0] = |TEST=54|
|
||||
environ[2] = |COLORED_STDERR_FDS=2,|
|
||||
environ[2] = |COLORED_STDERR_PRIVATE_FDS=2,|
|
||||
|
||||
argv[0] = |./example_exec|
|
||||
argv[1] = |foo|
|
||||
argv[2] = |bar|
|
||||
environ[0] = |TEST=55|
|
||||
environ[2] = |COLORED_STDERR_FDS=2,|
|
||||
environ[2] = |COLORED_STDERR_PRIVATE_FDS=2,|
|
||||
|
||||
Done.
|
||||
|
||||
@@ -40,7 +40,10 @@ fi
|
||||
LC_ALL=C
|
||||
unset LANGUAGE
|
||||
|
||||
# Set default COLORED_STDERR_FDS value.
|
||||
# Clear user defined variables.
|
||||
unset COLORED_STDERR_FDS
|
||||
unset COLORED_STDERR_FORCE_WRITE
|
||||
# Set default COLORED_STDERR_PRIVATE_FDS value.
|
||||
fds=2,
|
||||
|
||||
|
||||
@@ -78,9 +81,9 @@ run_test() {
|
||||
(
|
||||
# Standard setup.
|
||||
LD_PRELOAD="$library"
|
||||
COLORED_STDERR_FDS="$fds"
|
||||
COLORED_STDERR_PRIVATE_FDS="$fds"
|
||||
export LD_PRELOAD
|
||||
export COLORED_STDERR_FDS
|
||||
export COLORED_STDERR_PRIVATE_FDS
|
||||
|
||||
# Change pre/post strings for simpler testing.
|
||||
COLORED_STDERR_PRE='>STDERR>'
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
test "x$srcdir" = x && srcdir=.
|
||||
. "$srcdir/lib.sh"
|
||||
|
||||
# Test unexpected values for COLORED_STDERR_FDS environment variable.
|
||||
# Test unexpected values for COLORED_STDERR_PRIVATE_FDS environment variable.
|
||||
|
||||
# Empty fields.
|
||||
fds=
|
||||
@@ -44,3 +44,18 @@ test_program_subshell example example_environment
|
||||
fds=-20,-30,2,-1,
|
||||
test_program example example_environment
|
||||
test_program_subshell example example_environment
|
||||
|
||||
# Test COLORED_STDERR_FDS overwrites COLORED_STDERR_PRIVATE_FDS. Additional
|
||||
# tests in example_exec.
|
||||
|
||||
fds=
|
||||
COLORED_STDERR_FDS=2,
|
||||
export COLORED_STDERR_FDS
|
||||
test_program example example_environment
|
||||
test_program_subshell example example_environment
|
||||
|
||||
fds=2,
|
||||
COLORED_STDERR_FDS=
|
||||
export COLORED_STDERR_FDS
|
||||
test_program example example_environment_empty
|
||||
test_program_subshell example example_environment_empty
|
||||
|
||||
Reference in New Issue
Block a user