int subprocess_setenv (struct subprocess *p, const char *k, const char *v, int overwrite) { if (p->started) { errno = EINVAL; return (-1); } if (!overwrite && envz_entry (p->envz, p->envz_len, k)) { errno = EEXIST; return -1; } if (envz_add (&p->envz, &p->envz_len, k, v) < 0) { errno = ENOMEM; return (-1); } return (0); }
int do_test (void) { size_t size = 0; char *str = malloc (100); if (str == NULL) { puts ("out of memory"); return 1; } char **argz = &str; for (int i = 0; i < nstrs; ++i) argz_add_sep (argz, &size, strs[i].s, '\0'); printf ("calling envz_strip with size=%zu\n", size); envz_strip (argz, &size); int result = 0; printf ("new size=%zu\n", size); for (int i = 0; i < nstrs; ++i) if (strs[i].in_result) { char name[2]; name[0] = strs[i].s[0]; name[1] = '\0'; char *e = envz_entry (*argz, size, name); if (e == NULL) { printf ("entry '%s' not found\n", name); result = 1; } else if (strcmp (e, strs[i].s) != 0) { printf ("entry '%s' does not match: is '%s', expected '%s'\n", name, e, strs[i].s); result = 1; } } free (*argz); return result; }
#include <errno.h> #include <sys/types.h> #include <string.h> #include <stdlib.h> #include <argz.h> #include <envz.h> void _DEFUN (envz_remove, (envz, envz_len, name), char **envz _AND size_t *envz_len _AND const char *name) { char *entry = NULL; int len = 0; entry = envz_entry (*envz, *envz_len, name); if (entry) { len = strlen(entry) + 1; /* Not the last entry. */ if (*envz + *envz_len != entry + len - 1) { memmove(entry, entry + len, *envz + *envz_len - entry - len); } *envz = (char *)realloc(*envz, *envz_len - len); *envz_len -= len; } }