Mercurial > dovecot > core-2.2
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 |
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 | 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 | 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 | 20 if (env_pool == NULL) { |
21 env_pool = pool_alloconly_create(MEMPOOL_GROWING"Environment", | |
22 2048); | |
7485 | 23 } |
9318 | 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 | 28 void env_remove(const char *name) |
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 | 53 } |
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 | 57 #ifdef HAVE_CLEARENV |
58 if (clearenv() < 0) | |
59 i_fatal("clearenv() failed"); | |
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 | 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 | 76 static void env_clean_except_real(const char *const preserve_envs[]) |
77 { | |
78 ARRAY_TYPE(const_string) copy; | |
79 const char *value, *const *envp; | |
80 unsigned int i; | |
81 | |
82 t_array_init(©, 16); | |
83 for (i = 0; preserve_envs[i] != NULL; i++) { | |
84 const char *key = preserve_envs[i]; | |
85 | |
86 value = getenv(key); | |
87 if (value != NULL) { | |
88 value = t_strconcat(key, "=", value, NULL); | |
89 array_append(©, &value, 1); | |
90 } | |
91 } | |
92 | |
93 /* Note that if the original environment was set with env_put(), the | |
94 environment strings will be invalid after env_clean(). That's why | |
95 we t_strconcat() them above. */ | |
96 env_clean(); | |
97 | |
98 array_foreach(©, envp) | |
99 env_put(*envp); | |
100 } | |
101 | |
102 void env_clean_except(const char *const preserve_envs[]) | |
103 { | |
104 T_BEGIN { | |
105 env_clean_except_real(preserve_envs); | |
106 } T_END; | |
107 } | |
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 } |