diff options
author | Mattias Andrée <maandree@kth.se> | 2024-05-05 10:24:40 +0200 |
---|---|---|
committer | Mattias Andrée <maandree@kth.se> | 2024-05-05 10:24:40 +0200 |
commit | 3dfd6c11ed5599ab8baf4a6114f4ccb34150de6e (patch) | |
tree | b7717583b99f29028c85c3423cf43b104dfa8943 /libexec_unsetenv.c | |
download | libexec-3dfd6c11ed5599ab8baf4a6114f4ccb34150de6e.tar.gz libexec-3dfd6c11ed5599ab8baf4a6114f4ccb34150de6e.tar.bz2 libexec-3dfd6c11ed5599ab8baf4a6114f4ccb34150de6e.tar.xz |
First commit
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'libexec_unsetenv.c')
-rw-r--r-- | libexec_unsetenv.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/libexec_unsetenv.c b/libexec_unsetenv.c new file mode 100644 index 0000000..48ec645 --- /dev/null +++ b/libexec_unsetenv.c @@ -0,0 +1,48 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" +#ifndef TEST + + +int +libexec_unsetenv(struct libexec_command *cmd, const char *name) +{ + char **env; + size_t i, n, len; + + if (!cmd || !name) { + errno = EINVAL; + return -1; + } + + if (strchr(name, '=')) + return 0; + + env = cmd->environ ? cmd->environ : environ; + len = strlen(name); + + n = 0; + while (env[n]) + n++; + + for (i = 0; i < n;) { + if (!strncmp(env[i], name, len) && env[i][len] == '=') { + if (!cmd->environ) { + if (libexec_copy_environ(cmd, NULL)) + return -1; + env = cmd->environ; + } + free(env); + memmove(&env[i], &env[i + 1], (n - i - 1) * sizeof(*env)); + n--; + } else { + i++; + } + } + + return 0; +} + + +#else +LIBEXEC_CONST__ int main(void) {return 0;} /* TODO test */ +#endif |