version 1.3, 2009/08/09 15:17:50 |
version 1.4, 2010/04/04 19:02:09 |
|
|
return (strcmp(envent1->name, envent2->name)); |
return (strcmp(envent1->name, envent2->name)); |
} |
} |
|
|
|
/* Initialise the environment. */ |
void |
void |
environ_init(struct environ *env) |
environ_init(struct environ *env) |
{ |
{ |
RB_INIT(env); |
RB_INIT(env); |
} |
} |
|
|
|
/* Free an environment. */ |
void |
void |
environ_free(struct environ *env) |
environ_free(struct environ *env) |
{ |
{ |
|
|
} |
} |
} |
} |
|
|
|
/* Copy one environment into another. */ |
void |
void |
environ_copy(struct environ *srcenv, struct environ *dstenv) |
environ_copy(struct environ *srcenv, struct environ *dstenv) |
{ |
{ |
|
|
environ_set(dstenv, envent->name, envent->value); |
environ_set(dstenv, envent->name, envent->value); |
} |
} |
|
|
|
/* Find an environment variable. */ |
struct environ_entry * |
struct environ_entry * |
environ_find(struct environ *env, const char *name) |
environ_find(struct environ *env, const char *name) |
{ |
{ |
|
|
return (RB_FIND(environ, env, &envent)); |
return (RB_FIND(environ, env, &envent)); |
} |
} |
|
|
|
/* 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 *value) |
{ |
{ |
|
|
} |
} |
} |
} |
|
|
|
/* 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) |
{ |
{ |
char *name, *value; |
char *name, *value; |
|
|
value = strchr(var, '='); |
value = strchr(var, '='); |
if (value == NULL) |
if (value == NULL) |
|
|
xfree(name); |
xfree(name); |
} |
} |
|
|
|
/* Unset an environment variable. */ |
void |
void |
environ_unset(struct environ *env, const char *name) |
environ_unset(struct environ *env, const char *name) |
{ |
{ |
|
|
xfree(envent); |
xfree(envent); |
} |
} |
|
|
|
/* |
|
* Copy a space-separated list of variables from a destination into a source |
|
* environment. |
|
*/ |
void |
void |
environ_update(const char *vars, struct environ *srcenv, struct environ *dstenv) |
environ_update(const char *vars, struct environ *srcenv, struct environ *dstenv) |
{ |
{ |
|
|
environ_set(dstenv, envent->name, envent->value); |
environ_set(dstenv, envent->name, envent->value); |
} |
} |
xfree(copyvars); |
xfree(copyvars); |
|
} |
|
|
|
/* Push environment into the real environment - use after fork(). */ |
|
void |
|
environ_push(struct environ *env) |
|
{ |
|
ARRAY_DECL(, char *) varlist; |
|
struct environ_entry *envent; |
|
char **varp, *var; |
|
u_int i; |
|
|
|
ARRAY_INIT(&varlist); |
|
for (varp = environ; *varp != NULL; varp++) { |
|
var = xstrdup(*varp); |
|
var[strcspn(var, "=")] = '\0'; |
|
ARRAY_ADD(&varlist, var); |
|
} |
|
for (i = 0; i < ARRAY_LENGTH(&varlist); i++) |
|
unsetenv(ARRAY_ITEM(&varlist, i)); |
|
ARRAY_FREE(&varlist); |
|
|
|
RB_FOREACH(envent, environ, env) { |
|
if (envent->value != NULL) |
|
setenv(envent->name, envent->value, 1); |
|
} |
} |
} |