annotate src/lib/env-util.c @ 22664:fea53c2725c0

director: Fix director_max_parallel_moves/kicks type Should be uint, not time.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 09 Nov 2017 12:24:16 +0200
parents 2e2563132d5f
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21322
diff changeset
1 /* Copyright (c) 2002-2017 Dovecot authors, see the included COPYING file */
697
7814b29d0862 Created env_put() and env_clean() for a bit easier handling of environment
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
7814b29d0862 Created env_put() and env_clean() for a bit easier handling of environment
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
12347
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
4 #include "array.h"
697
7814b29d0862 Created env_put() and env_clean() for a bit easier handling of environment
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "env-util.h"
7814b29d0862 Created env_put() and env_clean() for a bit easier handling of environment
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6
12412
e60061623012 Added env_get_environ_p() as more portable way of accessing environ variable.
Timo Sirainen <tss@iki.fi>
parents: 12347
diff changeset
7 #ifdef __APPLE__
e60061623012 Added env_get_environ_p() as more portable way of accessing environ variable.
Timo Sirainen <tss@iki.fi>
parents: 12347
diff changeset
8 # include <crt_externs.h>
e60061623012 Added env_get_environ_p() as more portable way of accessing environ variable.
Timo Sirainen <tss@iki.fi>
parents: 12347
diff changeset
9 #endif
697
7814b29d0862 Created env_put() and env_clean() for a bit easier handling of environment
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10
9320
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
11 struct env_backup {
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
12 pool_t pool;
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
13 const char **strings;
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
14 };
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
15
9318
92be0f90a9df env-util: Minor code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 8600
diff changeset
16 static pool_t env_pool = NULL;
697
7814b29d0862 Created env_put() and env_clean() for a bit easier handling of environment
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
7814b29d0862 Created env_put() and env_clean() for a bit easier handling of environment
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 void env_put(const char *env)
7814b29d0862 Created env_put() and env_clean() for a bit easier handling of environment
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 {
9318
92be0f90a9df env-util: Minor code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 8600
diff changeset
20 if (env_pool == NULL) {
92be0f90a9df env-util: Minor code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 8600
diff changeset
21 env_pool = pool_alloconly_create(MEMPOOL_GROWING"Environment",
92be0f90a9df env-util: Minor code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 8600
diff changeset
22 2048);
7485
8bed019c834d Memory pool allocation tweaks.
Timo Sirainen <tss@iki.fi>
parents: 7109
diff changeset
23 }
9318
92be0f90a9df env-util: Minor code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 8600
diff changeset
24 if (putenv(p_strdup(env_pool, env)) != 0)
4016
0d3dd32999a0 Out of memory may not be the only reason putenv() fails. In OSX it seems to
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
25 i_fatal("putenv(%s) failed: %m", env);
697
7814b29d0862 Created env_put() and env_clean() for a bit easier handling of environment
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 }
7814b29d0862 Created env_put() and env_clean() for a bit easier handling of environment
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27
8536
b1a7df02ba38 Added env_remove().
Timo Sirainen <tss@iki.fi>
parents: 7807
diff changeset
28 void env_remove(const char *name)
b1a7df02ba38 Added env_remove().
Timo Sirainen <tss@iki.fi>
parents: 7807
diff changeset
29 {
8600
7c12e20f1eee env_remove(): Implement a fallback method if unsetenv() doesn't exist.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
30 #ifdef HAVE_UNSETENV
10491
617fa0739538 Compile fix for systems where unsetenv() returns void.
Timo Sirainen <tss@iki.fi>
parents: 10413
diff changeset
31 #ifdef UNSETENV_RET_INT
10413
927cc04cd5e8 Check return value if unsetenv().
Timo Sirainen <tss@iki.fi>
parents: 9712
diff changeset
32 if (unsetenv(name) < 0)
927cc04cd5e8 Check return value if unsetenv().
Timo Sirainen <tss@iki.fi>
parents: 9712
diff changeset
33 i_fatal("unsetenv(%s) failed: %m", name);
8600
7c12e20f1eee env_remove(): Implement a fallback method if unsetenv() doesn't exist.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
34 #else
10491
617fa0739538 Compile fix for systems where unsetenv() returns void.
Timo Sirainen <tss@iki.fi>
parents: 10413
diff changeset
35 unsetenv(name);
617fa0739538 Compile fix for systems where unsetenv() returns void.
Timo Sirainen <tss@iki.fi>
parents: 10413
diff changeset
36 #endif
617fa0739538 Compile fix for systems where unsetenv() returns void.
Timo Sirainen <tss@iki.fi>
parents: 10413
diff changeset
37 #else
8600
7c12e20f1eee env_remove(): Implement a fallback method if unsetenv() doesn't exist.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
38 extern char **environ;
21322
5ab8dc1a4a6f global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
39 size_t len;
8600
7c12e20f1eee env_remove(): Implement a fallback method if unsetenv() doesn't exist.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
40 char **envp;
7c12e20f1eee env_remove(): Implement a fallback method if unsetenv() doesn't exist.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
41
7c12e20f1eee env_remove(): Implement a fallback method if unsetenv() doesn't exist.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
42 len = strlen(name);
7c12e20f1eee env_remove(): Implement a fallback method if unsetenv() doesn't exist.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
43 for (envp = environ; *envp != NULL; envp++) {
7c12e20f1eee env_remove(): Implement a fallback method if unsetenv() doesn't exist.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
44 if (strncmp(name, *envp, len) == 0 &&
7c12e20f1eee env_remove(): Implement a fallback method if unsetenv() doesn't exist.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
45 (*envp)[len] == '=') {
7c12e20f1eee env_remove(): Implement a fallback method if unsetenv() doesn't exist.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
46 do {
7c12e20f1eee env_remove(): Implement a fallback method if unsetenv() doesn't exist.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
47 envp[0] = envp[1];
7c12e20f1eee env_remove(): Implement a fallback method if unsetenv() doesn't exist.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
48 } while (*++envp != NULL);
7c12e20f1eee env_remove(): Implement a fallback method if unsetenv() doesn't exist.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
49 break;
7c12e20f1eee env_remove(): Implement a fallback method if unsetenv() doesn't exist.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
50 }
7c12e20f1eee env_remove(): Implement a fallback method if unsetenv() doesn't exist.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
51 }
7c12e20f1eee env_remove(): Implement a fallback method if unsetenv() doesn't exist.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
52 #endif
8536
b1a7df02ba38 Added env_remove().
Timo Sirainen <tss@iki.fi>
parents: 7807
diff changeset
53 }
b1a7df02ba38 Added env_remove().
Timo Sirainen <tss@iki.fi>
parents: 7807
diff changeset
54
697
7814b29d0862 Created env_put() and env_clean() for a bit easier handling of environment
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 void env_clean(void)
7814b29d0862 Created env_put() and env_clean() for a bit easier handling of environment
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 {
7804
27b97457d274 Use clearenv() if available.
Timo Sirainen <tss@iki.fi>
parents: 7803
diff changeset
57 #ifdef HAVE_CLEARENV
27b97457d274 Use clearenv() if available.
Timo Sirainen <tss@iki.fi>
parents: 7803
diff changeset
58 if (clearenv() < 0)
27b97457d274 Use clearenv() if available.
Timo Sirainen <tss@iki.fi>
parents: 7803
diff changeset
59 i_fatal("clearenv() failed");
27b97457d274 Use clearenv() if available.
Timo Sirainen <tss@iki.fi>
parents: 7803
diff changeset
60 #else
13732
9d022d3fba42 env_clean(): Previous OSX compile fix broke the function completely.
Timo Sirainen <tss@iki.fi>
parents: 13731
diff changeset
61 char ***environ_p = env_get_environ_p();
697
7814b29d0862 Created env_put() and env_clean() for a bit easier handling of environment
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62
7806
5ae1c7c4edcf env_clean(): Try yet another way that appears to work better.
Timo Sirainen <tss@iki.fi>
parents: 7804
diff changeset
63 /* Try to clear the environment.
697
7814b29d0862 Created env_put() and env_clean() for a bit easier handling of environment
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64
7806
5ae1c7c4edcf env_clean(): Try yet another way that appears to work better.
Timo Sirainen <tss@iki.fi>
parents: 7804
diff changeset
65 a) environ = NULL crashes on OS X.
5ae1c7c4edcf env_clean(): Try yet another way that appears to work better.
Timo Sirainen <tss@iki.fi>
parents: 7804
diff changeset
66 b) *environ = NULL doesn't work on FreeBSD 7.0.
7807
8704bd29617b env_clean(): calloc() is probably the safest way to do it.
Timo Sirainen <tss@iki.fi>
parents: 7806
diff changeset
67 c) environ = emptyenv doesn't work on Haiku OS
8704bd29617b env_clean(): calloc() is probably the safest way to do it.
Timo Sirainen <tss@iki.fi>
parents: 7806
diff changeset
68 d) environ = calloc() should work everywhere
7806
5ae1c7c4edcf env_clean(): Try yet another way that appears to work better.
Timo Sirainen <tss@iki.fi>
parents: 7804
diff changeset
69 */
13732
9d022d3fba42 env_clean(): Previous OSX compile fix broke the function completely.
Timo Sirainen <tss@iki.fi>
parents: 13731
diff changeset
70 *environ_p = calloc(1, sizeof(**environ_p));
7804
27b97457d274 Use clearenv() if available.
Timo Sirainen <tss@iki.fi>
parents: 7803
diff changeset
71 #endif
9319
6e80c8fb225e env_clean(): Clear the environment memory pool also.
Timo Sirainen <tss@iki.fi>
parents: 9318
diff changeset
72 if (env_pool != NULL)
6e80c8fb225e env_clean(): Clear the environment memory pool also.
Timo Sirainen <tss@iki.fi>
parents: 9318
diff changeset
73 p_clear(env_pool);
697
7814b29d0862 Created env_put() and env_clean() for a bit easier handling of environment
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 }
9320
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
75
12347
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
76 static void env_clean_except_real(const char *const preserve_envs[])
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
77 {
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
78 ARRAY_TYPE(const_string) copy;
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
79 const char *value, *const *envp;
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
80 unsigned int i;
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
81
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
82 t_array_init(&copy, 16);
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
83 for (i = 0; preserve_envs[i] != NULL; i++) {
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
84 const char *key = preserve_envs[i];
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
85
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
86 value = getenv(key);
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
87 if (value != NULL) {
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
88 value = t_strconcat(key, "=", value, NULL);
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
89 array_append(&copy, &value, 1);
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
90 }
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
91 }
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
92
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
93 /* Note that if the original environment was set with env_put(), the
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
94 environment strings will be invalid after env_clean(). That's why
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
95 we t_strconcat() them above. */
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
96 env_clean();
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
97
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
98 array_foreach(&copy, envp)
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
99 env_put(*envp);
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
100 }
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
101
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
102 void env_clean_except(const char *const preserve_envs[])
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
103 {
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
104 T_BEGIN {
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
105 env_clean_except_real(preserve_envs);
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
106 } T_END;
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
107 }
fe72469ccdf5 Added env_clean_except()
Timo Sirainen <tss@iki.fi>
parents: 11074
diff changeset
108
9320
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
109 struct env_backup *env_backup_save(void)
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
110 {
12412
e60061623012 Added env_get_environ_p() as more portable way of accessing environ variable.
Timo Sirainen <tss@iki.fi>
parents: 12347
diff changeset
111 char **environ = *env_get_environ_p();
9320
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
112 struct env_backup *env;
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
113 unsigned int i, count;
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
114 pool_t pool;
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
115
11074
c32f55615055 Small code changes to make static analyzer happier.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
116 i_assert(environ != NULL);
c32f55615055 Small code changes to make static analyzer happier.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
117
9320
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
118 for (count = 0; environ[count] != NULL; count++) ;
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
119
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
120 pool = pool_alloconly_create("saved environment", 4096);
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
121 env = p_new(pool, struct env_backup, 1);
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
122 env->pool = pool;
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
123 env->strings = p_new(pool, const char *, count + 1);
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
124 for (i = 0; i < count; i++)
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
125 env->strings[i] = p_strdup(pool, environ[i]);
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
126 return env;
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
127 }
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
128
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
129 void env_backup_restore(struct env_backup *env)
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
130 {
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
131 unsigned int i;
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
132
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
133 env_clean();
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
134 for (i = 0; env->strings[i] != NULL; i++)
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
135 env_put(env->strings[i]);
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
136 }
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
137
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
138 void env_backup_free(struct env_backup **_env)
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
139 {
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
140 struct env_backup *env = *_env;
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
141
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
142 *_env = NULL;
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
143 pool_unref(&env->pool);
9bdd43acd083 Added env_backup_*() for saving/restoring environment.
Timo Sirainen <tss@iki.fi>
parents: 9319
diff changeset
144 }
9712
d48c8c0c1d29 lib_deinit() now frees memory used by env_put().
Timo Sirainen <tss@iki.fi>
parents: 9320
diff changeset
145
12412
e60061623012 Added env_get_environ_p() as more portable way of accessing environ variable.
Timo Sirainen <tss@iki.fi>
parents: 12347
diff changeset
146 char ***env_get_environ_p(void)
e60061623012 Added env_get_environ_p() as more portable way of accessing environ variable.
Timo Sirainen <tss@iki.fi>
parents: 12347
diff changeset
147 {
e60061623012 Added env_get_environ_p() as more portable way of accessing environ variable.
Timo Sirainen <tss@iki.fi>
parents: 12347
diff changeset
148 #ifdef __APPLE__
e60061623012 Added env_get_environ_p() as more portable way of accessing environ variable.
Timo Sirainen <tss@iki.fi>
parents: 12347
diff changeset
149 return _NSGetEnviron();
e60061623012 Added env_get_environ_p() as more portable way of accessing environ variable.
Timo Sirainen <tss@iki.fi>
parents: 12347
diff changeset
150 #else
e60061623012 Added env_get_environ_p() as more portable way of accessing environ variable.
Timo Sirainen <tss@iki.fi>
parents: 12347
diff changeset
151 extern char **environ;
e60061623012 Added env_get_environ_p() as more portable way of accessing environ variable.
Timo Sirainen <tss@iki.fi>
parents: 12347
diff changeset
152
e60061623012 Added env_get_environ_p() as more portable way of accessing environ variable.
Timo Sirainen <tss@iki.fi>
parents: 12347
diff changeset
153 return &environ;
e60061623012 Added env_get_environ_p() as more portable way of accessing environ variable.
Timo Sirainen <tss@iki.fi>
parents: 12347
diff changeset
154 #endif
e60061623012 Added env_get_environ_p() as more portable way of accessing environ variable.
Timo Sirainen <tss@iki.fi>
parents: 12347
diff changeset
155 }
e60061623012 Added env_get_environ_p() as more portable way of accessing environ variable.
Timo Sirainen <tss@iki.fi>
parents: 12347
diff changeset
156
9712
d48c8c0c1d29 lib_deinit() now frees memory used by env_put().
Timo Sirainen <tss@iki.fi>
parents: 9320
diff changeset
157 void env_deinit(void)
d48c8c0c1d29 lib_deinit() now frees memory used by env_put().
Timo Sirainen <tss@iki.fi>
parents: 9320
diff changeset
158 {
d48c8c0c1d29 lib_deinit() now frees memory used by env_put().
Timo Sirainen <tss@iki.fi>
parents: 9320
diff changeset
159 if (env_pool != NULL)
d48c8c0c1d29 lib_deinit() now frees memory used by env_put().
Timo Sirainen <tss@iki.fi>
parents: 9320
diff changeset
160 pool_unref(&env_pool);
d48c8c0c1d29 lib_deinit() now frees memory used by env_put().
Timo Sirainen <tss@iki.fi>
parents: 9320
diff changeset
161 }