X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=src%2Ftrackfds.h;h=5896cbb4ee3eb223db010131253bb609d45de774;hb=7f9856c5dace35f8efe5a20ee1013815e67b9550;hp=3577fd6323cbaef8d30150f1737362bc7deff4f9;hpb=d475e5ec892390e3f43c5fb4cb373cedc33211fd;p=coloredstderr%2Fcoloredstderr.git diff --git a/src/trackfds.h b/src/trackfds.h index 3577fd6..5896cbb 100644 --- a/src/trackfds.h +++ b/src/trackfds.h @@ -66,10 +66,8 @@ static void init_from_environment(void) { return; } /* Environment is read-only. */ - char *env_copy = strdup(env); - if (!env_copy) { - return; - } + char env_copy[strlen(env) + 1]; + strcpy(env_copy, env); char *x; @@ -83,7 +81,6 @@ static void init_from_environment(void) { tracked_fds = malloc(tracked_fds_space * sizeof(*tracked_fds)); if (!tracked_fds) { - free(env_copy); return; } @@ -114,31 +111,17 @@ static void init_from_environment(void) { tracked_fds_count = count; - free(env_copy); - #ifdef DEBUG tracked_fds_debug(); #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 +131,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 +166,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 +177,7 @@ static void tracked_fds_add(int fd) { #endif return; } + tracked_fds = tmp; tracked_fds_space = new_space; }