=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/environ.c,v retrieving revision 1.9 retrieving revision 1.10 diff -c -r1.9 -r1.10 *** src/usr.bin/tmux/environ.c 2015/10/28 09:51:55 1.9 --- src/usr.bin/tmux/environ.c 2015/11/24 23:46:15 1.10 *************** *** 1,4 **** ! /* $OpenBSD: environ.c,v 1.9 2015/10/28 09:51:55 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: environ.c,v 1.10 2015/11/24 23:46:15 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott *************** *** 83,90 **** { struct environ_entry *envent; ! RB_FOREACH(envent, environ, srcenv) ! environ_set(dstenv, envent->name, envent->value); } /* Find an environment variable. */ --- 83,94 ---- { struct environ_entry *envent; ! RB_FOREACH(envent, environ, srcenv) { ! if (envent->value == NULL) ! environ_clear(dstenv, envent->name); ! else ! environ_set(dstenv, envent->name, "%s", envent->value); ! } } /* Find an environment variable. */ *************** *** 99,125 **** /* Set an environment variable. */ void ! environ_set(struct environ *env, const char *name, const char *value) { struct environ_entry *envent; if ((envent = environ_find(env, name)) != NULL) { free(envent->value); ! if (value != NULL) ! envent->value = xstrdup(value); ! else ! envent->value = NULL; } else { envent = xmalloc(sizeof *envent); envent->name = xstrdup(name); ! if (value != NULL) ! envent->value = xstrdup(value); ! else ! envent->value = NULL; RB_INSERT(environ, env, envent); } } /* Set an environment variable from a NAME=VALUE string. */ void environ_put(struct environ *env, const char *var) --- 103,143 ---- /* Set an environment variable. */ void ! environ_set(struct environ *env, const char *name, const char *fmt, ...) { struct environ_entry *envent; + va_list ap; + va_start(ap, fmt); if ((envent = environ_find(env, name)) != NULL) { free(envent->value); ! xvasprintf(&envent->value, fmt, ap); } else { envent = xmalloc(sizeof *envent); envent->name = xstrdup(name); ! xvasprintf(&envent->value, fmt, ap); 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. */ void environ_put(struct environ *env, const char *var) *************** *** 134,140 **** name = xstrdup(var); name[strcspn(name, "=")] = '\0'; ! environ_set(env, name, value); free(name); } --- 152,158 ---- name = xstrdup(var); name[strcspn(name, "=")] = '\0'; ! environ_set(env, name, "%s", value); free(name); } *************** *** 166,174 **** copyvars = next = xstrdup(vars); while ((var = strsep(&next, " ")) != NULL) { if ((envent = environ_find(srcenv, var)) == NULL) ! environ_set(dstenv, var, NULL); else ! environ_set(dstenv, envent->name, envent->value); } free(copyvars); } --- 184,192 ---- copyvars = next = xstrdup(vars); while ((var = strsep(&next, " ")) != NULL) { if ((envent = environ_find(srcenv, var)) == NULL) ! environ_clear(dstenv, var); else ! environ_set(dstenv, envent->name, "%s", envent->value); } free(copyvars); }