[asterisk-commits] qwell: trunk r43290 - in /trunk: include/asterisk/ main/

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Tue Sep 19 12:58:09 MST 2006


Author: qwell
Date: Tue Sep 19 14:58:09 2006
New Revision: 43290

URL: http://svn.digium.com/view/asterisk?rev=43290&view=rev
Log:
After discussing this with other people, we decided we'd like to try to do this a little differently.

Stay tuned.

Modified:
    trunk/include/asterisk/manager.h
    trunk/main/http.c
    trunk/main/manager.c

Modified: trunk/include/asterisk/manager.h
URL: http://svn.digium.com/view/asterisk/trunk/include/asterisk/manager.h?rev=43290&r1=43289&r2=43290&view=diff
==============================================================================
--- trunk/include/asterisk/manager.h (original)
+++ trunk/include/asterisk/manager.h Tue Sep 19 14:58:09 2006
@@ -106,12 +106,6 @@
 */
 int ast_manager_unregister( char *action );
 
-/*! Add a manager_user to current list of manager */
-int *ast_manager_add(struct ast_manager_user *amu);
-
-/*! Get an manager by his name */
-struct ast_manager_user *ast_get_manager_by_name_locked(const char *name);
-
 /*! External routines may send asterisk manager events this way */
 /*! 	\param category	Event category, matches manager authorization
 	\param event	Event name
@@ -139,11 +133,5 @@
 int init_manager(void);
 /*! Called by Asterisk initialization */
 int reload_manager(void);
-/*! Add a manager_user to current list of manager */
-int *ast_manager_add(struct ast_manager_user *amu);
-int *ast_manager_user_add(struct ast_manager_user *amu);
-/*! Get an manager by his name */
-struct ast_manager_user *ast_get_manager_by_name_locked(const char *name);
-
 
 #endif /* _ASTERISK_MANAGER_H */

Modified: trunk/main/http.c
URL: http://svn.digium.com/view/asterisk/trunk/main/http.c?rev=43290&r1=43289&r2=43290&view=diff
==============================================================================
--- trunk/main/http.c (original)
+++ trunk/main/http.c Tue Sep 19 14:58:09 2006
@@ -1,4 +1,4 @@
-  /*
+/*
  * Asterisk -- An open source telephony toolkit.
  *
  * Copyright (C) 1999 - 2006, Digium, Inc.
@@ -17,13 +17,13 @@
  */
 
 /*!
- * \file
+ * \file 
  * \brief http server for AMI access
  *
  * \author Mark Spencer <markster at digium.com>
  * This program implements a tiny http server supporting the "get" method
- * only and was inspired by micro-httpd by Jef Poskanzer
- *
+ * only and was inspired by micro-httpd by Jef Poskanzer 
+ * 
  * \ref AstHTTP - AMI over the http protocol
  */
 
@@ -110,7 +110,7 @@
 	int fd;
 	void *blob;
 
-	/* Yuck.  I'm not really sold on this, but if you don't deliver static content it makes your configuration
+	/* Yuck.  I'm not really sold on this, but if you don't deliver static content it makes your configuration 
 	   substantially more challenging, but this seems like a rather irritating feature creep on Asterisk. */
 	if (!enablestatic || ast_strlen_zero(uri))
 		goto out403;
@@ -119,16 +119,16 @@
 		goto out403;
 	if (strstr(uri, "/.."))
 		goto out403;
-
+		
 	if ((ftype = strrchr(uri, '.')))
 		ftype++;
 	mtype=ftype2mtype(ftype, wkspace, sizeof(wkspace));
-
+	
 	/* Cap maximum length */
 	len = strlen(uri) + strlen(ast_config_AST_DATA_DIR) + strlen("/static-http/") + 5;
 	if (len > 1024)
 		goto out403;
-
+		
 	path = alloca(len);
 	sprintf(path, "%s/static-http/%s", ast_config_AST_DATA_DIR, uri);
 	if (stat(path, &st))
@@ -138,9 +138,9 @@
 	fd = open(path, O_RDONLY);
 	if (fd < 0)
 		goto out403;
-
+	
 	len = st.st_size + strlen(mtype) + 40;
-
+	
 	blob = malloc(len);
 	if (blob) {
 		c = blob;
@@ -211,14 +211,14 @@
 	.uri = "httpstatus",
 	.has_subtree = 0,
 };
-
+	
 static struct ast_http_uri staticuri = {
 	.callback = static_callback,
 	.description = "Asterisk HTTP Static Delivery",
 	.uri = "static",
 	.has_subtree = 1,
 };
-
+	
 char *ast_http_error(int status, const char *title, const char *extra_header, const char *text)
 {
 	char *c = NULL;
@@ -253,7 +253,7 @@
 		prev->next = urih;
 	}
 	return 0;
