This source file includes following definitions.
- pmix_environ_merge
- pmix_setenv
- pmix_unsetenv
- pmix_tmp_directory
- pmix_home_directory
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #include <src/include/pmix_config.h>
25
26 #include <pmix_common.h>
27
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <string.h>
31
32 #include "src/util/printf.h"
33 #include "src/util/argv.h"
34 #include "src/util/pmix_environ.h"
35
36 #define PMIX_DEFAULT_TMPDIR "/tmp"
37
38
39
40
41
42 char **pmix_environ_merge(char **minor, char **major)
43 {
44 int i;
45 char **ret = NULL;
46 char *name, *value;
47
48
49
50 if (NULL == major) {
51 if (NULL == minor) {
52 return NULL;
53 } else {
54 return pmix_argv_copy(minor);
55 }
56 }
57
58
59
60 ret = pmix_argv_copy(major);
61
62
63
64 if (NULL == minor) {
65 return ret;
66 }
67
68
69
70
71 for (i = 0; NULL != minor[i]; ++i) {
72 value = strchr(minor[i], '=');
73 if (NULL == value) {
74 pmix_setenv(minor[i], NULL, false, &ret);
75 } else {
76
77
78
79 name = strdup(minor[i]);
80 value = name + (value - minor[i]);
81 *value = '\0';
82 pmix_setenv(name, value + 1, false, &ret);
83 free(name);
84 }
85 }
86
87
88
89 return ret;
90 }
91
92
93
94
95
96 pmix_status_t pmix_setenv(const char *name, const char *value, bool overwrite,
97 char ***env)
98 {
99 int i;
100 char *newvalue, *compare;
101 size_t len;
102
103
104
105 if (NULL == value) {
106 i = asprintf(&newvalue, "%s=", name);
107 } else {
108 i = asprintf(&newvalue, "%s=%s", name, value);
109 }
110 if (NULL == newvalue || 0 > i) {
111 return PMIX_ERR_OUT_OF_RESOURCE;
112 }
113
114
115
116 if( NULL == env ) {
117 return PMIX_ERR_BAD_PARAM;
118 } else if (NULL == *env) {
119 i = 0;
120 pmix_argv_append(&i, env, newvalue);
121 free(newvalue);
122 return PMIX_SUCCESS;
123 }
124
125
126 if( *env == environ ) {
127
128
129
130
131
132 putenv(newvalue);
133 return PMIX_SUCCESS;
134 }
135
136
137
138 i = asprintf(&compare, "%s=", name);
139 if (NULL == compare || 0 > i) {
140 free(newvalue);
141 return PMIX_ERR_OUT_OF_RESOURCE;
142 }
143 len = strlen(compare);
144
145
146
147 for (i = 0; (*env)[i] != NULL; ++i) {
148 if (0 == strncmp((*env)[i], compare, len)) {
149 if (overwrite) {
150 free((*env)[i]);
151 (*env)[i] = newvalue;
152 free(compare);
153 return PMIX_SUCCESS;
154 } else {
155 free(compare);
156 free(newvalue);
157 return PMIX_EXISTS;
158 }
159 }
160 }
161
162
163
164 i = pmix_argv_count(*env);
165 pmix_argv_append(&i, env, newvalue);
166
167
168
169 free(compare);
170 free(newvalue);
171 return PMIX_SUCCESS;
172 }
173
174
175
176
177
178
179 pmix_status_t pmix_unsetenv(const char *name, char ***env)
180 {
181 int i;
182 char *compare;
183 size_t len;
184 bool found;
185
186
187
188 if (NULL == *env) {
189 return PMIX_SUCCESS;
190 }
191
192
193
194 i = asprintf(&compare, "%s=", name);
195 if (NULL == compare || 0 > i) {
196 return PMIX_ERR_OUT_OF_RESOURCE;
197 }
198 len = strlen(compare);
199
200
201
202
203
204 found = false;
205 for (i = 0; (*env)[i] != NULL; ++i) {
206 if (0 != strncmp((*env)[i], compare, len))
207 continue;
208 if (environ != *env) {
209 free((*env)[i]);
210 }
211 for (; (*env)[i] != NULL; ++i)
212 (*env)[i] = (*env)[i + 1];
213 found = true;
214 break;
215 }
216 free(compare);
217
218
219
220 return (found) ? PMIX_SUCCESS : PMIX_ERR_NOT_FOUND;
221 }
222
223 const char* pmix_tmp_directory( void )
224 {
225 const char* str;
226
227 if( NULL == (str = getenv("TMPDIR")) )
228 if( NULL == (str = getenv("TEMP")) )
229 if( NULL == (str = getenv("TMP")) )
230 str = PMIX_DEFAULT_TMPDIR;
231 return str;
232 }
233
234 const char* pmix_home_directory( void )
235 {
236 char* home = getenv("HOME");
237
238 return home;
239 }