Commit | Line | Data |
---|---|---|
06cf6fdc JH |
1 | /************************************************* |
2 | * Exim - an Internet mail transport agent * | |
3 | *************************************************/ | |
4 | ||
80fea873 JH |
5 | /* Copyright (c) Michael Haardt 2015 |
6 | * Copyright (c) Jeremy Harris 2015 - 2016 | |
7 | * Copyright (c) The Exim Maintainers 2016 */ | |
06cf6fdc JH |
8 | /* See the file NOTICE for conditions of use and distribution. */ |
9 | ||
10 | /* This module provides (un)setenv routines for those environments | |
dfe7d917 | 11 | lacking them in libraries. It is #include'd by OS/os.c-foo files. */ |
06cf6fdc JH |
12 | |
13 | ||
dfe7d917 | 14 | int |
06cf6fdc JH |
15 | setenv(const char * name, const char * val, int overwrite) |
16 | { | |
17 | uschar * s; | |
18 | if (Ustrchr(name, '=')) return -1; | |
19 | if (overwrite || !getenv(name)) | |
20 | putenv(CS string_copy_malloc(string_sprintf("%s=%s", name, val))); | |
21 | return 0; | |
22 | } | |
23 | ||
dfe7d917 | 24 | int |
06cf6fdc JH |
25 | unsetenv(const char *name) |
26 | { | |
27 | size_t len; | |
28 | const char * end; | |
06cf6fdc JH |
29 | extern char ** environ; |
30 | ||
31 | if (!name) | |
32 | { | |
33 | errno = EINVAL; | |
34 | return -1; | |
35 | } | |
36 | ||
bc3c7bb7 HSHR |
37 | if (!environ) |
38 | return 0; | |
39 | ||
06cf6fdc JH |
40 | for (end = name; *end != '=' && *end; ) end++; |
41 | len = end - name; | |
42 | ||
43 | /* Find name in environment and move remaining variables down. | |
44 | Do not early-out in case there are duplicate names. */ | |
45 | ||
d7978c0f | 46 | for (char ** e = environ; *e; e++) |
06cf6fdc JH |
47 | if (strncmp(*e, name, len) == 0 && (*e)[len] == '=') |
48 | { | |
49 | char ** sp = e; | |
50 | do *sp = sp[1]; while (*++sp); | |
51 | } | |
52 | ||
53 | return 0; | |
54 | } | |
55 | ||
56 | /* vi: aw ai sw=2 | |
57 | */ | |
58 | /* End of setenv.c */ |