-}
+}	
 
 void ast_http_uri_unlink(struct ast_http_uri *urih)
 {
@@ -282,8 +282,8 @@
 	struct ast_http_uri *urih=NULL;
 	int len;
 	struct ast_variable *vars=NULL, *v, *prev = NULL;
-
-
+	
+	
 	params = strchr(uri, '?');
 	if (params) {
 		*params = '\0';
@@ -294,7 +294,7 @@
 				*val = '\0';
 				val++;
 				ast_uri_decode(val);
-			} else
+			} else 
 				val = "";
 			ast_uri_decode(var);
 			if ((v = ast_variable_new(var, val))) {
@@ -395,32 +395,32 @@
 				break;
 			if (!strncasecmp(cookie, "Cookie: ", 8)) {
 
-				/* TODO - The cookie parsing code below seems to work
-				   in IE6 and FireFox 1.5.  However, it is not entirely
-				   correct, and therefore may not work in all
-				   circumstances.
+				/* TODO - The cookie parsing code below seems to work   
+				   in IE6 and FireFox 1.5.  However, it is not entirely 
+				   correct, and therefore may not work in all           
+				   circumstances.		                        
 				      For more details see RFC 2109 and RFC 2965        */
-
-				/* FireFox cookie strings look like:
-				     Cookie: mansession_id="********"
-				   InternetExplorer's look like:
+			
+				/* FireFox cookie strings look like:                    
+				     Cookie: mansession_id="********"                   
+				   InternetExplorer's look like:                        
 				     Cookie: $Version="1"; mansession_id="********"     */
-
-				/* If we got a FireFox cookie string, the name's right
+				
+				/* If we got a FireFox cookie string, the name's right  
 				    after "Cookie: "                                    */
                                 vname = cookie + 8;
-
-				/* If we got an IE cookie string, we need to skip to
+				
+				/* If we got an IE cookie string, we need to skip to    
 				    past the version to get to the name                 */
 				if (*vname == '$') {
 					vname = strchr(vname, ';');
-					if (vname) {
+					if (vname) { 
 						vname++;
 						if (*vname == ' ')
 							vname++;
 					}
 				}
-
+				
 				if (vname) {
 					vval = strchr(vname, '=');
 					if (vval) {
@@ -444,11 +444,11 @@
 		}
 
 		if (*uri) {
-			if (!strcasecmp(buf, "get"))
+			if (!strcasecmp(buf, "get")) 
 				c = handle_uri(&ser->requestor, uri, &status, &title, &contentlength, &vars);
-			else
+			else 
 				c = ast_http_error(501, "Not Implemented", NULL, "Attempt to use unimplemented / unsupported method");\
-		} else
+		} else 
 			c = ast_http_error(400, "Bad Request", NULL, "Invalid Request");
 
 		/* If they aren't mopped up already, clean up the cookies */
@@ -492,7 +492,7 @@
 	struct ast_http_server_instance *ser;
 	pthread_t launched;
 	pthread_attr_t attr;
-
+	
 	for (;;) {
 		ast_wait_for_input(httpfd, -1);
 		sinlen = sizeof(sin);
@@ -509,7 +509,7 @@
 			if ((ser->f = fdopen(ser->fd, "w+"))) {
 				pthread_attr_init(&attr);
 				pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-
+				
 				if (ast_pthread_create(&launched, &attr, ast_httpd_helper_thread, ser)) {
 					ast_log(LOG_WARNING, "Unable to launch helper thread: %s\n", strerror(errno));
 					fclose(ser->f);
@@ -541,36 +541,36 @@
 {
 	int flags;
 	int x = 1;
-
+	
 	/* Do nothing if nothing has changed */
 	if (!memcmp(&oldsin, sin, sizeof(oldsin))) {
 		ast_log(LOG_DEBUG, "Nothing changed in http\n");
 		return;
 	}
-
+	
 	memcpy(&oldsin, sin, sizeof(oldsin));
-
+	
 	/* Shutdown a running server if there is one */
 	if (master != AST_PTHREADT_NULL) {
 		pthread_cancel(master);
 		pthread_kill(master, SIGURG);
 		pthread_join(master, NULL);
 	}
-
+	
 	if (httpfd != -1)
 		close(httpfd);
 
 	/* If there's no new server, stop here */
 	if (!sin->sin_family)
 		return;
-
-
+	
+	
 	httpfd = socket(AF_INET, SOCK_STREAM, 0);
 	if (httpfd < 0) {
 		ast_log(LOG_WARNING, "Unable to allocate socket: %s\n", strerror(errno));
 		return;
 	}
-
+	
 	setsockopt(httpfd, SOL_SOCKET, SO_REUSEADDR, &x, sizeof(x));
 	if (bind(httpfd, (struct sockaddr *)sin, sizeof(*sin))) {
 		ast_log(LOG_NOTICE, "Unable to bind http server to %s:%d: %s\n",
@@ -634,7 +634,7 @@
 				} else {
 					newprefix[0] = '\0';
 				}
-
+					
 			}
 			v = v->next;
 		}

Modified: trunk/main/manager.c
URL: http://svn.digium.com/view/asterisk/trunk/main/manager.c?rev=43290&r1=43289&r2=43290&view=diff
==============================================================================
--- trunk/main/manager.c (original)
+++ trunk/main/manager.c Tue Sep 19 14:58:09 2006
@@ -23,13 +23,13 @@
  * \author Mark Spencer <markster at digium.com>
  *
  * Channel Management and more
- *
+ * 
  * \ref amiconf
  */
 
-/*! \addtogroup Group_AMI AMI functions
+/*! \addtogroup Group_AMI AMI functions 
 */
-/*! @{
+/*! @{ 
  Doxygen group */
 
 #include "asterisk.h"
@@ -103,12 +103,9 @@
 static int block_sockets = 0;
 static int num_sessions = 0;
 
-static struct ast_manager_user *amus =NULL;
-
 /* Protected by the sessions list lock */
 struct eventqent *master_eventq = NULL;
 
-AST_MUTEX_DEFINE_STATIC(amulock);
 AST_THREADSTORAGE(manager_event_buf, manager_event_buf_init);
 #define MANAGER_EVENT_BUF_INITSIZE   256
 
@@ -178,17 +175,6 @@
 	AST_LIST_ENTRY(mansession) list;
 };
 
-struct ast_manager_user {
-	char username[80];
-	char *secret;
-	char *deny;
-	char *permit;
-	char *read;
-	char *write;
-	unsigned int displayconnects:1;
-	struct ast_manager_user *next;
-};
-
 static AST_LIST_HEAD_STATIC(sessions, mansession);
 
 static struct manager_action *first_action = NULL;
@@ -213,7 +199,7 @@
 
 	if (ast_strlen_zero(res))
 		ast_copy_string(res, "<none>", reslen);
-
+	
 	return res;
 }
 
@@ -263,7 +249,7 @@
 			strcpy(*dst, "&amp;");
 			(*dst) += 5;
 			*maxlen -= 5;
-			break;
+			break;		
 		default:
 			*(*dst)++ = lower ? tolower(*src) : *src;
 			(*maxlen)--;
@@ -285,11 +271,11 @@
 	int escaped = 0;
 	int inobj = 0;
 	int x;
-
+	
 	for (v = vars; v; v = v->next) {
 		if (!dest && !strcasecmp(v->name, "ajaxdest"))
 			dest = v->value;
-		else if (!objtype && !strcasecmp(v->name, "ajaxobjtype"))
+		else if (!objtype && !strcasecmp(v->name, "ajaxobjtype")) 
 			objtype = v->value;
 	}
 	if (!dest)
@@ -334,7 +320,7 @@
 					ast_build_string(&tmp, &len, "<response type='object' id='%s'><%s", dest, objtype);
 					inobj = 1;
 				}
-				ast_build_string(&tmp, &len, " ");
+				ast_build_string(&tmp, &len, " ");				
 				xml_copy_escape(&tmp, &len, var, 1);
 				ast_build_string(&tmp, &len, "='");
 				xml_copy_escape(&tmp, &len, val, 0);
@@ -394,36 +380,6 @@
 	return out;
 }
 
-
-
-struct ast_manager_user *ast_get_manager_by_name_locked(const char *name)
-{
-	struct ast_manager_user *tmp = NULL;
-	tmp=amus;
-	while (tmp) {
-		if (!strcasecmp(tmp->username, name))
-			break;
-		tmp = tmp->next;
-	}
-	if ( tmp)
-		return tmp;
-	return NULL;
-}
-
-
-
-int *ast_manager_user_add(struct ast_manager_user *amu) {
-	if (!amu) {
-		ast_log(LOG_DEBUG, "You cant pass NULL to that function");
-		return NULL;
-	}
-	ast_mutex_lock(&amulock);
-	amu->next = amus;
-	amus = amu;
-	ast_mutex_unlock(&amulock);
-	return NULL;
-}
-
 void astman_append(struct mansession *s, const char *fmt, ...)
 {
 	va_list ap;
@@ -435,14 +391,14 @@
 	va_start(ap, fmt);
 	ast_dynamic_str_thread_set_va(&buf, 0, &astman_append_buf, fmt, ap);
 	va_end(ap);
-
+	
 	if (s->fd > -1)
 		ast_carefulwrite(s->fd, buf->str, strlen(buf->str), s->writetimeout);
 	else {
 		if (!s->outputstr && !(s->outputstr = ast_calloc(1, sizeof(*s->outputstr))))
 			return;
 
-		ast_dynamic_str_append(&s->outputstr, 0, "%s", buf->str);
+		ast_dynamic_str_append(&s->outputstr, 0, "%s", buf->str);	
 	}
 }
 
@@ -468,80 +424,7 @@
 	return RESULT_SUCCESS;
 }
 
-static int handle_showmanager(int fd, int argc, char *argv[])
-{
-	struct ast_manager_user *tmp;
-	if (argc != 4 )
-		return RESULT_SHOWUSAGE;
-
-	/* try to lock manager_user list ... */
-	if (ast_mutex_lock(&amulock)) {
-		ast_log(LOG_ERROR, "Unable to lock manager_user list\n");
-		return -1;
-	}
-
-	tmp = ast_get_manager_by_name_locked(argv[3]);
-
-	if (!tmp) {
-		ast_cli(fd, "There are no manager called %s\n",argv[3]);
-		ast_mutex_unlock(&amulock);
-		return -1;
-	}
-	ast_cli(fd,"\n");
-	ast_cli(fd,
-		"       username: %s\n"
-		"         secret: %s\n"
-		"           deny: %s\n"
-		"         permit: %s\n"
-		"           read: %s\n"
-		"          write: %s\n"
-		"displayconnects: %s\n",
-		(tmp->username ? tmp->username : "(N/A)"),
-		(tmp->secret ? tmp->secret : "(N/A)"),
-		(tmp->deny ? tmp->deny : "(N/A)"),
-		(tmp->permit ? tmp->permit : "(N/A)"),
-		(tmp->read ? tmp->read : "(N/A)"),
-		(tmp->write ? tmp->write : "(N/A)"),
-		(tmp->displayconnects ? "yes" : "no"));
-	ast_mutex_unlock(&amulock);
-
-	return RESULT_SUCCESS;
-}
-
-
-static int handle_showmanagers(int fd, int argc, char *argv[]) {
-	struct ast_manager_user *tmp;
-	int count_amu = 0;
-
-	if ( argc > 4 )
-		return RESULT_SHOWUSAGE;
-
-	/* try to lock manager_user list ... */
-	if (ast_mutex_lock(&amulock)) {
-		ast_log(LOG_ERROR, "Unable to lock manager_user list\n");
-		return -1;
-	}
-
-	tmp=amus;
-	if (!tmp) {
-		ast_cli(fd, "There are no manager user.\n");
-		ast_mutex_unlock(&amulock);
-		return -1;
-	}
-	ast_cli(fd, "\nusername\n--------\n");
-	while (tmp) {
-		ast_cli(fd, "%s\n", tmp->username);
-		tmp = tmp->next;
-		count_amu++;
-	}
-	ast_mutex_unlock(&amulock);
-	ast_cli(fd,"-------------------\n");
-	ast_cli(fd,"%d manager users configured.\n", count_amu);
-	return RESULT_SUCCESS;
-}
-
-
-/*! \brief  CLI command
+/*! \brief  CLI command 
 	Should change to "manager show commands" */
 static int handle_showmancmds(int fd, int argc, char *argv[])
 {
@@ -551,12 +434,12 @@
 
 	ast_cli(fd, format, "Action", "Privilege", "Synopsis");
 	ast_cli(fd, format, "------", "---------", "--------");
-
+	
 	ast_mutex_lock(&actionlock);
 	for (; cur; cur = cur->next) /* Walk the list of actions */
 		ast_cli(fd, format, cur->action, authority_to_str(cur->authority, authority, sizeof(authority) -1), cur->synopsis);
 	ast_mutex_unlock(&actionlock);
-
+	
 	return RESULT_SUCCESS;
 }
 
@@ -568,7 +451,7 @@
 	char *format = "  %-15.15s  %-15.15s\n";
 
 	ast_cli(fd, format, "Username", "IP Address");
-
+	
 	AST_LIST_LOCK(&sessions);
 	AST_LIST_TRAVERSE(&sessions, s, list)
 		ast_cli(fd, format,s->username, ast_inet_ntoa(s->sin.sin_addr));
@@ -594,56 +477,61 @@
 	return RESULT_SUCCESS;
 }
 
