X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=src%2Ftrackfds.h;h=c75508677c267c98ca1a34e2bcb0d41ee277ec59;hb=f54cd101d750cb31f54081a41d6cb880a9199dba;hp=5720b0cca54cc6d159ec8d760d35ae5883878509;hpb=9ff0ffbd28416538a4ccc2445875339c7eb20dfe;p=coloredstderr%2Fcoloredstderr.git diff --git a/src/trackfds.h b/src/trackfds.h index 5720b0c..c755086 100644 --- a/src/trackfds.h +++ b/src/trackfds.h @@ -1,7 +1,7 @@ /* * Utility functions to track file descriptors. * - * Copyright (C) 2013 Simon Ruderich + * Copyright (C) 2013-2014 Simon Ruderich * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -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); @@ -139,10 +185,6 @@ static void init_from_environment(void) { goto next; } - if (i == count) { - break; - } - /* Replace ',' to null-terminate number for atoi(). */ *x = 0; @@ -360,7 +402,7 @@ inline static int tracked_fds_find(int fd) { return 0; } - if (fd < TRACKFDS_STATIC_COUNT) { + if (likely(fd < TRACKFDS_STATIC_COUNT)) { return tracked_fds[fd]; }