@ -607,22 +607,32 @@ ssize_t hexport_r(struct hsearch_data *htab, const char sep,
* himport ( )
*/
/* Check whether variable name is amongst vars[] */
static int is_var_in_set ( const char * name , int nvars , char * const vars [ ] )
/*
* Check whether variable ' name ' is amongst vars [ ] ,
* and remove all instances by setting the pointer to NULL
*/
static int drop_var_from_set ( const char * name , int nvars , char * vars [ ] )
{
int i = 0 ;
int res = 0 ;
/* No variables specified means process all of them */
if ( nvars = = 0 )
return 1 ;
for ( i = 0 ; i < nvars ; i + + ) {
if ( ! strcmp ( name , vars [ i ] ) )
return 1 ;
if ( vars [ i ] = = NULL )
continue ;
/* If we found it, delete all of them */
if ( ! strcmp ( name , vars [ i ] ) ) {
vars [ i ] = NULL ;
res = 1 ;
}
}
debug ( " Skipping non-listed variable %s \n " , name ) ;
if ( ! res )
debug ( " Skipping non-listed variable %s \n " , name ) ;
return 0 ;
return res ;
}
/*
@ -665,6 +675,8 @@ int himport_r(struct hsearch_data *htab,
int nvars , char * const vars [ ] , int do_apply )
{
char * data , * sp , * dp , * name , * value ;
char * localvars [ nvars ] ;
int i ;
/* Test for correct arguments. */
if ( htab = = NULL ) {
@ -681,6 +693,10 @@ int himport_r(struct hsearch_data *htab,
memcpy ( data , env , size ) ;
dp = data ;
/* make a local copy of the list of variables */
if ( nvars )
memcpy ( localvars , vars , sizeof ( vars [ 0 ] ) * nvars ) ;
if ( ( flag & H_NOCLEAR ) = = 0 ) {
/* Destroy old hash table if one exists */
debug ( " Destroy Hash Table: %p table = %p \n " , htab ,
@ -749,7 +765,7 @@ int himport_r(struct hsearch_data *htab,
* dp + + = ' \0 ' ; /* terminate name */
debug ( " DELETE CANDIDATE: \" %s \" \n " , name ) ;
if ( ! is_var_in _set( name , nvars , vars ) )
if ( ! drop_var_from _set( name , nvars , local vars) )
continue ;
if ( hdelete_r ( name , htab , do_apply ) = = 0 )
@ -769,7 +785,7 @@ int himport_r(struct hsearch_data *htab,
+ + dp ;
/* Skip variables which are not supposed to be processed */
if ( ! is_var_in _set( name , nvars , vars ) )
if ( ! drop_var_from _set( name , nvars , local vars) )
continue ;
/* enter into hash table */
@ -809,6 +825,24 @@ int himport_r(struct hsearch_data *htab,
debug ( " INSERT: free(data = %p) \n " , data ) ;
free ( data ) ;
/* process variables which were not considered */
for ( i = 0 ; i < nvars ; i + + ) {
if ( localvars [ i ] = = NULL )
continue ;
/*
* All variables which were not deleted from the variable list
* were not present in the imported env
* This could mean two things :
* a ) if the variable was present in current env , we delete it
* b ) if the variable was not present in current env , we notify
* it might be a typo
*/
if ( hdelete_r ( localvars [ i ] , htab , do_apply ) = = 0 )
printf ( " WARNING: '%s' neither in running nor in imported env! \n " , localvars [ i ] ) ;
else
printf ( " WARNING: '%s' not in imported env, deleting it! \n " , localvars [ i ] ) ;
}
debug ( " INSERT: done \n " ) ;
return 1 ; /* everything OK */
}