-static char showmancmd_help[] =
-"Usage: show manager command <actionname>\n"
+static char showmancmd_help[] = 
+"Usage: manager show command <actionname>\n"
 "	Shows the detailed description for a specific Asterisk manager interface command.\n";
 
-static char showmancmds_help[] =
-"Usage: show manager commands\n"
+static char showmancmds_help[] = 
+"Usage: manager list commands\n"
 "	Prints a listing of all the available Asterisk manager interface commands.\n";
 
-static char showmanconn_help[] =
-"Usage: show manager connected\n"
+static char showmanconn_help[] = 
+"Usage: manager list connected\n"
 "	Prints a listing of the users that are currently connected to the\n"
 "Asterisk manager interface.\n";
 
-static char showmaneventq_help[] =
-"Usage: show manager eventq\n"
+static char showmaneventq_help[] = 
+"Usage: manager list eventq\n"
 "	Prints a listing of all events pending in the Asterisk manger\n"
 "event queue.\n";
 
-static char showmanagers_help[] =
-"Usage: show managers\n"
-"       Prints a listing of all managers that are currently configured on that\n"
-" system.\n";
-
-static char showmanager_help[] =
-" Usage: show manager foobar\n"
-" Display all the infos related to the manager foobar.\n";
-
-static struct ast_cli_entry show_managers_cli =
-	{ { "manager", "show", "users" },
-	handle_showmanagers, "Show all managers users (connected or not)", showmanagers_help };
-
-static struct ast_cli_entry show_manager_cli =
-{ { "manager", "show", "user" }, handle_showmanager, "Display information on a specific manager", showmanager_help};
-
-
-static struct ast_cli_entry show_mancmd_cli =
-	{ { "show", "manager", "command", NULL },
-	handle_showmancmd, "Show a manager interface command", showmancmd_help, complete_show_mancmd };
-
-static struct ast_cli_entry show_mancmds_cli =
-	{ { "show", "manager", "commands", NULL },
-	handle_showmancmds, "List manager interface commands", showmancmds_help };
-
-static struct ast_cli_entry show_manconn_cli =
-	{ { "show", "manager", "connected", NULL },
-	handle_showmanconn, "Show connected manager interface users", showmanconn_help };
-
-static struct ast_cli_entry show_maneventq_cli =
-	{ { "show", "manager", "eventq", NULL },
-	handle_showmaneventq, "Show manager interface queued events", showmaneventq_help };
+static struct ast_cli_entry cli_show_manager_command_deprecated = {
+	{ "show", "manager", "command", NULL },
+	handle_showmancmd, NULL,
+	NULL, complete_show_mancmd };
+
+static struct ast_cli_entry cli_show_manager_commands_deprecated = {
+	{ "show", "manager", "commands", NULL },
+	handle_showmancmds, NULL,
+	NULL };
+
+static struct ast_cli_entry cli_show_manager_connected_deprecated = {
+	{ "show", "manager", "connected", NULL },
+	handle_showmanconn, NULL,
+	NULL };
+
+static struct ast_cli_entry cli_show_manager_eventq_deprecated = {
+	{ "show", "manager", "eventq", NULL },
+	handle_showmaneventq, NULL,
+	NULL };
+
+static struct ast_cli_entry cli_manager[] = {
+	{ { "manager", "show", "command", NULL },
+	handle_showmancmd, "Show a manager interface command",
+	showmancmd_help, complete_show_mancmd, &cli_show_manager_command_deprecated },
+
+	{ { "manager", "list", "commands", NULL },
+	handle_showmancmds, "List manager interface commands",
+	showmancmds_help, NULL, &cli_show_manager_commands_deprecated },
+
+	{ { "manager", "list", "connected", NULL },
+	handle_showmanconn, "List connected manager interface users",
+	showmanconn_help, NULL, &cli_show_manager_connected_deprecated },
+
+	{ { "manager", "list", "eventq", NULL },
+	handle_showmaneventq, "List manager interface queued events",
+	showmaneventq_help, NULL, &cli_show_manager_eventq_deprecated },
+};
 
 static void unuse_eventqent(struct eventqent *e)
 {
@@ -698,12 +586,12 @@
 	struct ast_variable *head = NULL, *cur;
 	char *var, *val;
 
-	char *parse;
+	char *parse;    
 	AST_DECLARE_APP_ARGS(args,
 		AST_APP_ARG(vars)[32];
 	);
 
-	varlen = strlen("Variable: ");
+	varlen = strlen("Variable: ");	
 
 	for (x = 0; x < m->hdrcount; x++) {
 		if (strncasecmp("Variable: ", m->headers[x], varlen))
@@ -774,7 +662,7 @@
    ast_instring("this|that|more","this",',') == 1;
 
    feel free to move this to app.c -anthm */
-static int ast_instring(char *bigstr, char *smallstr, char delim)
+static int ast_instring(char *bigstr, char *smallstr, char delim) 
 {
 	char *val = bigstr, *next;
 
@@ -803,11 +691,11 @@
 		if (ast_instring(instr, perms[x].label, ','))
 			ret |= perms[x].num;
 	}
-
+	
 	return ret;
 }
 
-static int ast_is_number(char *string)
+static int ast_is_number(char *string) 
 {
 	int ret = 1, x = 0;
 
@@ -820,14 +708,14 @@
 			break;
 		}
 	}
