=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/environ.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- src/usr.bin/tmux/environ.c 2009/08/09 15:17:50 1.3 +++ src/usr.bin/tmux/environ.c 2010/04/04 19:02:09 1.4 @@ -1,4 +1,4 @@ -/* $OpenBSD: environ.c,v 1.3 2009/08/09 15:17:50 nicm Exp $ */ +/* $OpenBSD: environ.c,v 1.4 2010/04/04 19:02:09 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -35,12 +35,14 @@ return (strcmp(envent1->name, envent2->name)); } +/* Initialise the environment. */ void environ_init(struct environ *env) { RB_INIT(env); } +/* Free an environment. */ void environ_free(struct environ *env) { @@ -56,6 +58,7 @@ } } +/* Copy one environment into another. */ void environ_copy(struct environ *srcenv, struct environ *dstenv) { @@ -65,6 +68,7 @@ environ_set(dstenv, envent->name, envent->value); } +/* Find an environment variable. */ struct environ_entry * environ_find(struct environ *env, const char *name) { @@ -74,6 +78,7 @@ return (RB_FIND(environ, env, &envent)); } +/* Set an environment variable. */ void environ_set(struct environ *env, const char *name, const char *value) { @@ -97,10 +102,11 @@ } } +/* Set an environment variable from a NAME=VALUE string. */ void environ_put(struct environ *env, const char *var) { - char *name, *value; + char *name, *value; value = strchr(var, '='); if (value == NULL) @@ -114,6 +120,7 @@ xfree(name); } +/* Unset an environment variable. */ void environ_unset(struct environ *env, const char *name) { @@ -128,6 +135,10 @@ xfree(envent); } +/* + * Copy a space-separated list of variables from a destination into a source + * environment. + */ void environ_update(const char *vars, struct environ *srcenv, struct environ *dstenv) { @@ -142,4 +153,29 @@ environ_set(dstenv, envent->name, envent->value); } 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); + } }