From 3dfd6c11ed5599ab8baf4a6114f4ccb34150de6e Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sun, 5 May 2024 10:24:40 +0200 Subject: First commit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- libexec_unsetenv_first.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 libexec_unsetenv_first.c (limited to 'libexec_unsetenv_first.c') diff --git a/libexec_unsetenv_first.c b/libexec_unsetenv_first.c new file mode 100644 index 0000000..9c5ea12 --- /dev/null +++ b/libexec_unsetenv_first.c @@ -0,0 +1,44 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" +#ifndef TEST + + +int +libexec_unsetenv_first(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); + + for (i = 0; env[i]; i++) + if (!strncmp(env[i], name, len) && env[i][len] == '=') + break; + + if (env[i]) { + n = i; + while (env[n]) + n++; + if (!cmd->environ) + if (libexec_copy_environ(cmd, NULL)) + return -1; + free(cmd->environ[i]); + memmove(&cmd->environ[i], &cmd->environ[i + 1], (n - i - 1) * sizeof(*cmd->environ)); + } + + return 0; +} + + +#else +LIBEXEC_CONST__ int main(void) {return 0;} /* TODO test */ +#endif -- cgit v1.2.3-70-g09d2