mirror of
https://github.com/tmate-io/tmate.git
synced 2025-08-16 16:41:35 +02:00
Make environ_set va_args and use it to tidy up some calls. Also add a
missing word in manpage (from jmc).
This commit is contained in:
46
environ.c
46
environ.c
@ -83,8 +83,12 @@ environ_copy(struct environ *srcenv, struct environ *dstenv)
|
||||
{
|
||||
struct environ_entry *envent;
|
||||
|
||||
RB_FOREACH(envent, environ, srcenv)
|
||||
environ_set(dstenv, envent->name, envent->value);
|
||||
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,23 +103,37 @@ environ_find(struct environ *env, const char *name)
|
||||
|
||||
/* Set an environment variable. */
|
||||
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;
|
||||
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);
|
||||
if (value != NULL)
|
||||
envent->value = xstrdup(value);
|
||||
else
|
||||
envent->value = NULL;
|
||||
envent->value = NULL;
|
||||
} else {
|
||||
envent = xmalloc(sizeof *envent);
|
||||
envent->name = xstrdup(name);
|
||||
if (value != NULL)
|
||||
envent->value = xstrdup(value);
|
||||
else
|
||||
envent->value = NULL;
|
||||
envent->value = NULL;
|
||||
RB_INSERT(environ, env, envent);
|
||||
}
|
||||
}
|
||||
@ -134,7 +152,7 @@ environ_put(struct environ *env, const char *var)
|
||||
name = xstrdup(var);
|
||||
name[strcspn(name, "=")] = '\0';
|
||||
|
||||
environ_set(env, name, value);
|
||||
environ_set(env, name, "%s", value);
|
||||
free(name);
|
||||
}
|
||||
|
||||
@ -166,9 +184,9 @@ environ_update(const char *vars, struct environ *srcenv,
|
||||
copyvars = next = xstrdup(vars);
|
||||
while ((var = strsep(&next, " ")) != NULL) {
|
||||
if ((envent = environ_find(srcenv, var)) == NULL)
|
||||
environ_set(dstenv, var, NULL);
|
||||
environ_clear(dstenv, var);
|
||||
else
|
||||
environ_set(dstenv, envent->name, envent->value);
|
||||
environ_set(dstenv, envent->name, "%s", envent->value);
|
||||
}
|
||||
free(copyvars);
|
||||
}
|
||||
|
Reference in New Issue
Block a user