Last change
on this file since 400 was 389, checked in by coas-nagasima, 5 years ago |
ビルドが通るよう更新
|
-
Property svn:eol-style
set to
native
-
Property svn:mime-type
set to
text/x-csrc;charset=UTF-8
|
File size:
976 bytes
|
Rev | Line | |
---|
[388] | 1 | #include <stdlib.h>
|
---|
| 2 | #include <string.h>
|
---|
| 3 | #include <errno.h>
|
---|
| 4 |
|
---|
| 5 | char *__strchrnul(const char *, int);
|
---|
| 6 | int __putenv(char *, size_t, char *);
|
---|
| 7 |
|
---|
| 8 | void __env_rm_add(char *old, char *new)
|
---|
| 9 | {
|
---|
| 10 | static char **env_alloced;
|
---|
| 11 | static size_t env_alloced_n;
|
---|
| 12 | for (size_t i=0; i < env_alloced_n; i++)
|
---|
| 13 | if (env_alloced[i] == old) {
|
---|
| 14 | env_alloced[i] = new;
|
---|
| 15 | free(old);
|
---|
| 16 | return;
|
---|
| 17 | } else if (!env_alloced[i] && new) {
|
---|
| 18 | env_alloced[i] = new;
|
---|
| 19 | new = 0;
|
---|
| 20 | }
|
---|
| 21 | if (!new) return;
|
---|
| 22 | char **t = realloc(env_alloced, sizeof *t * (env_alloced_n+1));
|
---|
| 23 | if (!t) return;
|
---|
| 24 | (env_alloced = t)[env_alloced_n++] = new;
|
---|
| 25 | }
|
---|
| 26 |
|
---|
| 27 | int setenv(const char *var, const char *value, int overwrite)
|
---|
| 28 | {
|
---|
| 29 | char *s;
|
---|
| 30 | size_t l1, l2;
|
---|
| 31 |
|
---|
| 32 | if (!var || !(l1 = __strchrnul(var, '=') - var) || var[l1]) {
|
---|
| 33 | errno = EINVAL;
|
---|
| 34 | return -1;
|
---|
| 35 | }
|
---|
| 36 | if (!overwrite && getenv(var)) return 0;
|
---|
| 37 |
|
---|
| 38 | l2 = strlen(value);
|
---|
| 39 | s = malloc(l1+l2+2);
|
---|
| 40 | if (!s) return -1;
|
---|
| 41 | memcpy(s, var, l1);
|
---|
| 42 | s[l1] = '=';
|
---|
| 43 | memcpy(s+l1+1, value, l2+1);
|
---|
| 44 | return __putenv(s, l1, s);
|
---|
| 45 | }
|
---|
Note:
See
TracBrowser
for help on using the repository browser.