mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-29 07:24:55 +00:00 
			
		
		
		
	
		
			
	
	
		
			132 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			132 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  * Asterisk -- An open source telephony toolkit. | ||
|  |  * | ||
|  |  * Copyright (C) 2016, CFWare, LLC | ||
|  |  * | ||
|  |  * Corey Farrell <git@cfware.com> | ||
|  |  * | ||
|  |  * See http://www.asterisk.org for more information about
 | ||
|  |  * the Asterisk project. Please do not directly contact | ||
|  |  * any of the maintainers of this project for assistance; | ||
|  |  * the project provides a web site, mailing lists and IRC | ||
|  |  * channels for your use. | ||
|  |  * | ||
|  |  * This program is free software, distributed under the terms of | ||
|  |  * the GNU General Public License Version 2. See the LICENSE file | ||
|  |  * at the top of the source tree. | ||
|  |  */ | ||
|  | 
 | ||
|  | /*! \file
 | ||
|  |  * | ||
|  |  * \brief PBX switch routines. | ||
|  |  * | ||
|  |  * \author Corey Farrell <git@cfware.com> | ||
|  |  */ | ||
|  | 
 | ||
|  | /*** MODULEINFO
 | ||
|  | 	<support_level>core</support_level> | ||
|  |  ***/ | ||
|  | 
 | ||
|  | #include "asterisk.h"
 | ||
|  | 
 | ||
|  | #include "asterisk/_private.h"
 | ||
|  | #include "asterisk/cli.h"
 | ||
|  | #include "asterisk/linkedlists.h"
 | ||
|  | #include "asterisk/pbx.h"
 | ||
|  | #include "pbx_private.h"
 | ||
|  | 
 | ||
|  | static AST_RWLIST_HEAD_STATIC(switches, ast_switch); | ||
|  | 
 | ||
|  | struct ast_switch *pbx_findswitch(const char *sw) | ||
|  | { | ||
|  | 	struct ast_switch *asw; | ||
|  | 
 | ||
|  | 	AST_RWLIST_RDLOCK(&switches); | ||
|  | 	AST_RWLIST_TRAVERSE(&switches, asw, list) { | ||
|  | 		if (!strcasecmp(asw->name, sw)) | ||
|  | 			break; | ||
|  | 	} | ||
|  | 	AST_RWLIST_UNLOCK(&switches); | ||
|  | 
 | ||
|  | 	return asw; | ||
|  | } | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * Append to the list. We don't have a tail pointer because we need | ||
|  |  * to scan the list anyways to check for duplicates during insertion. | ||
|  |  */ | ||
|  | int ast_register_switch(struct ast_switch *sw) | ||
|  | { | ||
|  | 	struct ast_switch *tmp; | ||
|  | 
 | ||
|  | 	AST_RWLIST_WRLOCK(&switches); | ||
|  | 	AST_RWLIST_TRAVERSE(&switches, tmp, list) { | ||
|  | 		if (!strcasecmp(tmp->name, sw->name)) { | ||
|  | 			AST_RWLIST_UNLOCK(&switches); | ||
|  | 			ast_log(LOG_WARNING, "Switch '%s' already found\n", sw->name); | ||
|  | 			return -1; | ||
|  | 		} | ||
|  | 	} | ||
|  | 	AST_RWLIST_INSERT_TAIL(&switches, sw, list); | ||
|  | 	AST_RWLIST_UNLOCK(&switches); | ||
|  | 
 | ||
|  | 	return 0; | ||
|  | } | ||
|  | 
 | ||
|  | void ast_unregister_switch(struct ast_switch *sw) | ||
|  | { | ||
|  | 	AST_RWLIST_WRLOCK(&switches); | ||
|  | 	AST_RWLIST_REMOVE(&switches, sw, list); | ||
|  | 	AST_RWLIST_UNLOCK(&switches); | ||
|  | } | ||
|  | 
 | ||
|  | /*! \brief  handle_show_switches: CLI support for listing registered dial plan switches */ | ||
|  | static char *handle_show_switches(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) | ||
|  | { | ||
|  | 	struct ast_switch *sw; | ||
|  | 
 | ||
|  | 	switch (cmd) { | ||
|  | 	case CLI_INIT: | ||
|  | 		e->command = "core show switches"; | ||
|  | 		e->usage = | ||
|  | 			"Usage: core show switches\n" | ||
|  | 			"       List registered switches\n"; | ||
|  | 		return NULL; | ||
|  | 	case CLI_GENERATE: | ||
|  | 		return NULL; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	AST_RWLIST_RDLOCK(&switches); | ||
|  | 
 | ||
|  | 	if (AST_RWLIST_EMPTY(&switches)) { | ||
|  | 		AST_RWLIST_UNLOCK(&switches); | ||
|  | 		ast_cli(a->fd, "There are no registered alternative switches\n"); | ||
|  | 		return CLI_SUCCESS; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	ast_cli(a->fd, "\n    -= Registered Asterisk Alternative Switches =-\n"); | ||
|  | 	AST_RWLIST_TRAVERSE(&switches, sw, list) | ||
|  | 		ast_cli(a->fd, "%s: %s\n", sw->name, sw->description); | ||
|  | 
 | ||
|  | 	AST_RWLIST_UNLOCK(&switches); | ||
|  | 
 | ||
|  | 	return CLI_SUCCESS; | ||
|  | } | ||
|  | 
 | ||
|  | static struct ast_cli_entry sw_cli[] = { | ||
|  | 	AST_CLI_DEFINE(handle_show_switches, "Show alternative switches"), | ||
|  | }; | ||
|  | 
 | ||
|  | static void unload_pbx_switch(void) | ||
|  | { | ||
|  | 	ast_cli_unregister_multiple(sw_cli, ARRAY_LEN(sw_cli)); | ||
|  | } | ||
|  | 
 | ||
|  | int load_pbx_switch(void) | ||
|  | { | ||
|  | 	ast_cli_register_multiple(sw_cli, ARRAY_LEN(sw_cli)); | ||
|  | 	ast_register_cleanup(unload_pbx_switch); | ||
|  | 
 | ||
|  | 	return 0; | ||
|  | } |