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"
This commit is contained in:
Willy Tarreau 2019-03-29 18:49:09 +01:00
parent e0609f5f49
commit 9d22e56178
2 changed files with 42 additions and 0 deletions

View File

@ -1224,6 +1224,16 @@ char *memprintf(char **out, const char *format, ...)
*/
char *indent_msg(char **out, int level);
/* removes environment variable <name> 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
* <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 <in> string must be

View File

@ -3699,6 +3699,38 @@ char *indent_msg(char **out, int level)
return ret;
}
/* removes environment variable <name> 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
* <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 <in> string must be