-
+	
 	return ret ? atoi(string) : 0;
 }
 
-static int ast_strings_to_mask(char *string)
+static int ast_strings_to_mask(char *string) 
 {
 	int x, ret = -1;
-
+	
 	x = ast_is_number(string);
 
 	if (x)
@@ -839,12 +727,12 @@
 	else if (ast_true(string)) {
 		ret = 0;
 		for (x=0; x<sizeof(perms) / sizeof(perms[0]); x++)
-			ret |= perms[x].num;
+			ret |= perms[x].num;		
 	} else {
 		ret = 0;
 		for (x=0; x<sizeof(perms) / sizeof(perms[0]); x++) {
-			if (ast_instring(string, perms[x].label, ','))
-				ret |= perms[x].num;
+			if (ast_instring(string, perms[x].label, ',')) 
+				ret |= perms[x].num;		
 		}
 	}
 
@@ -852,7 +740,7 @@
 }
 
 /*! \brief
-   Rather than braindead on,off this now can also accept a specific int mask value
+   Rather than braindead on,off this now can also accept a specific int mask value 
    or a ',' delim list of mask strings (the same as manager.conf) -anthm
 */
 static int set_eventmask(struct mansession *s, char *eventmask)
@@ -860,10 +748,10 @@
 	int maskint = ast_strings_to_mask(eventmask);
 
 	ast_mutex_lock(&s->__lock);
