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; | |
29 | char ** e; | |
30 | extern char ** environ; | |
31 | ||
32 | if (!name) | |
33 | { | |
34 | errno = EINVAL; | |
35 | return -1; | |
36 | } | |
37 | ||
bc3c7bb7 HSHR |
38 | if (!environ) |
39 | return 0; | |
40 | ||
06cf6fdc JH |
41 | for (end = name; *end != '=' && *end; ) end++; |
42 | len = end - name; | |
43 | ||
44 | /* Find name in environment and move remaining variables down. | |
45 | Do not early-out in case there are duplicate names. */ | |
46 | ||
47 | for (e = environ; *e; e++) | |
48 | if (strncmp(*e, name, len) == 0 && (*e)[len] == '=') | |
49 | { | |
50 | char ** sp = e; | |
51 | do *sp = sp[1]; while (*++sp); | |
52 | } | |
53 | ||
54 | return 0; | |
55 | } | |
56 | ||
57 | /* vi: aw ai sw=2 | |
58 | */ | |
59 | /* End of setenv.c */ |