Index: asterisk/apps/app_system.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_system.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 app_system.c
--- asterisk/apps/app_system.c	12 Feb 2003 13:59:14 -0000	1.1.1.1
+++ asterisk/apps/app_system.c	13 Oct 2003 16:29:43 -0000
@@ -15,8 +15,10 @@
 #include <asterisk/file.h>
 #include <asterisk/logger.h>
 #include <asterisk/channel.h>
+#include <asterisk/config.h>
 #include <asterisk/pbx.h>
 #include <asterisk/module.h>
+#include <asterisk/cli.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
@@ -60,7 +62,9 @@
 		ast_log(LOG_WARNING, "Unable to execute '%s'\n", (char *)data);
 		res = -1;
 	} else {
-		if (res && ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->callerid)) 
+		if (res && 
+		( chan != NULL ) &&
+		ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->callerid)) 
 			chan->priority+=100;
 		res = 0;
 	}
@@ -68,15 +72,138 @@
 	return res;
 }
 
+// [PHM 10/13/03]
+
+#define	MAX_ALLOWED_COMMANDS	20
+
+static char *config = "system.conf";
+static char * command_list[MAX_ALLOWED_COMMANDS] ;
+
+
+static void 
+	read_allowed_commands( void )
+{
+	int i = 0 ;
+        struct ast_config *cfg;
+        struct ast_variable *v;
+
+        cfg = ast_load(config);
+
+	if( cfg != NULL )
+	{
+ 	       	v = ast_variable_browse(cfg, "allowed_commands");
+		while(v) 
+		{
+                	if (!strcasecmp(v->name, "command")) 
+			{
+				command_list[ i ] = malloc( strlen( v->value ) + 1 ) ;
+                        	strcpy( command_list[ i ], v->value);
+				i++ ;
+			}
+		
+			if( i == MAX_ALLOWED_COMMANDS )
+				break ;
+			else
+				v = v->next;
+   		}
+
+	        ast_destroy(cfg);
+	}
+}
+
+
+static void
+	free_allowed_commands( void )
+{
+	int i ;
+
+	for( i = 0 ; i < MAX_ALLOWED_COMMANDS ; i++ )
+		if( command_list[ i ] != NULL )
+		{
+			free( command_list[ i ] ) ;
+			command_list[ i ] = NULL ;
+		}
+}
+		
+
+static int
+	allowed( char * command )
+{
+	int i, ret = 0 ;
+
+	for( i = 0 ; ( i < MAX_ALLOWED_COMMANDS ) && (command_list[ i ] != NULL ); i++ )
+		if( strncasecmp( command_list[i], command, strlen(command) ) == 0 )
+		{
+			ret = 1 ;
+			break ;
+		}
+
+	return( ret ) ;
+}
+
+
+
+// [PHM 10/11/03]
+
+static int exec_system_cli(int fd, int argc, char **argv)
+{
+	int i ;
+        char buf[128];
+
+        if (argc < 2)
+                return RESULT_SHOWUSAGE;
+
+	if( allowed( argv[1] ) )
+	{
+        	strcpy( buf, argv[1]) ;
+
+		for( i = 2 ; argv[ i ] != NULL ; i++ )
+		{
+        		strcat( buf, " ") ;
+	        	strcat( buf, argv[i]) ;
+		}
+
+		ast_log(LOG_DEBUG, "System:  '%s'\n", buf );
+	
+        	if( skel_exec( NULL, buf) == 0 )
+                	return RESULT_SUCCESS;
+	        else
+        	        return RESULT_SHOWUSAGE;
+	}
+	else
+	{
+		ast_log(LOG_DEBUG, "System: command '%s' not allowed!\n", argv[1] );
+       	        return RESULT_SHOWUSAGE;
+	}
+}
+
+static char show_system_usage[] =
+"Usage: system <command> [params ...]\n"
+"       Execute system() command.\n";
+
+
+static struct ast_cli_entry cli_system = {
+        { "system", NULL, NULL }, exec_system_cli,
+        "Execute System() command", show_system_usage, NULL };
+
+
 int unload_module(void)
 {
 	STANDARD_HANGUP_LOCALUSERS;
+
+	//[PHM 11/10/03]
+        ast_cli_unregister(&cli_system);
+	free_allowed_commands() ;
 	return ast_unregister_application(app);
 }
 
 int load_module(void)
 {
-	return ast_register_application(app, skel_exec, synopsis, descrip);
+	//[PHM 11/10/03]
+        ast_cli_register(&cli_system);
+	read_allowed_commands() ;
+
+  	return ast_register_application(app, skel_exec, synopsis, descrip);
 }
 
 char *description(void)
