blob: fa4a4ddc87ab9796127973f41b80e59d45d9f3ef [file] [log] [blame]
Rich Felker0b44a032011-02-12 00:22:29 -05001#include <stdlib.h>
2#include <string.h>
Alexander Monakov8e932792017-09-03 22:12:20 +03003#include "libc.h"
Rich Felker0b44a032011-02-12 00:22:29 -05004
Alexander Monakov8e932792017-09-03 22:12:20 +03005char *__strchrnul(const char *, int);
Rich Felker0b44a032011-02-12 00:22:29 -05006
Alexander Monakov8e932792017-09-03 22:12:20 +03007static void dummy(char *old, char *new) {}
8weak_alias(dummy, __env_rm_add);
9
10int __putenv(char *s, size_t l, char *r)
Rich Felker0b44a032011-02-12 00:22:29 -050011{
Alexander Monakov8e932792017-09-03 22:12:20 +030012 size_t i=0;
13 if (__environ) {
14 for (char **e = __environ; *e; e++, i++)
15 if (!strncmp(s, *e, l+1)) {
16 char *tmp = *e;
17 *e = s;
18 __env_rm_add(tmp, r);
19 return 0;
Rich Felker0b44a032011-02-12 00:22:29 -050020 }
Rich Felker0b44a032011-02-12 00:22:29 -050021 }
Alexander Monakov8e932792017-09-03 22:12:20 +030022 static char **oldenv;
23 char **newenv;
24 if (__environ == oldenv) {
25 newenv = realloc(oldenv, sizeof *newenv * (i+2));
26 if (!newenv) goto oom;
27 } else {
28 newenv = malloc(sizeof *newenv * (i+2));
29 if (!newenv) goto oom;
30 if (i) memcpy(newenv, __environ, sizeof *newenv * i);
Rich Felker0b44a032011-02-12 00:22:29 -050031 free(oldenv);
Rich Felker0b44a032011-02-12 00:22:29 -050032 }
Alexander Monakov8e932792017-09-03 22:12:20 +030033 newenv[i] = s;
34 newenv[i+1] = 0;
35 __environ = oldenv = newenv;
36 if (r) __env_rm_add(0, r);
Rich Felker0b44a032011-02-12 00:22:29 -050037 return 0;
Alexander Monakov8e932792017-09-03 22:12:20 +030038oom:
39 free(r);
40 return -1;
Rich Felker0b44a032011-02-12 00:22:29 -050041}
42
43int putenv(char *s)
44{
Alexander Monakov8e932792017-09-03 22:12:20 +030045 size_t l = __strchrnul(s, '=') - s;
46 if (!l || !s[l]) return unsetenv(s);
47 return __putenv(s, l, 0);
Rich Felker0b44a032011-02-12 00:22:29 -050048}