-	if (maskint >= 0)
+	if (maskint >= 0)	
 		s->send_events = maskint;
 	ast_mutex_unlock(&s->__lock);
-
+	
 	return maskint;
 }
 
@@ -876,7 +764,7 @@
 	char *authtype = astman_get_header(m, "AuthType");
 	char *key = astman_get_header(m, "Key");
 	char *events = astman_get_header(m, "Events");
-
+	
 	cfg = ast_config_load("manager.conf");
 	if (!cfg)
 		return -1;
@@ -911,7 +799,7 @@
 						else
 							s->writetimeout = val;
 					}
-
+				    		
 				}
 				if (ha && !ast_apply_ha(ha, &(s->sin))) {
 					ast_log(LOG_NOTICE, "%s failed to pass IP ACL as '%s'\n", ast_inet_ntoa(s->sin.sin_addr), user);
@@ -946,7 +834,7 @@
 					ast_log(LOG_NOTICE, "%s failed to authenticate as '%s'\n", ast_inet_ntoa(s->sin.sin_addr), user);
 					ast_config_destroy(cfg);
 					return -1;
-				}
+				}	
 			}
 		}
 		cat = ast_category_browse(cfg, cat);
@@ -966,7 +854,7 @@
 }
 
 /*! \brief Manager PING */
-static char mandescr_ping[] =
+static char mandescr_ping[] = 
 "Description: A 'Ping' action will ellicit a 'Pong' response.  Used to keep the\n"
 "  manager connection open.\n"
 "Variables: NONE\n";
@@ -1027,7 +915,7 @@
 	char *action, *cat, *var, *value, *match;
 	struct ast_category *category;
 	struct ast_variable *v;
-
+	
 	for (x=0;x<100000;x++) {
 		snprintf(hdr, sizeof(hdr), "Action-%06d", x);
 		action = astman_get_header(m, hdr);
@@ -1051,7 +939,7 @@
 		} else if (!strcasecmp(action, "renamecat")) {
 			if (!ast_strlen_zero(cat) && !ast_strlen_zero(value)) {
 				category = ast_category_get(cfg, cat);
-				if (category)
+				if (category) 
 					ast_category_rename(category, value);
 			}
 		} else if (!strcasecmp(action, "delcat")) {
@@ -1064,8 +952,8 @@
 			if (!ast_strlen_zero(cat) && !ast_strlen_zero(var) && (category = ast_category_get(cfg, cat)))
 				ast_variable_delete(category, var, match);
 		} else if (!strcasecmp(action, "append")) {
-			if (!ast_strlen_zero(cat) && !ast_strlen_zero(var) &&
-				(category = ast_category_get(cfg, cat)) &&
+			if (!ast_strlen_zero(cat) && !ast_strlen_zero(var) && 
+				(category = ast_category_get(cfg, cat)) && 
 				(v = ast_variable_new(var, value))){
 				if (match && !strcasecmp(match, "object"))
 					v->object = 1;
@@ -1120,13 +1008,13 @@
 	if (!ast_strlen_zero(rld)) {
 		if (ast_true(rld))
 			rld = NULL;
-		ast_module_reload(rld);
+		ast_module_reload(rld); 
 	}
 	return 0;
 }
 
 /*! \brief Manager WAITEVENT */
-static char mandescr_waitevent[] =
+static char mandescr_waitevent[] = 
 "Description: A 'WaitEvent' action will ellicit a 'Success' response.  Whenever\n"
 "a manager event is queued.  Once WaitEvent has been called on an HTTP manager\n"
 "session, events will be generated and queued.\n"
@@ -1150,7 +1038,7 @@
 	if (!ast_strlen_zero(timeouts)) {
 		sscanf(timeouts, "%i", &timeout);
 	}
-
+	
 	ast_mutex_lock(&s->__lock);
 	if (s->waiting_thread != AST_PTHREADT_NULL) {
 		pthread_kill(s->waiting_thread, SIGURG);
@@ -1217,7 +1105,7 @@
 	return 0;
 }
 
-static char mandescr_listcommands[] =
+static char mandescr_listcommands[] = 
 "Description: Returns the action name and synopsis for every\n"
 "  action that is available to the user\n"
 "Variables: NONE\n";
@@ -1244,7 +1132,7 @@
 	return 0;
 }
 
-static char mandescr_events[] =
+static char mandescr_events[] = 
 "Description: Enable/Disable sending of events to this manager\n"
 "  client.\n"
 "Variables:\n"
@@ -1266,7 +1154,7 @@
 	return 0;
 }
 
-static char mandescr_logoff[] =
+static char mandescr_logoff[] = 
 "Description: Logoff this manager session\n"
 "Variables: NONE\n";
 
@@ -1276,7 +1164,7 @@
 	return -1;
 }
 
-static char mandescr_hangup[] =
+static char mandescr_hangup[] = 
 "Description: Hangup a channel\n"
 "Variables: \n"
 "	Channel: The channel name to be hungup\n";
@@ -1300,7 +1188,7 @@
 	return 0;
 }
 
-static char mandescr_setvar[] =
+static char mandescr_setvar[] = 
 "Description: Set a global or local channel variable.\n"
 "Variables: (Names marked with * are required)\n"
 "	Channel: Channel to set variable for\n"
@@ -1313,12 +1201,12 @@
         char *name = astman_get_header(m, "Channel");
         char *varname = astman_get_header(m, "Variable");
         char *varval = astman_get_header(m, "Value");
-
+	
 	if (ast_strlen_zero(varname)) {
 		astman_send_error(s, m, "No variable specified");
 		return 0;
 	}
-
+	
 	if (ast_strlen_zero(varval)) {
 		astman_send_error(s, m, "No value specified");
 		return 0;
@@ -1331,18 +1219,18 @@
 			return 0;
 		}
 	}
-
+	
 	pbx_builtin_setvar_helper(c, varname, varval);
-
+	  
 	if (c)
 		ast_channel_unlock(c);
 
-	astman_send_ack(s, m, "Variable Set");
+	astman_send_ack(s, m, "Variable Set");	
 
 	return 0;
 }
 
