=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/doas/env.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- src/usr.bin/doas/env.c 2016/06/16 17:40:30 1.1 +++ src/usr.bin/doas/env.c 2016/06/19 19:29:43 1.2 @@ -1,4 +1,4 @@ -/* $OpenBSD: env.c,v 1.1 2016/06/16 17:40:30 tedu Exp $ */ +/* $OpenBSD: env.c,v 1.2 2016/06/19 19:29:43 martijn Exp $ */ /* * Copyright (c) 2016 Ted Unangst * @@ -16,6 +16,7 @@ */ #include +#include #include #include @@ -26,13 +27,28 @@ #include "doas.h" +struct envnode { + RB_ENTRY(envnode) node; + const char *key; + const char *value; +}; + +struct env { + RB_HEAD(envtree, envnode) root; + u_int count; +}; + int envcmp(struct envnode *a, struct envnode *b) { return strcmp(a->key, b->key); } -RB_GENERATE(envtree, envnode, node, envcmp) +RB_GENERATE_STATIC(envtree, envnode, node, envcmp) +struct env *createenv(char **); +struct env *filterenv(struct env *, struct rule *); +char **flattenenv(struct env *); + struct env * createenv(char **envp) { @@ -150,4 +166,15 @@ copyenv(orig, copy, safeset); return copy; +} + +char ** +prepenv(struct rule *rule) +{ + extern char **environ; + struct env *env; + + env = createenv(environ); + env = filterenv(env, rule); + return flattenenv(env); }