version 1.9, 2015/10/28 09:51:55 |
version 1.10, 2015/11/24 23:46:15 |
|
|
{ |
{ |
struct environ_entry *envent; |
struct environ_entry *envent; |
|
|
RB_FOREACH(envent, environ, srcenv) |
RB_FOREACH(envent, environ, srcenv) { |
environ_set(dstenv, envent->name, envent->value); |
if (envent->value == NULL) |
|
environ_clear(dstenv, envent->name); |
|
else |
|
environ_set(dstenv, envent->name, "%s", envent->value); |
|
} |
} |
} |
|
|
/* Find an environment variable. */ |
/* Find an environment variable. */ |
|
|
|
|
/* Set an environment variable. */ |
/* Set an environment variable. */ |
void |
void |
environ_set(struct environ *env, const char *name, const char *value) |
environ_set(struct environ *env, const char *name, const char *fmt, ...) |
{ |
{ |
struct environ_entry *envent; |
struct environ_entry *envent; |
|
va_list ap; |
|
|
|
va_start(ap, fmt); |
if ((envent = environ_find(env, name)) != NULL) { |
if ((envent = environ_find(env, name)) != NULL) { |
free(envent->value); |
free(envent->value); |
if (value != NULL) |
xvasprintf(&envent->value, fmt, ap); |
envent->value = xstrdup(value); |
|
else |
|
envent->value = NULL; |
|
} else { |
} else { |
envent = xmalloc(sizeof *envent); |
envent = xmalloc(sizeof *envent); |
envent->name = xstrdup(name); |
envent->name = xstrdup(name); |
if (value != NULL) |
xvasprintf(&envent->value, fmt, ap); |
envent->value = xstrdup(value); |
|
else |
|
envent->value = NULL; |
|
RB_INSERT(environ, env, envent); |
RB_INSERT(environ, env, envent); |
} |
} |
|
va_end(ap); |
} |
} |
|
|
|
/* Clear an environment variable. */ |
|
void |
|
environ_clear(struct environ *env, const char *name) |
|
{ |
|
struct environ_entry *envent; |
|
|
|
if ((envent = environ_find(env, name)) != NULL) { |
|
free(envent->value); |
|
envent->value = NULL; |
|
} else { |
|
envent = xmalloc(sizeof *envent); |
|
envent->name = xstrdup(name); |
|
envent->value = NULL; |
|
RB_INSERT(environ, env, envent); |
|
} |
|
} |
|
|
/* Set an environment variable from a NAME=VALUE string. */ |
/* Set an environment variable from a NAME=VALUE string. */ |
void |
void |
environ_put(struct environ *env, const char *var) |
environ_put(struct environ *env, const char *var) |
|
|
name = xstrdup(var); |
name = xstrdup(var); |
name[strcspn(name, "=")] = '\0'; |
name[strcspn(name, "=")] = '\0'; |
|
|
environ_set(env, name, value); |
environ_set(env, name, "%s", value); |
free(name); |
free(name); |
} |
} |
|
|
|
|
copyvars = next = xstrdup(vars); |
copyvars = next = xstrdup(vars); |
while ((var = strsep(&next, " ")) != NULL) { |
while ((var = strsep(&next, " ")) != NULL) { |
if ((envent = environ_find(srcenv, var)) == NULL) |
if ((envent = environ_find(srcenv, var)) == NULL) |
environ_set(dstenv, var, NULL); |
environ_clear(dstenv, var); |
else |
else |
environ_set(dstenv, envent->name, envent->value); |
environ_set(dstenv, envent->name, "%s", envent->value); |
} |
} |
free(copyvars); |
free(copyvars); |
} |
} |