-static char mandescr_getvar[] =
+static char mandescr_getvar[] = 
 "Description: Get the value of a global or local channel variable.\n"
 "Variables: (Names marked with * are required)\n"
 "	Channel: Channel to read variable from\n"
@@ -1441,10 +1329,10 @@
 			"Uniqueid: %s\r\n"
 			"%s"
 			"\r\n",
-			c->name,
-			S_OR(c->cid.cid_num, "<unknown>"),
-			S_OR(c->cid.cid_num, "<unknown>"),
-			S_OR(c->cid.cid_name, "<unknown>"),
+			c->name, 
+			S_OR(c->cid.cid_num, "<unknown>"), 
+			S_OR(c->cid.cid_num, "<unknown>"), 
+			S_OR(c->cid.cid_name, "<unknown>"), 
 			c->accountcode,
 			ast_state2str(c->_state), c->context,
 			c->exten, c->priority, (long)elapsed_seconds, bridge, c->uniqueid, idText);
@@ -1462,10 +1350,10 @@
 			"Uniqueid: %s\r\n"
 			"%s"
 			"\r\n",
-			c->name,
-			S_OR(c->cid.cid_num, "<unknown>"),
-			S_OR(c->cid.cid_num, "<unknown>"),
-			S_OR(c->cid.cid_name, "<unknown>"),
+			c->name, 
+			S_OR(c->cid.cid_num, "<unknown>"), 
+			S_OR(c->cid.cid_num, "<unknown>"), 
+			S_OR(c->cid.cid_name, "<unknown>"), 
 			c->accountcode,
 			ast_state2str(c->_state), bridge, c->uniqueid, idText);
 		}
@@ -1481,7 +1369,7 @@
 	return 0;
 }
 
-static char mandescr_redirect[] =
+static char mandescr_redirect[] = 
 "Description: Redirect (transfer) a call.\n"
 "Variables: (Names marked with * are required)\n"
 "	*Channel: Channel to redirect\n"
@@ -1545,7 +1433,7 @@
 	return 0;
 }
 
-static char mandescr_command[] =
+static char mandescr_command[] = 
 "Description: Run a CLI command.\n"
 "Variables: (Names marked with * are required)\n"
 "	*Command: Asterisk CLI command to run\n"
@@ -1573,17 +1461,17 @@
 	struct ast_channel *chan = NULL;
 
 	if (!ast_strlen_zero(in->app)) {
-		res = ast_pbx_outgoing_app(in->tech, AST_FORMAT_SLINEAR, in->data, in->timeout, in->app, in->appdata, &reason, 1,
-			S_OR(in->cid_num, NULL),
+		res = ast_pbx_outgoing_app(in->tech, AST_FORMAT_SLINEAR, in->data, in->timeout, in->app, in->appdata, &reason, 1, 
+			S_OR(in->cid_num, NULL), 
 			S_OR(in->cid_name, NULL),
 			in->vars, in->account, &chan);
 	} else {
-		res = ast_pbx_outgoing_exten(in->tech, AST_FORMAT_SLINEAR, in->data, in->timeout, in->context, in->exten, in->priority, &reason, 1,
-			S_OR(in->cid_num, NULL),
+		res = ast_pbx_outgoing_exten(in->tech, AST_FORMAT_SLINEAR, in->data, in->timeout, in->context, in->exten, in->priority, &reason, 1, 
+			S_OR(in->cid_num, NULL), 
 			S_OR(in->cid_name, NULL),
 			in->vars, in->account, &chan);
-	}
-
+	}   
+	
 	/* Tell the manager what happened with the channel */
 	manager_event(EVENT_FLAG_CALL,
 		res ? "OriginateFailure" : "OriginateSuccess",
@@ -1596,7 +1484,7 @@
 		"CallerID: %s\r\n"		/* This parameter is deprecated and will be removed post-1.4 */
 		"CallerIDNum: %s\r\n"
 		"CallerIDName: %s\r\n",
-		in->idtext, in->tech, in->data, in->context, in->exten, reason,
+		in->idtext, in->tech, in->data, in->context, in->exten, reason, 
 		chan ? chan->uniqueid : "<null>",
 		S_OR(in->cid_num, "<unknown>"),
 		S_OR(in->cid_num, "<unknown>"),
@@ -1610,7 +1498,7 @@
 	return NULL;
 }
 
-static char mandescr_originate[] =
+static char mandescr_originate[] = 
 "Description: Generates an outgoing call to a Extension/Context/Priority or\n"
 "  Application/Data\n"
 "Variables: (Names marked with * are required)\n"
@@ -1648,7 +1536,7 @@
 	int reason = 0;
 	char tmp[256];
 	char tmp2[256];
-
+	
 	pthread_t th;
 	pthread_attr_t attr;
 	if (!name) {
@@ -1699,7 +1587,7 @@
 				ast_copy_string(fast->cid_num, l, sizeof(fast->cid_num));
 			if (n)
 				ast_copy_string(fast->cid_name, n, sizeof(fast->cid_name));
-			fast->vars = vars;
+			fast->vars = vars;	
 			ast_copy_string(fast->context, context, sizeof(fast->context));
 			ast_copy_string(fast->exten, exten, sizeof(fast->exten));
 			ast_copy_string(fast->account, account, sizeof(fast->account));
@@ -1722,7 +1610,7 @@
 			astman_send_error(s, m, "Originate with 'Exten' requires 'Context' and 'Priority'");
 			return 0;
 		}
-	}
+	}   
 	if (!res)
 		astman_send_ack(s, m, "Originate successfully queued");
 	else
@@ -1732,7 +1620,7 @@
 
 /*! \brief Help text for manager command mailboxstatus
  */
-static char mandescr_mailboxstatus[] =
+static char mandescr_mailboxstatus[] = 
 "Description: Checks a voicemail account for status.\n"
 "Variables: (Names marked with * are required)\n"
 "	*Mailbox: Full mailbox ID <mailbox>@<vm-context>\n"
@@ -1764,7 +1652,7 @@
 	return 0;
 }
 
-static char mandescr_mailboxcount[] =
+static char mandescr_mailboxcount[] = 
 "Description: Checks a voicemail account for new messages.\n"
 "Variables: (Names marked with * are required)\n"
 "	*Mailbox: Full mailbox ID <mailbox>@<vm-context>\n"
