mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	- convert permission lists to use list macros
- remove unused precachesend and precachereceive variables from dundi_peer This concludes the visit to pbx_dundi ... git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@23831 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		
							
								
								
									
										116
									
								
								pbx/pbx_dundi.c
									
									
									
									
									
								
							
							
						
						
									
										116
									
								
								pbx/pbx_dundi.c
									
									
									
									
									
								
							| @@ -132,8 +132,9 @@ static char cursecret[80]; | ||||
| static char ipaddr[80]; | ||||
| static time_t rotatetime; | ||||
| static dundi_eid empty_eid = { { 0, 0, 0, 0, 0, 0 } }; | ||||
|  | ||||
| struct permission { | ||||
| 	struct permission *next; | ||||
| 	AST_LIST_ENTRY(permission) list; | ||||
| 	int allow; | ||||
| 	char name[0]; | ||||
| }; | ||||
| @@ -222,10 +223,8 @@ struct dundi_mapping { | ||||
| struct dundi_peer { | ||||
| 	dundi_eid eid; | ||||
| 	struct sockaddr_in addr;               /*!< Address of DUNDi peer */ | ||||
| 	struct permission *permit; | ||||
| 	struct permission *include; | ||||
| 	struct permission *precachesend; | ||||
| 	struct permission *precachereceive; | ||||
| 	AST_LIST_HEAD_NOLOCK(permissionlist, permission) permit; | ||||
| 	struct permissionlist include; | ||||
| 	dundi_eid us_eid; | ||||
| 	char inkey[80]; | ||||
| 	char outkey[80]; | ||||
| @@ -277,14 +276,16 @@ static void dundi_error_output(const char *data) | ||||
| 	ast_log(LOG_WARNING, "%s", data); | ||||
| } | ||||
|  | ||||
| static int has_permission(struct permission *ps, char *cont) | ||||
| static int has_permission(struct permissionlist *permlist, char *cont) | ||||
| { | ||||
| 	int res=0; | ||||
| 	while(ps) { | ||||
| 		if (!strcasecmp(ps->name, "all") || !strcasecmp(ps->name, cont)) | ||||
| 			res = ps->allow; | ||||
| 		ps = ps->next; | ||||
| 	struct permission *perm; | ||||
| 	int res = 0; | ||||
|  | ||||
| 	AST_LIST_TRAVERSE(permlist, perm, list) { | ||||
| 		if (!strcasecmp(perm->name, "all") || !strcasecmp(perm->name, cont)) | ||||
| 			res = perm->allow; | ||||
| 	} | ||||
|  | ||||
| 	return res; | ||||
| } | ||||
|  | ||||
| @@ -1550,7 +1551,7 @@ static int handle_command_response(struct dundi_transaction *trans, struct dundi | ||||
| 						dundi_send(trans, resp, 0, 1, &ied); | ||||
| 					} else if ((cmd == DUNDI_COMMAND_DPDISCOVER) &&  | ||||
| 					           (peer->model & DUNDI_MODEL_INBOUND) &&  | ||||
| 							   has_permission(peer->permit, ies.called_context)) { | ||||
| 							   has_permission(&peer->permit, ies.called_context)) { | ||||
| 						res = dundi_answer_query(trans, &ies, ies.called_context); | ||||
| 						if (res < 0) { | ||||
| 							/* There is no such dundi context */ | ||||
| @@ -1559,7 +1560,7 @@ static int handle_command_response(struct dundi_transaction *trans, struct dundi | ||||
| 						} | ||||
| 					} else if ((cmd = DUNDI_COMMAND_PRECACHERQ) &&  | ||||
| 					           (peer->pcmodel & DUNDI_MODEL_INBOUND) &&  | ||||
| 							   has_permission(peer->include, ies.called_context)) { | ||||
| 							   has_permission(&peer->include, ies.called_context)) { | ||||
| 						res = dundi_prop_precache(trans, &ies, ies.called_context); | ||||
| 						if (res < 0) { | ||||
| 							/* There is no such dundi context */ | ||||
| @@ -2398,24 +2399,16 @@ static int dundi_show_peer(int fd, int argc, char *argv[]) | ||||
| 		ast_cli(fd, "Reg:     %s\n", peer->registerid < 0 ? "No" : "Yes"); | ||||
| 		ast_cli(fd, "In Key:  %s\n", ast_strlen_zero(peer->inkey) ? "<None>" : peer->inkey); | ||||
| 		ast_cli(fd, "Out Key: %s\n", ast_strlen_zero(peer->outkey) ? "<None>" : peer->outkey); | ||||
| 		if (peer->include) { | ||||
| 		if (!AST_LIST_EMPTY(&peer->include)) | ||||
| 			ast_cli(fd, "Include logic%s:\n", peer->model & DUNDI_MODEL_OUTBOUND ? "" : " (IGNORED)"); | ||||
| 		} | ||||
| 		p = peer->include; | ||||
| 		while(p) { | ||||
| 		AST_LIST_TRAVERSE(&peer->include, p, list) | ||||
| 			ast_cli(fd, "-- %s %s\n", p->allow ? "include" : "do not include", p->name); | ||||
| 			p = p->next; | ||||
| 		} | ||||
| 		if (peer->permit) { | ||||
| 		if (!AST_LIST_EMPTY(&peer->permit)) | ||||
| 			ast_cli(fd, "Query logic%s:\n", peer->model & DUNDI_MODEL_INBOUND ? "" : " (IGNORED)"); | ||||
| 		} | ||||
| 		p = peer->permit; | ||||
| 		while(p) { | ||||
| 		AST_LIST_TRAVERSE(&peer->permit, p, list) | ||||
| 			ast_cli(fd, "-- %s %s\n", p->allow ? "permit" : "deny", p->name); | ||||
| 			p = p->next; | ||||
| 		} | ||||
| 		cnt = 0; | ||||
| 		for (x=0;x<DUNDI_TIMING_HISTORY;x++) { | ||||
| 		for (x = 0;x < DUNDI_TIMING_HISTORY; x++) { | ||||
| 			if (peer->lookups[x]) { | ||||
| 				if (!cnt) | ||||
| 					ast_cli(fd, "Last few query times:\n"); | ||||
| @@ -2997,7 +2990,7 @@ static void dundi_ie_append_eid_appropriately(struct dundi_ie_data *ied, char *c | ||||
| 	AST_LIST_LOCK(&peers); | ||||
| 	AST_LIST_TRAVERSE(&peers, p, list) { | ||||
| 		if (!dundi_eid_cmp(&p->eid, eid)) { | ||||
| 			if (has_permission(p->include, context)) | ||||
| 			if (has_permission(&p->include, context)) | ||||
| 				dundi_ie_append_eid(ied, DUNDI_IE_EID_DIRECT, eid); | ||||
| 			else | ||||
| 				dundi_ie_append_eid(ied, DUNDI_IE_EID, eid); | ||||
| @@ -3202,7 +3195,7 @@ static int optimize_transactions(struct dundi_request *dr, int order) | ||||
| 		} | ||||
|  | ||||
| 		AST_LIST_TRAVERSE(&peers, peer, list) { | ||||
| 			if (has_permission(peer->include, dr->dcontext) &&  | ||||
| 			if (has_permission(&peer->include, dr->dcontext) &&  | ||||
| 			    dundi_eid_cmp(&peer->eid, &trans->them_eid) && | ||||
| 				(peer->order <= order)) { | ||||
| 				/* For each other transaction, make sure we don't | ||||
| @@ -3303,11 +3296,11 @@ static void build_transactions(struct dundi_request *dr, int ttl, int order, int | ||||
| 	AST_LIST_TRAVERSE(&peers, p, list) { | ||||
| 		if (modeselect == 1) { | ||||
| 			/* Send the precache to push upstreams only! */ | ||||
| 			pass = has_permission(p->permit, dr->dcontext) && (p->pcmodel & DUNDI_MODEL_OUTBOUND); | ||||
| 			pass = has_permission(&p->permit, dr->dcontext) && (p->pcmodel & DUNDI_MODEL_OUTBOUND); | ||||
| 			allowconnect = 1; | ||||
| 		} else { | ||||
| 			/* Normal lookup / EID query */ | ||||
| 			pass = has_permission(p->include, dr->dcontext); | ||||
| 			pass = has_permission(&p->include, dr->dcontext); | ||||
| 			allowconnect = p->model & DUNDI_MODEL_OUTBOUND; | ||||
| 		} | ||||
| 		if (skip) { | ||||
| @@ -3809,14 +3802,12 @@ static void mark_mappings(void) | ||||
| 	AST_LIST_UNLOCK(&peers); | ||||
| } | ||||
|  | ||||
| static void destroy_permissions(struct permission *p) | ||||
| static void destroy_permissions(struct permissionlist *permlist) | ||||
| { | ||||
| 	struct permission *prev; | ||||
| 	while(p) { | ||||
| 		prev = p; | ||||
| 		p = p->next; | ||||
| 		free(prev); | ||||
| 	} | ||||
| 	struct permission *perm; | ||||
|  | ||||
| 	while ((perm = AST_LIST_REMOVE_HEAD(permlist, list))) | ||||
| 		free(perm); | ||||
| } | ||||
|  | ||||
| static void destroy_peer(struct dundi_peer *peer) | ||||
| @@ -3827,8 +3818,8 @@ static void destroy_peer(struct dundi_peer *peer) | ||||
| 		destroy_trans(peer->regtrans, 0); | ||||
| 	if (peer->qualifyid > -1) | ||||
| 		ast_sched_del(sched, peer->qualifyid); | ||||
| 	destroy_permissions(peer->permit); | ||||
| 	destroy_permissions(peer->include); | ||||
| 	destroy_permissions(&peer->permit); | ||||
| 	destroy_permissions(&peer->include); | ||||
| 	free(peer); | ||||
| } | ||||
|  | ||||
| @@ -3867,26 +3858,17 @@ static void prune_mappings(void) | ||||
| 	AST_LIST_UNLOCK(&peers); | ||||
| } | ||||
|  | ||||
| static struct permission *append_permission(struct permission *p, char *s, int allow) | ||||
| static void append_permission(struct permissionlist *permlist, char *s, int allow) | ||||
| { | ||||
| 	struct permission *start; | ||||
| 	start = p; | ||||
| 	if (p) { | ||||
| 		while(p->next) | ||||
| 			p = p->next; | ||||
| 	} | ||||
| 	if (p) { | ||||
| 		p->next = malloc(sizeof(struct permission) + strlen(s) + 1); | ||||
| 		p = p->next; | ||||
| 	} else { | ||||
| 		p = malloc(sizeof(struct permission) + strlen(s) + 1); | ||||
| 	} | ||||
| 	if (p) { | ||||
| 		memset(p, 0, sizeof(struct permission)); | ||||
| 		memcpy(p->name, s, strlen(s) + 1); | ||||
| 		p->allow = allow; | ||||
| 	} | ||||
| 	return start ? start : p; | ||||
| 	struct permission *perm; | ||||
|  | ||||
| 	if (!(perm = ast_calloc(1, sizeof(*perm) + strlen(s) + 1))) | ||||
| 		return; | ||||
|  | ||||
| 	strcpy(perm->name, s); | ||||
| 	perm->allow = allow; | ||||
|  | ||||
| 	AST_LIST_INSERT_TAIL(permlist, perm, list); | ||||
| } | ||||
|  | ||||
| #define MAX_OPTS 128 | ||||
| @@ -4078,10 +4060,8 @@ static void build_peer(dundi_eid *eid, struct ast_variable *v, int *globalpcmode | ||||
| 	peer->dead = 0; | ||||
| 	peer->eid = *eid; | ||||
| 	peer->us_eid = global_eid; | ||||
| 	destroy_permissions(peer->permit); | ||||
| 	destroy_permissions(peer->include); | ||||
| 	peer->permit = NULL; | ||||
| 	peer->include = NULL; | ||||
| 	destroy_permissions(&peer->permit); | ||||
| 	destroy_permissions(&peer->include); | ||||
| 	if (peer->registerid > -1) | ||||
| 		ast_sched_del(sched, peer->registerid); | ||||
| 	peer->registerid = -1; | ||||
| @@ -4109,13 +4089,13 @@ static void build_peer(dundi_eid *eid, struct ast_variable *v, int *globalpcmode | ||||
| 			else | ||||
| 				ast_log(LOG_WARNING, "'%s' is not a valid DUNDi Entity Identifier at line %d\n", v->value, v->lineno); | ||||
| 		} else if (!strcasecmp(v->name, "include")) { | ||||
| 			peer->include = append_permission(peer->include, v->value, 1); | ||||
| 			append_permission(&peer->include, v->value, 1); | ||||
| 		} else if (!strcasecmp(v->name, "permit")) { | ||||
| 			peer->permit = append_permission(peer->permit, v->value, 1); | ||||
| 			append_permission(&peer->permit, v->value, 1); | ||||
| 		} else if (!strcasecmp(v->name, "noinclude")) { | ||||
| 			peer->include = append_permission(peer->include, v->value, 0); | ||||
| 			append_permission(&peer->include, v->value, 0); | ||||
| 		} else if (!strcasecmp(v->name, "deny")) { | ||||
| 			peer->permit = append_permission(peer->permit, v->value, 0); | ||||
| 			append_permission(&peer->permit, v->value, 0); | ||||
| 		} else if (!strcasecmp(v->name, "register")) { | ||||
| 			needregister = ast_true(v->value); | ||||
| 		} else if (!strcasecmp(v->name, "order")) { | ||||
| @@ -4181,10 +4161,10 @@ static void build_peer(dundi_eid *eid, struct ast_variable *v, int *globalpcmode | ||||
| 		ast_log(LOG_WARNING, "Peer '%s' may not be both outbound/symmetric model and inbound/symmetric precache model, discarding!\n",  | ||||
| 			dundi_eid_to_str(eid_str, sizeof(eid_str), &peer->eid)); | ||||
| 		peer->dead = 1; | ||||
| 	} else if (peer->include && !(peer->model & DUNDI_MODEL_OUTBOUND) && !(peer->pcmodel & DUNDI_MODEL_INBOUND)) { | ||||
| 	} else if (!AST_LIST_EMPTY(&peer->include) && !(peer->model & DUNDI_MODEL_OUTBOUND) && !(peer->pcmodel & DUNDI_MODEL_INBOUND)) { | ||||
| 		ast_log(LOG_WARNING, "Peer '%s' is supposed to be included in outbound searches but isn't an outbound peer or inbound precache!\n",  | ||||
| 			dundi_eid_to_str(eid_str, sizeof(eid_str), &peer->eid)); | ||||
| 	} else if (peer->permit && !(peer->model & DUNDI_MODEL_INBOUND) && !(peer->pcmodel & DUNDI_MODEL_OUTBOUND)) { | ||||
| 	} else if (!AST_LIST_EMPTY(&peer->permit) && !(peer->model & DUNDI_MODEL_INBOUND) && !(peer->pcmodel & DUNDI_MODEL_OUTBOUND)) { | ||||
| 		ast_log(LOG_WARNING, "Peer '%s' is supposed to have permission for some inbound searches but isn't an inbound peer or outbound precache!\n",  | ||||
| 			dundi_eid_to_str(eid_str, sizeof(eid_str), &peer->eid)); | ||||
| 	} else {  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user