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_copy_environ.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_copy_environ.c')
-rw-r--r-- | libexec_copy_environ.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/libexec_copy_environ.c b/libexec_copy_environ.c new file mode 100644 index 0000000..2c7e19f --- /dev/null +++ b/libexec_copy_environ.c @@ -0,0 +1,51 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" +#ifndef TEST + + +int +libexec_copy_environ(struct libexec_command *cmd, const char *const *env) +{ + size_t i, n; + char **new_env; + + if (!cmd) { + errno = EINVAL; + return -1; + } + + if (!env) + env = *(const char *const **)(void *)&environ; + + n = 0; + while (env[n]) + n++; + + new_env = calloc((n + 1), sizeof(*cmd->environ)); + if (!new_env) + return -1; + + for (i = 0; i < n; i++) { + new_env[i] = strdup(env[i]); + if (!new_env[i]) { + while (i--) + free(new_env[i]); + free(new_env); + return -1; + } + } + + if (cmd->environ) { + for (i = 0; cmd->environ[i]; i++) + free(cmd->environ[i]); + free(cmd->environ); + } + + cmd->environ = new_env; + return 0; +} + + +#else +LIBEXEC_CONST__ int main(void) {return 0;} /* TODO test */ +#endif |