X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=src%2Ftrackfds.h;h=74d27aa4d4484fc08eaf97e9f05f0ed9481e1627;hb=7ea72c40db03659a9d468f000d59ff133aadf47e;hp=3577fd6323cbaef8d30150f1737362bc7deff4f9;hpb=d475e5ec892390e3f43c5fb4cb373cedc33211fd;p=coloredstderr%2Fcoloredstderr.git diff --git a/src/trackfds.h b/src/trackfds.h index 3577fd6..74d27aa 100644 --- a/src/trackfds.h +++ b/src/trackfds.h @@ -121,24 +121,12 @@ static void init_from_environment(void) { #endif } -static void update_environment(void) { -#ifdef DEBUG - debug("update_environment()\t\t[%d]\n", getpid()); -#endif - - /* An integer (32-bit) has at most 10 digits, + 1 for the comma after each - * number. Bigger file descriptors (which shouldn't occur in reality) are - * skipped. */ - char env[tracked_fds_count * (10 + 1) + 1 /* to fit '\0' */ ]; - env[0] = 0; - - char *x = env; - +static void update_environment_buffer(char *x) { size_t i; for (i = 0; i < tracked_fds_count; i++) { int length = snprintf(x, 10 + 1, "%d", tracked_fds[i]); if (length >= 10 + 1) { - /* Integer too bit to fit the buffer, skip it. */ + /* Integer too big to fit the buffer, skip it. */ continue; } @@ -148,6 +136,28 @@ static void update_environment(void) { /* Make sure the string is always zero terminated. */ *x = 0; } +} +inline static size_t update_environment_buffer_size(void) { + /* An integer (32-bit) has at most 10 digits, + 1 for the comma after each + * number. Bigger file descriptors (which shouldn't occur in reality) are + * skipped. */ + return tracked_fds_count * (10 + 1) + 1 /* to fit '\0' */; +} +static void update_environment(void) { +#ifdef DEBUG + debug("update_environment()\t\t[%d]\n", getpid()); +#endif + + /* If we haven't parsed the environment we also haven't modified it - so + * nothing to do. */ + if (!initialized) { + return; + } + + char env[update_environment_buffer_size()]; + env[0] = 0; + + update_environment_buffer(env); #if 0 debug(" setenv('%s', '%s', 1)\n", ENV_NAME_FDS, env); @@ -161,7 +171,8 @@ static void update_environment(void) { static void tracked_fds_add(int fd) { if (tracked_fds_count >= tracked_fds_space) { size_t new_space = tracked_fds_space + TRACKFDS_REALLOC_STEP; - if (!realloc(tracked_fds, sizeof(*tracked_fds) * new_space)) { + int *tmp = realloc(tracked_fds, sizeof(*tracked_fds) * new_space); + if (!tmp) { /* We can do nothing, just ignore the error. We made sure not to * destroy our state, so the new descriptor is ignored without any * other consequences. */ @@ -171,6 +182,7 @@ static void tracked_fds_add(int fd) { #endif return; } + tracked_fds = tmp; tracked_fds_space = new_space; }