X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=src%2Ftrackfds.h;h=5896cbb4ee3eb223db010131253bb609d45de774;hb=feff94de6be535f17f06e3c135366b33ab9c0ca3;hp=476093818a5dae4aabe2b1c1e50c7680124e18a1;hpb=a9db9083b6fd9c1bd6a09df6d64386d806488f7c;p=coloredstderr%2Fcoloredstderr.git diff --git a/src/trackfds.h b/src/trackfds.h index 4760938..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,26 +111,12 @@ 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]); @@ -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);