Add COLORED_STDERR_IGNORED_BINARIES to exclude binaries.

This commit is contained in:
Simon Ruderich
2013-07-07 13:33:44 +02:00
parent 9ff0ffbd28
commit b950cdb792
5 changed files with 77 additions and 0 deletions

12
README
View File

@@ -93,6 +93,10 @@ The following additional environment variables are available:
If set to an non-empty value add pre/post strings even when not writing to a
terminal, e.g. when writing to a file. By default, only writes to a terminal
are colored.
- 'COLORED_STDERR_IGNORED_BINARIES'
Comma separated list of binary names/paths which should not be tracked
(including their children). Useful for `reset` which writes to the terminal
but fails to work if the output is colored. See below for an example.
All environment variables starting with 'COLORED_STDERR_PRIVATE_*' are
internal variables used by the implementation and should not be set manually.
@@ -113,6 +117,12 @@ Bourne shell:
COLORED_STDERR_POST="${esc}[0m" # default
export COLORED_STDERR_PRE COLORED_STDERR_POST
Fix `reset`; its writes to the terminal must be unaltered. `reset` is
symbolic-link to `tset` on some systems, adapt as necessary:
COLORED_STDERR_IGNORED_BINARIES=/usr/bin/tset
export COLORED_STDERR_IGNORED_BINARIES
DEBUG
-----
@@ -143,6 +153,8 @@ KNOWN ISSUES
(which might be redirected to stderr). Can't be fixed as the compiler
inlines the code into the program without calling any function.
- Test `test_stdio.sh` fails for this reason on FreeBSD.
- 'COLORED_STDERR_IGNORED_BINARIES' requries the `/proc` file system.
Suggestions welcome.
BUGS

View File

@@ -25,6 +25,7 @@
#define ENV_NAME_PRE_STRING "COLORED_STDERR_PRE"
#define ENV_NAME_POST_STRING "COLORED_STDERR_POST"
#define ENV_NAME_FORCE_WRITE "COLORED_STDERR_FORCE_WRITE"
#define ENV_NAME_IGNORED_BINARIES "COLORED_STDERR_IGNORED_BINARIES"
#define ENV_NAME_PRIVATE_FDS "COLORED_STDERR_PRIVATE_FDS"
/* Strings written before/after each matched function. */

View File

@@ -50,6 +50,36 @@ static void tracked_fds_debug(void) {
}
#endif
/* Check if filename occurs in the comma-separated list ignore. */
static int is_program_ignored(char const *filename, char const *ignore) {
size_t length;
size_t filename_length = strlen(filename);
#ifdef DEBUG
debug(" is_program_ignored(\"%s\", \"%s\")\n", filename, ignore);
#endif
for (; *ignore; ignore += length) {
while (*ignore == ',') {
ignore++;
}
length = strcspn(ignore, ",");
if (length == 0) {
break;
}
if (length != filename_length) {
continue;
}
if (!strncmp(filename, ignore, length)) {
return 1;
}
}
return 0;
}
static int init_tracked_fds_list(size_t count) {
assert(count > 0);
@@ -88,6 +118,22 @@ static void init_from_environment(void) {
initialized = 1;
tracked_fds_list_count = 0;
/* Don't color writes to stderr for this binary (and its children) if it's
* contained in the comma-separated list in ENV_NAME_IGNORED_BINARIES. */
env = getenv(ENV_NAME_IGNORED_BINARIES);
if (env) {
char path[512];
/* TODO: Don't require /proc/. */
ssize_t written = readlink("/proc/self/exe", path, sizeof(path) - 1);
if (written > 0) {
path[written] = 0; /* readlink() does not null-terminate! */
if (is_program_ignored(path, env)) {
return;
}
}
}
/* If ENV_NAME_FORCE_WRITE is set and not empty, allow writes to a non-tty
* device. Use with care! Mainly used for the test suite. */
env = getenv(ENV_NAME_FORCE_WRITE);

View File

@@ -20,6 +20,7 @@ set -e
# Allow running the script directly without running `make check`.
test "x$builddir" = x && builddir=.
test "x$abs_builddir" = x && abs_builddir="`pwd`"
test "x$EGREP" = x && EGREP='grep -E'
# The tests fail if running under coloredstderr because the tests redirect

View File

@@ -59,3 +59,20 @@ COLORED_STDERR_FDS=
export COLORED_STDERR_FDS
test_program example example_environment_empty
test_program_subshell example example_environment_empty
unset COLORED_STDERR_FDS
# Test COLORED_STDERR_IGNORED_BINARIES.
if test -x /proc/self/exe; then
COLORED_STDERR_IGNORED_BINARIES="$abs_builddir/example"
export COLORED_STDERR_IGNORED_BINARIES
test_program example example_environment_empty
test_program_subshell example example_environment_empty
COLORED_STDERR_IGNORED_BINARIES=",some,other,path,,"
export COLORED_STDERR_IGNORED_BINARIES
test_program example example_environment
test_program_subshell example example_environment
fi