* $Id$
*/
+#include <assert.h>
#include <ctype.h>
#include <stdarg.h>
#include <stdio.h>
static int envvar_match(unsigned flags, const char *en,
const char *const *patv,
+ const char *const *defaults,
const char **ev)
{
const char *const *patp;
const char *q, *pat;
int acceptp;
+ int rc;
+ if (!patv) { patv= defaults; defaults= 0; }
for (patp= patv; (pat= *patp); patp++) {
q= en;
acceptp= 1;
if (*pat == '!' && (flags & FILTF_WILDCARD)) { acceptp= 0; pat++; }
+ else if (*pat == '?') {
+ if (strcmp(pat + 1, "DEFAULTS") == 0) {
+ assert(defaults);
+ rc= envvar_match(flags, en, defaults, 0, ev);
+ if (rc) return rc;
+ } else
+ error("unknown pattern directive");
+ continue;
+ }
for (;;) {
if (!*pat) {
void filter_environment(unsigned flags, const char *prefix_in,
const char *const *patv,
+ const char *const *defaults,
void (*foundone)(const char *fulln,
const char *en, const char *ev,
void *p),
D( if (debugmode) printf(";; doesn't match prefix\n"); )
continue;
}
- if (envvar_match(flags, en + pn, patv, &ev) > 0) {
+ if (envvar_match(flags, en + pn, patv, defaults, &ev) > 0) {
n= strcspn(en, "=");
if (n >= sizeof(enbuf))
error("environment variable name too long");