root/mpich2/trunk/src/pm/hydra/utils/env/env.c @ 4887

Revision 4887, 7.9 KB (checked in by balaji, 5 months ago)

Warning stomp.

Line 
1/* -*- Mode: C; c-basic-offset:4 ; -*- */
2/*
3 *  (C) 2008 by Argonne National Laboratory.
4 *      See COPYRIGHT in top-level directory.
5 */
6
7#include "hydra_utils.h"
8
9static HYD_Status env_to_str(HYD_Env_t * env, char **str)
10{
11    int i;
12    char *tmp[HYD_NUM_TMP_STRINGS];
13    HYD_Status status = HYD_SUCCESS;
14
15    HYDU_FUNC_ENTER();
16
17    i = 0;
18    tmp[i++] = HYDU_strdup("'");
19    tmp[i++] = HYDU_strdup(env->env_name);
20    tmp[i++] = HYDU_strdup("=");
21    tmp[i++] = env->env_value ? HYDU_strdup(env->env_value) : HYDU_strdup("");
22    tmp[i++] = HYDU_strdup("'");
23    tmp[i++] = NULL;
24
25    status = HYDU_str_alloc_and_join(tmp, str);
26    HYDU_ERR_POP(status, "unable to join strings\n");
27
28    for (i = 0; tmp[i]; i++)
29        HYDU_FREE(tmp[i]);
30
31  fn_exit:
32    HYDU_FUNC_EXIT();
33    return status;
34
35  fn_fail:
36    goto fn_exit;
37}
38
39
40static HYD_Env_t *env_dup(HYD_Env_t env)
41{
42    HYD_Env_t *tenv;
43    HYD_Status status = HYD_SUCCESS;
44
45    HYDU_FUNC_ENTER();
46
47    HYDU_MALLOC(tenv, HYD_Env_t *, sizeof(HYD_Env_t), status);
48    memcpy(tenv, &env, sizeof(HYD_Env_t));
49    tenv->next = NULL;
50    tenv->env_name = HYDU_strdup(env.env_name);
51    tenv->env_value = env.env_value ? HYDU_strdup(env.env_value) : NULL;
52
53  fn_exit:
54    HYDU_FUNC_EXIT();
55    return tenv;
56
57  fn_fail:
58    if (tenv)
59        HYDU_FREE(tenv);
60    tenv = NULL;
61    goto fn_exit;
62}
63
64
65HYD_Env_t *HYDU_str_to_env(char *str)
66{
67    HYD_Env_t *env;
68    char *env_name, *env_value;
69    HYD_Status status = HYD_SUCCESS;
70
71    HYDU_FUNC_ENTER();
72
73    HYDU_MALLOC(env, HYD_Env_t *, sizeof(HYD_Env_t), status);
74    env_name = strtok(str, "=");
75    env_value = strtok(NULL, "=");
76    env->env_name = HYDU_strdup(env_name);
77    env->env_value = env_value ? HYDU_strdup(env_value) : NULL;
78
79  fn_exit:
80    HYDU_FUNC_EXIT();
81    return env;
82
83  fn_fail:
84    if (env)
85        HYDU_FREE(env);
86    env = NULL;
87    goto fn_exit;
88}
89
90
91HYD_Status HYDU_list_append_env_to_str(HYD_Env_t * env_list, char **str_list)
92{
93    int i;
94    HYD_Env_t *env;
95    HYD_Status status = HYD_SUCCESS;
96
97    HYDU_FUNC_ENTER();
98
99    i = HYDU_strlist_lastidx(str_list);
100    env = env_list;
101    while (env) {
102        status = env_to_str(env, &str_list[i++]);
103        HYDU_ERR_POP(status, "HYDU_env_to_str returned error\n");
104        env = env->next;
105    }
106    str_list[i++] = NULL;
107
108  fn_exit:
109    HYDU_FUNC_EXIT();
110    return status;
111
112  fn_fail:
113    goto fn_exit;
114}
115
116
117HYD_Status HYDU_list_inherited_env(HYD_Env_t ** env_list)
118{
119    HYD_Env_t *env;
120    char *env_str;
121    int i;
122    HYD_Status status = HYD_SUCCESS;
123
124    HYDU_FUNC_ENTER();
125
126    *env_list = NULL;
127    i = 0;
128    while (environ[i]) {
129        env_str = HYDU_strdup(environ[i]);
130
131        env = HYDU_str_to_env(env_str);
132
133        status = HYDU_append_env_to_list(*env, env_list);
134        HYDU_ERR_POP(status, "unable to add env to list\n");
135
136        HYDU_env_free(env);
137        HYDU_FREE(env_str);
138
139        i++;
140    }
141
142  fn_exit:
143    HYDU_FUNC_EXIT();
144    return status;
145
146  fn_fail:
147    goto fn_exit;
148}
149
150
151HYD_Env_t *HYDU_env_list_dup(HYD_Env_t * env)
152{
153    HYD_Env_t *tenv, *run;
154    HYD_Status status = HYD_SUCCESS;
155
156    HYDU_FUNC_ENTER();
157
158    run = env;
159    tenv = NULL;
160    while (run) {
161        status = HYDU_append_env_to_list(*run, &tenv);
162        HYDU_ERR_POP(status, "unable to add env to list\n");
163        run = run->next;
164    }
165
166  fn_exit:
167    HYDU_FUNC_EXIT();
168    return tenv;
169
170  fn_fail:
171    tenv = NULL;
172    goto fn_exit;
173}
174
175
176HYD_Status HYDU_env_create(HYD_Env_t ** env, const char *env_name, char *env_value)
177{
178    HYD_Status status = HYD_SUCCESS;
179
180    HYDU_FUNC_ENTER();
181
182    HYDU_MALLOC(*env, HYD_Env_t *, sizeof(HYD_Env_t), status);
183    (*env)->env_name = HYDU_strdup(env_name);
184    (*env)->env_value = env_value ? HYDU_strdup(env_value) : NULL;
185    (*env)->next = NULL;
186
187  fn_exit:
188    HYDU_FUNC_EXIT();
189    return status;
190
191  fn_fail:
192    goto fn_exit;
193}
194
195
196HYD_Status HYDU_env_free(HYD_Env_t * env)
197{
198    HYD_Status status = HYD_SUCCESS;
199
200    HYDU_FUNC_ENTER();
201
202    if (env->env_name)
203        HYDU_FREE(env->env_name);
204    if (env->env_value)
205        HYDU_FREE(env->env_value);
206    HYDU_FREE(env);
207
208    HYDU_FUNC_EXIT();
209    return status;
210}
211
212
213HYD_Status HYDU_env_free_list(HYD_Env_t * env)
214{
215    HYD_Env_t *run, *tmp;
216    HYD_Status status = HYD_SUCCESS;
217
218    HYDU_FUNC_ENTER();
219
220    run = env;
221    while (run) {
222        tmp = run->next;
223        HYDU_env_free(run);
224        run = tmp;
225    }
226
227    HYDU_FUNC_EXIT();
228    return status;
229}
230
231
232HYD_Env_t *HYDU_env_lookup(HYD_Env_t env, HYD_Env_t * env_list)
233{
234    HYD_Env_t *run;
235
236    HYDU_FUNC_ENTER();
237
238    run = env_list;
239    while (run->next) {
240        if (!strcmp(run->env_name, env.env_name))
241            goto fn_exit;
242        run = run->next;
243    }
244    run = NULL;
245
246  fn_exit:
247    HYDU_FUNC_EXIT();
248    return run;
249}
250
251
252HYD_Status HYDU_append_env_to_list(HYD_Env_t env, HYD_Env_t ** env_list)
253{
254    HYD_Env_t *run, *tenv;
255    HYD_Status status = HYD_SUCCESS;
256
257    HYDU_FUNC_ENTER();
258
259    tenv = env_dup(env);
260    if (tenv == NULL)
261        HYDU_ERR_SETANDJUMP(status, HYD_INTERNAL_ERROR, "unable to dup env\n");
262
263    tenv->next = NULL;
264
265    /* Add the structure to the end of the list */
266    if (*env_list == NULL) {
267        *env_list = tenv;
268    }
269    else {
270        run = *env_list;
271
272        while (1) {
273            if (!strcmp(run->env_name, env.env_name)) {
274                /* If we found an entry for this environment variable, just update it */
275                if (run->env_value != NULL && tenv->env_value != NULL) {
276                    HYDU_FREE(run->env_value);
277                    run->env_value = HYDU_strdup(tenv->env_value);
278                }
279                else if (run->env_value != NULL) {
280                    HYDU_FREE(run->env_value);
281                    run->env_value = NULL;
282                }
283                else if (env.env_value != NULL) {
284                    run->env_value = HYDU_strdup(tenv->env_value);
285                }
286
287                HYDU_FREE(tenv->env_name);
288                if (tenv->env_value)
289                    HYDU_FREE(tenv->env_value);
290                HYDU_FREE(tenv);
291
292                break;
293            }
294            else if (run->next == NULL) {
295                run->next = tenv;
296                break;
297            }
298            run = run->next;
299        }
300    }
301
302  fn_exit:
303    HYDU_FUNC_EXIT();
304    return status;
305
306  fn_fail:
307    goto fn_exit;
308}
309
310
311HYD_Status HYDU_putenv(HYD_Env_t * env, HYD_Env_overwrite_t overwrite)
312{
313    char *tmp[HYD_NUM_TMP_STRINGS], *str;
314    int i;
315    HYD_Status status = HYD_SUCCESS;
316
317    HYDU_FUNC_ENTER();
318
319    /* If the overwrite flag is false, just exit */
320    if (getenv(env->env_name) && (overwrite == HYD_ENV_OVERWRITE_FALSE))
321        goto fn_exit;
322
323    i = 0;
324    tmp[i++] = HYDU_strdup(env->env_name);
325    tmp[i++] = HYDU_strdup("=");
326    tmp[i++] = env->env_value ? HYDU_strdup(env->env_value) : HYDU_strdup("");
327    tmp[i++] = NULL;
328    status = HYDU_str_alloc_and_join(tmp, &str);
329    HYDU_ERR_POP(status, "unable to join strings\n");
330
331    putenv(str);
332
333    for (i = 0; tmp[i]; i++)
334        HYDU_FREE(tmp[i]);
335
336  fn_exit:
337    HYDU_FUNC_EXIT();
338    return status;
339
340  fn_fail:
341    goto fn_exit;
342}
343
344
345HYD_Status HYDU_putenv_list(HYD_Env_t * env_list, HYD_Env_overwrite_t overwrite)
346{
347    HYD_Env_t *env;
348    HYD_Status status = HYD_SUCCESS;
349
350    HYDU_FUNC_ENTER();
351
352    for (env = env_list; env; env = env->next) {
353        status = HYDU_putenv(env, overwrite);
354        HYDU_ERR_POP(status, "putenv failed\n");
355    }
356
357  fn_exit:
358    HYDU_FUNC_EXIT();
359    return status;
360
361  fn_fail:
362    goto fn_exit;
363}
364
365
366HYD_Status HYDU_comma_list_to_env_list(char *str, HYD_Env_t ** env_list)
367{
368    char *env_name;
369    HYD_Env_t *env;
370    HYD_Status status = HYD_SUCCESS;
371
372    HYDU_FUNC_ENTER();
373
374    env_name = strtok(str, ",");
375    do {
376        status = HYDU_env_create(&env, env_name, NULL);
377        HYDU_ERR_POP(status, "unable to create env struct\n");
378
379        status = HYDU_append_env_to_list(*env, env_list);
380        HYDU_ERR_POP(status, "unable to add env to list\n");
381    } while ((env_name = strtok(NULL, ",")));
382
383  fn_exit:
384    HYDU_FUNC_EXIT();
385    return status;
386
387  fn_fail:
388    goto fn_exit;
389}
Note: See TracBrowser for help on using the browser.