diff options
Diffstat (limited to 'lib/hashtable.c')
| -rw-r--r-- | lib/hashtable.c | 20 | 
1 files changed, 19 insertions, 1 deletions
| diff --git a/lib/hashtable.c b/lib/hashtable.c index 0610e867d..6cfba5668 100644 --- a/lib/hashtable.c +++ b/lib/hashtable.c @@ -658,7 +658,7 @@ static int is_var_in_set(const char *name, int nvars, char * const vars[])  int himport_r(struct hsearch_data *htab,  		const char *env, size_t size, const char sep, int flag, -		int nvars, char * const vars[]) +		int nvars, char * const vars[], int do_apply)  {  	char *data, *sp, *dp, *name, *value; @@ -772,6 +772,24 @@ int himport_r(struct hsearch_data *htab,  		e.key = name;  		e.data = value; +		/* if there is an apply function, check what it has to say */ +		if (do_apply && htab->apply != NULL) { +			debug("searching before calling cb function" +				" for  %s\n", name); +			/* +			 * Search for variable in existing env, so to pass +			 * its previous value to the apply callback +			 */ +			hsearch_r(e, FIND, &rv, htab); +			debug("previous value was %s\n", rv ? rv->data : ""); +			if (htab->apply(name, rv ? rv->data : NULL, +				value, flag)) { +				debug("callback function refused to set" +					" variable %s, skipping it!\n", name); +				continue; +			} +		} +  		hsearch_r(e, ENTER, &rv, htab);  		if (rv == NULL) {  			printf("himport_r: can't insert \"%s=%s\" into hash table\n", |