@@ -1794,13 +1682,13 @@
 				   "Message: Mailbox Message Count\r\n"
 				   "Mailbox: %s\r\n"
 		 		   "NewMessages: %d\r\n"
-				   "OldMessages: %d\r\n"
+				   "OldMessages: %d\r\n" 
 				   "\r\n",
 				    idText,mailbox, newmsgs, oldmsgs);
 	return 0;
 }
 
-static char mandescr_extensionstate[] =
+static char mandescr_extensionstate[] = 
 "Description: Report the extension state for given extension.\n"
 "  If the extension has a hint, will use devicestate to check\n"
 "  the status of the device connected to the extension.\n"
@@ -1841,7 +1729,7 @@
 	return 0;
 }
 
-static char mandescr_timeout[] =
+static char mandescr_timeout[] = 
 "Description: Hangup a channel after a certain time.\n"
 "Variables: (Names marked with * are required)\n"
 "	*Channel: Channel name to hangup\n"
@@ -1981,7 +1869,7 @@
 		ast_mutex_lock(&s->__lock);
 		s->busy++;
 		ast_mutex_unlock(&s->__lock);
-		while (tmp) {
+		while (tmp) { 		
 			if (!strcasecmp(action, tmp->action)) {
 				if ((s->writeperm & tmp->authority) == tmp->authority) {
 					if (tmp->func(s, m))
@@ -2018,7 +1906,7 @@
 			s->inlen -= (x + 1);
 			return 1;
 		}
-	}
+	} 
 	if (s->inlen >= sizeof(s->inbuf) - 1) {
 		ast_log(LOG_WARNING, "Dumping long line with no return from %s: %s\n", ast_inet_ntoa(s->sin.sin_addr), s->inbuf);
 		s->inlen = 0;
@@ -2062,7 +1950,7 @@
 	struct mansession *s = data;
 	struct message m;
 	int res;
-
+	
 	ast_mutex_lock(&s->__lock);
 	astman_append(s, "Asterisk Call Manager/1.0\r\n");
 	ast_mutex_unlock(&s->__lock);
@@ -2089,7 +1977,7 @@
 	}
 	if (s->authenticated) {
 		if (option_verbose > 1) {
-			if (displayconnects)
+			if (displayconnects) 
 				ast_verbose(VERBOSE_PREFIX_2 "Manager '%s' logged off from %s\n", s->username, ast_inet_ntoa(s->sin.sin_addr));
 		}
 		ast_log(LOG_EVENT, "Manager '%s' logged off from %s\n", s->username, ast_inet_ntoa(s->sin.sin_addr));
@@ -2132,7 +2020,7 @@
 						s->username, ast_inet_ntoa(s->sin.sin_addr));
 				}
 				free_session(s);
-				break;
+				break;	
 			}
 		}
 		AST_LIST_TRAVERSE_SAFE_END
@@ -2170,7 +2058,7 @@
 			continue;
 
 		ast_atomic_fetchadd_int(&num_sessions, 1);
-
+		
 		memcpy(&s->sin, &sin, sizeof(sin));
 		s->writetimeout = 100;
 		s->waiting_thread = AST_PTHREADT_NULL;
@@ -2210,18 +2098,18 @@
 	tmp->next = NULL;
 	tmp->category = category;
 	strcpy(tmp->eventdata, str);
-
+	
 	if (master_eventq) {
 		prev = master_eventq;
-		while (prev->next)
+		while (prev->next) 
 			prev = prev->next;
 		prev->next = tmp;
 	} else {
 		master_eventq = tmp;
 	}
-
+	
 	tmp->usecount = num_sessions;
-
+	
 	return 0;
 }
 
@@ -2255,11 +2143,11 @@
 	va_start(ap, fmt);
 	ast_dynamic_str_thread_append_va(&buf, 0, &manager_event_buf, fmt, ap);
 	va_end(ap);
-
-	ast_dynamic_str_thread_append(&buf, 0, &manager_event_buf, "\r\n");
-
+	
+	ast_dynamic_str_thread_append(&buf, 0, &manager_event_buf, "\r\n");	
+	
 	append_event(buf->str, category);
-
+	
 	/* Append even to master list and wake up any sleeping sessions */
 	AST_LIST_LOCK(&sessions);
 	AST_LIST_TRAVERSE(&sessions, s, list) {
@@ -2273,7 +2161,7 @@
 	return 0;
 }
 
-int ast_manager_unregister(char *action)
+int ast_manager_unregister(char *action) 
 {
 	struct manager_action *cur = first_action, *prev = first_action;
 
@@ -2282,7 +2170,7 @@
 		if (!strcasecmp(action, cur->action)) {
 			prev->next = cur->next;
 			free(cur);
-			if (option_verbose > 1)
+			if (option_verbose > 1) 
 				ast_verbose(VERBOSE_PREFIX_2 "Manager unregistered action %s\n", action);
 			ast_mutex_unlock(&actionlock);
 			return 0;
@@ -2324,10 +2212,10 @@
 			}
 			break;
 		}
-		prev = cur;
+		prev = cur; 
 		cur = cur->next;
 	}
-
+	
 	if (!cur) {
 		if (prev)
 			prev->next = act;
@@ -2336,13 +2224,13 @@
 		act->next = NULL;
 	}
 
-	if (option_verbose > 1)
+	if (option_verbose > 1) 
 		ast_verbose(VERBOSE_PREFIX_2 "Manager registered action %s\n", act->action);
 	ast_mutex_unlock(&actionlock);
 	return 0;
 }
 
-/*! \brief register a new command with manager, including online help. This is
+/*! \brief register a new command with manager, including online help. This is 
 	the preferred way to register a manager command */
 int ast_manager_register2(const char *action, int auth, int (*func)(struct mansession *s, struct message *m), const char *synopsis, const char *description)
 {
@@ -2351,7 +2239,7 @@
 	cur = ast_malloc(sizeof(*cur));
 	if (!cur)
 		return -1;
-
+	
 	cur->action = action;
 	cur->authority = auth;
 	cur->func = func;
@@ -2422,7 +2310,7 @@
 			break;
 		}
 	}
