From 9d22e56178455d666b9774052b7b6f09291e7080 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 29 Mar 2019 18:49:09 +0100 Subject: [PATCH] MINOR: tools: add an unsetenv() implementation Older Solaris and AIX versions do not have unsetenv(). This adds a fairly simple implementation which scans the environment, for use with those systems. It will simply require to pass the define in the "DEFINE" macro at build time like this : DEFINE="-Dunsetenv=my_unsetenv" --- include/common/standard.h | 10 ++++++++++ src/standard.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/include/common/standard.h b/include/common/standard.h index 7536a6491d..0900798d48 100644 --- a/include/common/standard.h +++ b/include/common/standard.h @@ -1224,6 +1224,16 @@ char *memprintf(char **out, const char *format, ...) */ char *indent_msg(char **out, int level); +/* removes environment variable from the environment as found in + * environ. This is only provided as an alternative for systems without + * unsetenv() (old Solaris and AIX versions). THIS IS NOT THREAD SAFE. + * The principle is to scan environ for each occurence of variable name + * and to replace the matching pointers with the last pointer of + * the array (since variables are not ordered). + * It always returns 0 (success). + */ +int my_unsetenv(const char *name); + /* Convert occurrences of environment variables in the input string to their * corresponding value. A variable is identified as a series of alphanumeric * characters or underscores following a '$' sign. The string must be diff --git a/src/standard.c b/src/standard.c index 09bc155136..1035e20272 100644 --- a/src/standard.c +++ b/src/standard.c @@ -3699,6 +3699,38 @@ char *indent_msg(char **out, int level) return ret; } +/* removes environment variable from the environment as found in + * environ. This is only provided as an alternative for systems without + * unsetenv() (old Solaris and AIX versions). THIS IS NOT THREAD SAFE. + * The principle is to scan environ for each occurence of variable name + * and to replace the matching pointers with the last pointer of + * the array (since variables are not ordered). + * It always returns 0 (success). + */ +int my_unsetenv(const char *name) +{ + extern char **environ; + char **p = environ; + int vars; + int next; + int len; + + len = strlen(name); + for (vars = 0; p[vars]; vars++) + ; + next = 0; + while (next < vars) { + if (strncmp(p[next], name, len) != 0 || p[next][len] != '=') { + next++; + continue; + } + if (next < vars - 1) + p[next] = p[vars - 1]; + p[--vars] = NULL; + } + return 0; +} + /* Convert occurrences of environment variables in the input string to their * corresponding value. A variable is identified as a series of alphanumeric * characters or underscores following a '$' sign. The string must be