mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 10:26:10 +01:00 
			
		
		
		
	env: check and apply changes on delete/destroy
Signed-off-by: Gerlando Falauto <gerlando.falauto@keymile.com> Reviewed-by: Marek Vasut <marex@denx.de>
This commit is contained in:
		
				
					committed by
					
						 Tom Rini
						Tom Rini
					
				
			
			
				
	
			
			
			
						parent
						
							c5983592e9
						
					
				
				
					commit
					152874b65b
				
			| @@ -359,7 +359,7 @@ int _do_env_set(int flag, int argc, char * const argv[]) | ||||
|  | ||||
| 	/* Delete only ? */ | ||||
| 	if (argc < 3 || argv[2] == NULL) { | ||||
| 		int rc = hdelete_r(name, &env_htab); | ||||
| 		int rc = hdelete_r(name, &env_htab, 0); | ||||
| 		return !rc; | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -73,7 +73,7 @@ struct hsearch_data { | ||||
| extern int hcreate_r(size_t __nel, struct hsearch_data *__htab); | ||||
|  | ||||
| /* Destroy current internal hashing table.  */ | ||||
| extern void hdestroy_r(struct hsearch_data *__htab); | ||||
| extern void hdestroy_r(struct hsearch_data *__htab, int do_apply); | ||||
|  | ||||
| /* | ||||
|  * Search for entry matching ITEM.key in internal hash table.  If | ||||
| @@ -98,7 +98,8 @@ extern int hstrstr_r(const char *__match, int __last_idx, ENTRY ** __retval, | ||||
| 		    struct hsearch_data *__htab); | ||||
|  | ||||
| /* Search and delete entry matching ITEM.key in internal hash table. */ | ||||
| extern int hdelete_r(const char *__key, struct hsearch_data *__htab); | ||||
| extern int hdelete_r(const char *__key, struct hsearch_data *__htab, | ||||
| 			int do_apply); | ||||
|  | ||||
| extern ssize_t hexport_r(struct hsearch_data *__htab, | ||||
| 		     const char __sep, char **__resp, size_t __size, | ||||
|   | ||||
| @@ -142,7 +142,7 @@ int hcreate_r(size_t nel, struct hsearch_data *htab) | ||||
|  * be freed and the local static variable can be marked as not used. | ||||
|  */ | ||||
|  | ||||
| void hdestroy_r(struct hsearch_data *htab) | ||||
| void hdestroy_r(struct hsearch_data *htab, int do_apply) | ||||
| { | ||||
| 	int i; | ||||
|  | ||||
| @@ -156,7 +156,10 @@ void hdestroy_r(struct hsearch_data *htab) | ||||
| 	for (i = 1; i <= htab->size; ++i) { | ||||
| 		if (htab->table[i].used > 0) { | ||||
| 			ENTRY *ep = &htab->table[i].entry; | ||||
|  | ||||
| 			if (do_apply && htab->apply != NULL) { | ||||
| 				/* deletion is always forced */ | ||||
| 				htab->apply(ep->key, ep->data, NULL, H_FORCE); | ||||
| 			} | ||||
| 			free((void *)ep->key); | ||||
| 			free(ep->data); | ||||
| 		} | ||||
| @@ -401,7 +404,7 @@ int hsearch_r(ENTRY item, ACTION action, ENTRY ** retval, | ||||
|  * do that. | ||||
|  */ | ||||
|  | ||||
| int hdelete_r(const char *key, struct hsearch_data *htab) | ||||
| int hdelete_r(const char *key, struct hsearch_data *htab, int do_apply) | ||||
| { | ||||
| 	ENTRY e, *ep; | ||||
| 	int idx; | ||||
| @@ -417,7 +420,8 @@ int hdelete_r(const char *key, struct hsearch_data *htab) | ||||
|  | ||||
| 	/* free used ENTRY */ | ||||
| 	debug("hdelete: DELETING key \"%s\"\n", key); | ||||
|  | ||||
| 	if (do_apply && htab->apply != NULL) | ||||
| 		htab->apply(ep->key, ep->data, NULL, H_FORCE); | ||||
| 	free((void *)ep->key); | ||||
| 	free(ep->data); | ||||
| 	htab->table[idx].used = -1; | ||||
| @@ -682,7 +686,7 @@ int himport_r(struct hsearch_data *htab, | ||||
| 		debug("Destroy Hash Table: %p table = %p\n", htab, | ||||
| 		       htab->table); | ||||
| 		if (htab->table) | ||||
| 			hdestroy_r(htab); | ||||
| 			hdestroy_r(htab, do_apply); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| @@ -748,7 +752,7 @@ int himport_r(struct hsearch_data *htab, | ||||
| 			if (!is_var_in_set(name, nvars, vars)) | ||||
| 				continue; | ||||
|  | ||||
| 			if (hdelete_r(name, htab) == 0) | ||||
| 			if (hdelete_r(name, htab, do_apply) == 0) | ||||
| 				debug("DELETE ERROR ##############################\n"); | ||||
|  | ||||
| 			continue; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user