-
+	
 	if (!(s = find_session(ident))) {
 		/* Create new session */
 		if (!(s = ast_calloc(1, sizeof(*s)))) {
@@ -2455,7 +2343,7 @@
 	else
 		s->sessiontimeout += httptimeout;
 	ast_mutex_unlock(&s->__lock);
-
+	
 	memset(&m, 0, sizeof(m));
 	if (s) {
 		char tmp[80];
@@ -2474,8 +2362,8 @@
 		if (process_message(s, &m)) {
 			if (s->authenticated) {
 				if (option_verbose > 1) {
-					if (displayconnects)
-						ast_verbose(VERBOSE_PREFIX_2 "HTTP Manager '%s' logged off from %s\n", s->username, ast_inet_ntoa(s->sin.sin_addr));
+					if (displayconnects) 
+						ast_verbose(VERBOSE_PREFIX_2 "HTTP Manager '%s' logged off from %s\n", s->username, ast_inet_ntoa(s->sin.sin_addr));    
 				}
 				ast_log(LOG_EVENT, "HTTP Manager '%s' logged off from %s\n", s->username, ast_inet_ntoa(s->sin.sin_addr));
 			} else {
@@ -2533,12 +2421,12 @@
 	} else
 		s->inuse--;
 	ast_mutex_unlock(&s->__lock);
-
+	
 	if (blastaway)
 		destroy_session(s);
 generic_callback_out:
 	if (*status != 200)
-		return ast_http_error(500, "Server Error", NULL, "Internal Server Error (out of memory)\n");
+		return ast_http_error(500, "Server Error", NULL, "Internal Server Error (out of memory)\n"); 
 	return retval;
 }
 
@@ -2584,14 +2472,13 @@
 int init_manager(void)
 {
 	struct ast_config *cfg;
-	char *val,*cat;
+	char *val;
 	int oldportno = portno;
 	static struct sockaddr_in ba;
 	int x = 1;
 	int flags;
 	int webenabled = 0;
 	int newhttptimeout = 60;
-	amus = NULL;
 	if (!registered) {
 		/* Register default actions */
 		ast_manager_register2("Ping", 0, action_ping, "Keepalive command", mandescr_ping);
@@ -2614,13 +2501,7 @@
 		ast_manager_register2("UserEvent", EVENT_FLAG_USER, action_userevent, "Send an arbitrary event", mandescr_userevent);
 		ast_manager_register2("WaitEvent", 0, action_waitevent, "Wait for an event to occur", mandescr_waitevent);
 
-		ast_cli_register(&show_mancmd_cli);
-		ast_cli_register(&show_mancmds_cli);
-		ast_cli_register(&show_manconn_cli);
-		ast_cli_register(&show_maneventq_cli);
-		ast_cli_register(&show_managers_cli);
-		ast_cli_register(&show_manager_cli);
-
+		ast_cli_register_multiple(cli_manager, sizeof(cli_manager) / sizeof(struct ast_cli_entry));
 		ast_extension_state_add(NULL, NULL, manager_state_cb, NULL);
 		registered = 1;
 		/* Append placeholder event so master_eventq never runs dry */
@@ -2666,12 +2547,12 @@
 	ba.sin_port = htons(portno);
 
 	if ((val = ast_variable_retrieve(cfg, "general", "bindaddr"))) {
-		if (!inet_aton(val, &ba.sin_addr)) {
+		if (!inet_aton(val, &ba.sin_addr)) { 
 			ast_log(LOG_WARNING, "Invalid address '%s' specified, using 0.0.0.0\n", val);
 			memset(&ba.sin_addr, 0, sizeof(ba.sin_addr));
 		}
 	}
-
+	
 
 	if ((asock > -1) && ((portno != oldportno) || !enabled)) {
 #if 0
@@ -2682,62 +2563,8 @@
 		ast_log(LOG_WARNING, "Unable to change management port / enabled\n");
 #endif
 	}
-
-
-
-		cat = ast_category_browse(cfg, NULL);
-		amus=NULL; /* Resetting the boss */
-		while(cat) {
-			if (!strcasecmp(cat, "general")) {
-				ast_log(LOG_NOTICE, "ignoring the cat general\n");
-				cat = ast_category_browse(cfg, cat);
-				continue;
-			}
-
-			struct ast_manager_user *amu = malloc(sizeof(struct ast_manager_user));
-			memset(amu, 0, sizeof(struct ast_manager_user));
-			struct ast_variable *var;
-			var = ast_variable_browse(cfg, cat);
-
-			while (var) {
-				if (!strcasecmp(var->name, "secret")) {
-					if (amu->secret)
-						free(amu->secret);
-					amu->secret=strdup(var->value);
-				} else if (!strcasecmp(var->name, "deny") ) {
-					if (amu->deny)
-						free(amu->deny);
-					amu->deny=strdup(var->value);
-				} else if (!strcasecmp(var->name, "permit") ) {
-					if (amu->permit)
-						free(amu->permit);
-					amu->permit=strdup(var->value);
-				}  else if (!strcasecmp(var->name, "read") ) {
-					if (amu->read)
-						free(amu->read);
-					amu->read=strdup(var->value);
-				}  else if (!strcasecmp(var->name, "write") ) {
-					if (amu->write)
-						free(amu->write);
-					amu->write=strdup(var->value);
-				}  else if (!strcasecmp(var->name, "displayconnects") ) {
-					amu->displayconnects=ast_true(var->value);
-				} else {
-					ast_log(LOG_DEBUG, "%s is unknown.\n",var->name);
-				}
-				var = var->next;
-			}
-
-			ast_copy_string(amu->username,cat,sizeof(amu->username));
-
-			ast_log(LOG_DEBUG, "Adding %s\n",amu->username);
-			ast_manager_user_add(amu);
-			amu=NULL;
-			cat = ast_category_browse(cfg, cat);
-		}
-
 	ast_config_destroy(cfg);
-
+	
 	if (webenabled && enabled) {
 		if (!webregged) {
 			ast_http_uri_link(&rawmanuri);
@@ -2794,4 +2621,3 @@
 	manager_event(EVENT_FLAG_SYSTEM, "Reload", "Message: Reload Requested\r\n");
 	return init_manager();
 }
-



More information about the asterisk-commits mailing list