[Asterisk-cvs] asterisk cdr.c, 1.23, 1.24 channel.c, 1.140, 1.141 pbx.c, 1.155, 1.156

markster at lists.digium.com markster at lists.digium.com
Sun Oct 3 00:18:11 CDT 2004


Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv7037

Modified Files:
	cdr.c channel.c pbx.c 
Log Message:
Major PBX revamps (including labels, update examples)


Index: cdr.c
===================================================================
RCS file: /usr/cvsroot/asterisk/cdr.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- cdr.c	2 Oct 2004 00:58:31 -0000	1.23
+++ cdr.c	3 Oct 2004 04:19:58 -0000	1.24
@@ -374,7 +374,7 @@
 	return "Unknown";
 }
 
-int ast_cdr_setaccount(struct ast_channel *chan, char *account)
+int ast_cdr_setaccount(struct ast_channel *chan, const char *account)
 {
 	struct ast_cdr *cdr = chan->cdr;
 
@@ -387,7 +387,7 @@
 	return 0;
 }
 
-int ast_cdr_setamaflags(struct ast_channel *chan, char *flag)
+int ast_cdr_setamaflags(struct ast_channel *chan, const char *flag)
 {
 	struct ast_cdr *cdr = chan->cdr;
 	int newflag;
@@ -399,7 +399,7 @@
 	return 0;
 }
 
-int ast_cdr_setuserfield(struct ast_channel *chan, char *userfield)
+int ast_cdr_setuserfield(struct ast_channel *chan, const char *userfield)
 {
 	struct ast_cdr *cdr = chan->cdr;
 
@@ -411,7 +411,7 @@
 	return 0;
 }
 
-int ast_cdr_appenduserfield(struct ast_channel *chan, char *userfield)
+int ast_cdr_appenduserfield(struct ast_channel *chan, const char *userfield)
 {
 	struct ast_cdr *cdr = chan->cdr;
 
@@ -472,7 +472,7 @@
 	return 0;
 }
 
-int ast_cdr_amaflags2int(char *flag)
+int ast_cdr_amaflags2int(const char *flag)
 {
 	if (!strcasecmp(flag, "default"))
 		return 0;

Index: channel.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channel.c,v
retrieving revision 1.140
retrieving revision 1.141
diff -u -d -r1.140 -r1.141
--- channel.c	2 Oct 2004 00:58:31 -0000	1.140
+++ channel.c	3 Oct 2004 04:19:58 -0000	1.141
@@ -65,7 +65,7 @@
 	char type[80];
 	char description[80];
 	int capabilities;
-	struct ast_channel * (*requester)(char *type, int format, void *data);
+	struct ast_channel * (*requester)(const char *type, int format, void *data);
 	int (*devicestate)(void *data);
 	struct chanlist *next;
 } *backends = NULL;
@@ -153,14 +153,14 @@
 	return;
 }
 
-int ast_channel_register(char *type, char *description, int capabilities,
-		struct ast_channel *(*requester)(char *type, int format, void *data))
+int ast_channel_register(const char *type, const char *description, int capabilities,
+		struct ast_channel *(*requester)(const char *type, int format, void *data))
 {
 	return ast_channel_register_ex(type, description, capabilities, requester, NULL);
 }
 
-int ast_channel_register_ex(char *type, char *description, int capabilities,
-		struct ast_channel *(*requester)(char *type, int format, void *data),
+int ast_channel_register_ex(const char *type, const char *description, int capabilities,
+		struct ast_channel *(*requester)(const char *type, int format, void *data),
 		int (*devicestate)(void *data))
 {
 	struct chanlist *chan, *last=NULL;
@@ -760,7 +760,7 @@
 	return res;
 }
 
-void ast_channel_unregister(char *type)
+void ast_channel_unregister(const char *type)
 {
 	struct chanlist *chan, *last=NULL;
 	if (option_debug)
@@ -1750,7 +1750,7 @@
 	return 0;
 }
 
-struct ast_channel *__ast_request_and_dial(char *type, int format, void *data, int timeout, int *outstate, char *cid_num, char *cid_name, struct outgoing_helper *oh)
+struct ast_channel *__ast_request_and_dial(const char *type, int format, void *data, int timeout, int *outstate, const char *cid_num, const char *cid_name, struct outgoing_helper *oh)
 {
 	int state = 0;
 	struct ast_channel *chan;
@@ -1858,12 +1858,12 @@
 	return chan;
 }
 
-struct ast_channel *ast_request_and_dial(char *type, int format, void *data, int timeout, int *outstate, char *cidnum, char *cidname)
+struct ast_channel *ast_request_and_dial(const char *type, int format, void *data, int timeout, int *outstate, const char *cidnum, const char *cidname)
 {
 	return __ast_request_and_dial(type, format, data, timeout, outstate, cidnum, cidname, NULL);
 }
 
-struct ast_channel *ast_request(char *type, int format, void *data)
+struct ast_channel *ast_request(const char *type, int format, void *data)
 {
 	struct chanlist *chan;
 	struct ast_channel *c = NULL;
@@ -2401,7 +2401,7 @@
 	return 0;
 }
 
-void ast_set_callerid(struct ast_channel *chan, char *callerid, char *calleridname, char *ani)
+void ast_set_callerid(struct ast_channel *chan, const char *callerid, const char *calleridname, const char *ani)
 {
 	if (callerid) {
 		if (chan->cid.cid_num)

Index: pbx.c
===================================================================
RCS file: /usr/cvsroot/asterisk/pbx.c,v
retrieving revision 1.155
retrieving revision 1.156
diff -u -d -r1.155 -r1.156
--- pbx.c	2 Oct 2004 00:58:31 -0000	1.155
+++ pbx.c	3 Oct 2004 04:19:58 -0000	1.156
@@ -59,66 +59,70 @@
 
 /* ast_exten: An extension */
 struct ast_exten {
-	char exten[AST_MAX_EXTENSION];		/* Extension name */
+	char *exten;		/* Extension name */
 	int matchcid;				/* Match caller id ? */
-	char cidmatch[AST_MAX_EXTENSION];	/* Caller id to match for this extension */
+	char *cidmatch;	/* Caller id to match for this extension */
 	int priority;				/* Priority */
+	char *label;	/* Label */
 	struct ast_context *parent;		/* An extension */
-	char app[AST_MAX_EXTENSION]; 		/* Application to execute */
+	char *app; 		/* Application to execute */
 	void *data;				/* Data to use */
 	void (*datad)(void *);			/* Data destructor */
 	struct ast_exten *peer;			/* Next higher priority with our extension */
-	char *registrar;			/* Registrar */
+	const char *registrar;			/* Registrar */
 	struct ast_exten *next;			/* Extension with a greater ID */
+	char stuff[0];
 };
 
 /* ast_include: include= support in extensions.conf */
 struct ast_include {
-	char name[AST_MAX_EXTENSION];		
-	char rname[AST_MAX_EXTENSION];		/* Context to include */
-	char *registrar;			/* Registrar */
+	char *name;		
+	char *rname;		/* Context to include */
+	const char *registrar;			/* Registrar */
 	int hastime;				/* If time construct exists */
 	unsigned int monthmask;			/* Mask for month */
 	unsigned int daymask;			/* Mask for date */
 	unsigned int dowmask;			/* Mask for day of week (mon-sun) */
 	unsigned int minmask[24];		/* Mask for minute */
 	struct ast_include *next;		/* Link them together */
+	char stuff[0];
 };
 
 /* ast_sw: Switch statement in extensions.conf */
 struct ast_sw {
-	char name[AST_MAX_EXTENSION];
-	char *registrar;			/* Registrar */
-	char data[AST_MAX_EXTENSION];		/* Data load */
+	char *name;
+	const char *registrar;			/* Registrar */
+	char *data;		/* Data load */
 	struct ast_sw *next;			/* Link them together */
+	char stuff[0];
 };
 
 struct ast_ignorepat {
-	char pattern[AST_MAX_EXTENSION];
-	char *registrar;
+	const char *registrar;
 	struct ast_ignorepat *next;
+	char pattern[0];
 };
 
 /* ast_context: An extension context */
 struct ast_context {
-	char name[AST_MAX_EXTENSION];		/* Name of the context */
 	ast_mutex_t lock; 			/* A lock to prevent multiple threads from clobbering the context */
 	struct ast_exten *root;			/* The root of the list of extensions */
 	struct ast_context *next;		/* Link them together */
 	struct ast_include *includes;		/* Include other contexts */
 	struct ast_ignorepat *ignorepats;	/* Patterns for which to continue playing dialtone */
-	char *registrar;			/* Registrar */
+	const char *registrar;			/* Registrar */
 	struct ast_sw *alts;			/* Alternative switches */
+	char name[0];		/* Name of the context */
 };
 
 
 /* ast_app: An application */
 struct ast_app {
-	char name[AST_MAX_APP];			/* Name of the application */
 	int (*execute)(struct ast_channel *chan, void *data);
-	char *synopsis;				/* Synopsis text for 'show applications' */
-	char *description;			/* Description (help text) for 'show application <name>' */
+	const char *synopsis;			/* Synopsis text for 'show applications' */
+	const char *description;		/* Description (help text) for 'show application <name>' */
 	struct ast_app *next;			/* Next app in list */
+	char name[0];			/* Name of the application */
 };
 
 /* ast_state_cb: An extension state notify */
@@ -488,8 +492,9 @@
 #define HELPER_EXEC 2
 #define HELPER_CANMATCH 3
 #define HELPER_MATCHMORE 4
+#define HELPER_FINDLABEL 5
 
-struct ast_app *pbx_findapp(char *app) 
+struct ast_app *pbx_findapp(const char *app) 
 {
 	struct ast_app *tmp;
 
@@ -507,7 +512,7 @@
 	return tmp;
 }
 
-static struct ast_switch *pbx_findswitch(char *sw)
+static struct ast_switch *pbx_findswitch(const char *sw)
 {
 	struct ast_switch *asw;
 
@@ -639,7 +644,7 @@
 	}\
 }
 
-int ast_extension_match(char *pattern, char *data)
+int ast_extension_match(const char *pattern, const char *data)
 {
 	int match;
 	/* If they're the same return */
@@ -652,7 +657,7 @@
 	return match;
 }
 
-static int extension_close(char *pattern, char *data, int needmore)
+static int extension_close(const char *pattern, const char *data, int needmore)
 {
 	int match;
 	/* If "data" is longer, it can'be a subset of pattern unless
@@ -672,7 +677,7 @@
 		return 0;
 }
 
-struct ast_context *ast_context_find(char *name)
+struct ast_context *ast_context_find(const char *name)
 {
 	struct ast_context *tmp;
 	ast_mutex_lock(&conlock);
@@ -692,9 +697,10 @@
 #define STATUS_NO_CONTEXT   1
 #define STATUS_NO_EXTENSION 2
 #define STATUS_NO_PRIORITY  3
-#define STATUS_SUCCESS	    4
+#define STATUS_NO_LABEL		4
+#define STATUS_SUCCESS	    5
 
-static int matchcid(char *cidpattern, char *callerid)
+static int matchcid(const char *cidpattern, const char *callerid)
 {
 	int failresult;
 	
@@ -713,7 +719,7 @@
 	return ast_extension_match(cidpattern, callerid);
 }
 
-static struct ast_exten *pbx_find_extension(struct ast_channel *chan, char *context, char *exten, int priority, char *callerid, int action, char *incstack[], int *stacklen, int *status, struct ast_switch **swo, char **data)
+static struct ast_exten *pbx_find_extension(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *label, const char *callerid, int action, char *incstack[], int *stacklen, int *status, struct ast_switch **swo, char **data)
 {
 	int x, res;
 	struct ast_context *tmp;
@@ -756,7 +762,14 @@
 							*status = STATUS_NO_PRIORITY;
 						while(e) {
 							/* Match priority */
-							if (e->priority == priority) {
+							if (action == HELPER_FINDLABEL) {
+								if (*status < STATUS_NO_LABEL)
+									*status = STATUS_NO_LABEL;
+							 	if (label && e->label && !strcmp(label, e->label)) {
+									*status = STATUS_SUCCESS;
+									return e;
+								}
+							} else if (e->priority == priority) {
 								*status = STATUS_SUCCESS;
 								return e;
 							}
@@ -793,7 +806,7 @@
 			i = tmp->includes;
 			while(i) {
 				if (include_valid(i)) {
-					if ((e = pbx_find_extension(chan, i->rname, exten, priority, callerid, action, incstack, stacklen, status, swo, data))) 
+					if ((e = pbx_find_extension(chan, i->rname, exten, priority, label, callerid, action, incstack, stacklen, status, swo, data))) 
 						return e;
 					if (*swo) 
 						return NULL;
@@ -1214,7 +1227,7 @@
 	pbx_substitute_variables_helper(c, e->data, passdata, datalen - 1);
 }		                                                
 
-static int pbx_extension_helper(struct ast_channel *c, char *context, char *exten, int priority, char *callerid, int action) 
+static int pbx_extension_helper(struct ast_channel *c, const char *context, const char *exten, int priority, const char *label, const char *callerid, int action) 
 {
 	struct ast_exten *e;
 	struct ast_app *app;
@@ -1237,7 +1250,7 @@
 		else
 			return -1;
 	}
-	e = pbx_find_extension(c, context, exten, priority, callerid, action, incstack, &stacklen, &status, &sw, &data);
+	e = pbx_find_extension(c, context, exten, priority, label, callerid, action, incstack, &stacklen, &status, &sw, &data);
 	if (e) {
 		switch(action) {
 		case HELPER_CANMATCH:
@@ -1246,6 +1259,10 @@
 		case HELPER_EXISTS:
 			ast_mutex_unlock(&conlock);
 			return -1;
+		case HELPER_FINDLABEL:
+			res = e->priority;
+			ast_mutex_unlock(&conlock);
+			return res;
 		case HELPER_MATCHMORE:
 			ast_mutex_unlock(&conlock);
 			return -1;
@@ -1299,6 +1316,9 @@
 		case HELPER_MATCHMORE:
 			ast_mutex_unlock(&conlock);
 			return -1;
+		case HELPER_FINDLABEL:
+			ast_mutex_unlock(&conlock);
+			return -1;
 		case HELPER_SPAWN:
 			newstack++;
 			/* Fall through */
@@ -1330,6 +1350,9 @@
 			if ((action != HELPER_EXISTS) && (action !=  HELPER_CANMATCH) && (action != HELPER_MATCHMORE))
 				ast_log(LOG_NOTICE, "No such priority %d in extension '%s' in context '%s'\n", priority, exten, context);
 			break;
+		case STATUS_NO_LABEL:
+			ast_log(LOG_NOTICE, "No such label '%s' in extension '%s' in context '%s'\n", label, exten, context);
+			break;
 		default:
 			ast_log(LOG_DEBUG, "Shouldn't happen!\n");
 		}
@@ -1342,7 +1365,7 @@
 
 }
 
-static struct ast_exten *ast_hint_extension(struct ast_channel *c, char *context, char *exten)
+static struct ast_exten *ast_hint_extension(struct ast_channel *c, const char *context, const char *exten)
 {
 	struct ast_exten *e;
 	struct ast_switch *sw;
@@ -1355,7 +1378,7 @@
 		ast_log(LOG_WARNING, "Unable to obtain lock\n");
 		return NULL;
 	}
-	e = pbx_find_extension(c, context, exten, PRIORITY_HINT, "", HELPER_EXISTS, incstack, &stacklen, &status, &sw, &data);
+	e = pbx_find_extension(c, context, exten, PRIORITY_HINT, NULL, "", HELPER_EXISTS, incstack, &stacklen, &status, &sw, &data);
 	ast_mutex_unlock(&conlock);	
 	return e;
 }
@@ -1493,7 +1516,7 @@
 	return 1;
 }
 			
-int ast_extension_state_add(char *context, char *exten, 
+int ast_extension_state_add(const char *context, const char *exten, 
 			    ast_state_cb_type callback, void *data)
 {
 	struct ast_hint *list;
@@ -1732,7 +1755,7 @@
 }
 
 
-int ast_get_hint(char *hint, int hintsize, struct ast_channel *c, char *context, char *exten)
+int ast_get_hint(char *hint, int hintsize, struct ast_channel *c, const char *context, const char *exten)
 {
 	struct ast_exten *e;
 	e = ast_hint_extension(c, context, exten);
@@ -1743,24 +1766,29 @@
 	return 0;	
 }
 
-int ast_exists_extension(struct ast_channel *c, char *context, char *exten, int priority, char *callerid) 
+int ast_exists_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid) 
 {
-	return pbx_extension_helper(c, context, exten, priority, callerid, HELPER_EXISTS);
+	return pbx_extension_helper(c, context, exten, priority, NULL, callerid, HELPER_EXISTS);
 }
 
-int ast_canmatch_extension(struct ast_channel *c, char *context, char *exten, int priority, char *callerid)
+int ast_findlabel_extension(struct ast_channel *c, const char *context, const char *exten, const char *label, const char *callerid) 
 {
-	return pbx_extension_helper(c, context, exten, priority, callerid, HELPER_CANMATCH);
+	return pbx_extension_helper(c, context, exten, 0, label, callerid, HELPER_FINDLABEL);
 }
 
-int ast_matchmore_extension(struct ast_channel *c, char *context, char *exten, int priority, char *callerid)
+int ast_canmatch_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
 {
-	return pbx_extension_helper(c, context, exten, priority, callerid, HELPER_MATCHMORE);
+	return pbx_extension_helper(c, context, exten, priority, NULL, callerid, HELPER_CANMATCH);
 }
 
-int ast_spawn_extension(struct ast_channel *c, char *context, char *exten, int priority, char *callerid) 
+int ast_matchmore_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
 {
-	return pbx_extension_helper(c, context, exten, priority, callerid, HELPER_SPAWN);
+	return pbx_extension_helper(c, context, exten, priority, NULL, callerid, HELPER_MATCHMORE);
+}
+
+int ast_spawn_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid) 
+{
+	return pbx_extension_helper(c, context, exten, priority, NULL, callerid, HELPER_SPAWN);
 }
 
 int ast_pbx_run(struct ast_channel *c)
@@ -2012,7 +2040,7 @@
  * structure, leave context list locked and call ast_context_remove_include2
  * which removes include, unlock contexts list and return ...
  */
-int ast_context_remove_include(char *context, char *include, char *registrar)
+int ast_context_remove_include(const char *context, const char *include, const char *registrar)
 {
 	struct ast_context *c;
 
@@ -2048,7 +2076,7 @@
  * This function locks given context, removes include, unlock context and
  * return.
  */
-int ast_context_remove_include2(struct ast_context *con, char *include, char *registrar)
+int ast_context_remove_include2(struct ast_context *con, const char *include, const char *registrar)
 {
 	struct ast_include *i, *pi = NULL;
 
@@ -2084,7 +2112,7 @@
  * structure, leave context list locked and call ast_context_remove_switch2
  * which removes switch, unlock contexts list and return ...
  */
-int ast_context_remove_switch(char *context, char *sw, char *data, char *registrar)
+int ast_context_remove_switch(const char *context, const char *sw, const char *data, const char *registrar)
 {
 	struct ast_context *c;
 
@@ -2120,7 +2148,7 @@
  * This function locks given context, removes switch, unlock context and
  * return.
  */
-int ast_context_remove_switch2(struct ast_context *con, char *sw, char *data, char *registrar)
+int ast_context_remove_switch2(struct ast_context *con, const char *sw, const char *data, const char *registrar)
 {
 	struct ast_sw *i, *pi = NULL;
 
@@ -2156,7 +2184,7 @@
  * call ast_context_remove_extension2, unlock contexts list and return.
  * In this function we are using
  */
-int ast_context_remove_extension(char *context, char *extension, int priority, char *registrar)
+int ast_context_remove_extension(const char *context, const char *extension, int priority, const char *registrar)
 {
 	struct ast_context *c;
 
@@ -2192,7 +2220,7 @@
  * is set to 0, all peers are removed. After that, unlock context and
  * return.
  */
-int ast_context_remove_extension2(struct ast_context *con, char *extension, int priority, char *registrar)
+int ast_context_remove_extension2(struct ast_context *con, const char *extension, int priority, const char *registrar)
 {
 	struct ast_exten *exten, *prev_exten = NULL;
 
@@ -2296,10 +2324,13 @@
 }
 
 
-int ast_register_application(char *app, int (*execute)(struct ast_channel *, void *), char *synopsis, char *description)
+int ast_register_application(const char *app, int (*execute)(struct ast_channel *, void *), const char *synopsis, const char *description)
 {
 	struct ast_app *tmp, *prev, *cur;
 	char tmps[80];
+	int length;
+	length = sizeof(struct ast_app);
+	length += strlen(app) + 1;
 	if (ast_mutex_lock(&applock)) {
 		ast_log(LOG_ERROR, "Unable to lock application list\n");
 		return -1;
@@ -2313,10 +2344,10 @@
 		}
 		tmp = tmp->next;
 	}
-	tmp = malloc(sizeof(struct ast_app));
+	tmp = malloc(length);
 	if (tmp) {
-		memset(tmp, 0, sizeof(struct ast_app));
-		strncpy(tmp->name, app, sizeof(tmp->name)-1);
+		memset(tmp, 0, length);
+		strcpy(tmp->name, app);
 		tmp->execute = execute;
 		tmp->synopsis = synopsis;
 		tmp->description = description;
@@ -2805,7 +2836,9 @@
 					p = ast_walk_extension_priorities(e, e);
 					while (p) {
 						bzero((void *)buf2, sizeof(buf2));
-
+						bzero((void *)buf, sizeof(buf));
+						if (ast_get_extension_label(p))
+							snprintf(buf, sizeof(buf), "   [%s]", ast_get_extension_label(p));
 						snprintf(buf2, sizeof(buf2),
 							"%d. %s(%s)",
 							ast_get_extension_priority(p),
@@ -2813,7 +2846,7 @@
 							(char *)ast_get_extension_app_data(p));
 
 						ast_cli(fd,"  %-17s %-45s [%s]\n",
-							"", buf2,
+							buf, buf2,
 							ast_get_extension_registrar(p));	
 
 						p = ast_walk_extension_priorities(e, p);
@@ -2916,7 +2949,7 @@
 		handle_show_switches, "Show alternative switches",
 		show_switches_help, NULL };
 
-int ast_unregister_application(char *app) {
+int ast_unregister_application(const char *app) {
 	struct ast_app *tmp, *tmpl = NULL;
 	if (ast_mutex_lock(&applock)) {
 		ast_log(LOG_ERROR, "Unable to lock application list\n");
@@ -2942,9 +2975,12 @@
 	return -1;
 }
 
-struct ast_context *ast_context_create(struct ast_context **extcontexts, char *name, char *registrar)
+struct ast_context *ast_context_create(struct ast_context **extcontexts, const char *name, const char *registrar)
 {
 	struct ast_context *tmp, **local_contexts;
+	int length;
+	length = sizeof(struct ast_context);
+	length += strlen(name) + 1;
 	if (!extcontexts) {
 		local_contexts = &contexts;
 		ast_mutex_lock(&conlock);
@@ -2962,11 +2998,11 @@
 		}
 		tmp = tmp->next;
 	}
-	tmp = malloc(sizeof(struct ast_context));
+	tmp = malloc(length);
 	if (tmp) {
-		memset(tmp, 0, sizeof(struct ast_context));
+		memset(tmp, 0, length);
 		ast_mutex_init(&tmp->lock);
-		strncpy(tmp->name, name, sizeof(tmp->name)-1);
+		strcpy(tmp->name, name);
 		tmp->root = NULL;
 		tmp->registrar = registrar;
 		tmp->next = *local_contexts;
@@ -2985,9 +3021,9 @@
 	return tmp;
 }
 
-void __ast_context_destroy(struct ast_context *con, char *registrar);
+void __ast_context_destroy(struct ast_context *con, const char *registrar);
 
-void ast_merge_contexts_and_delete(struct ast_context **extcontexts, char *registrar) {
+void ast_merge_contexts_and_delete(struct ast_context **extcontexts, const char *registrar) {
 	struct ast_context *tmp, *lasttmp = NULL;
 	tmp = *extcontexts;
 	ast_mutex_lock(&conlock);
@@ -3019,7 +3055,7 @@
  *  EBUSY  - can't lock
  *  ENOENT - no existence of context
  */
-int ast_context_add_include(char *context, char *include, char *registrar)
+int ast_context_add_include(const char *context, const char *include, const char *registrar)
 {
 	struct ast_context *c;
 
@@ -3339,24 +3375,33 @@
  *  EEXIST - already included
  *  EINVAL - there is no existence of context for inclusion
  */
-int ast_context_add_include2(struct ast_context *con, char *value,
-	char *registrar)
+int ast_context_add_include2(struct ast_context *con, const char *value,
+	const char *registrar)
 {
 	struct ast_include *new_include;
 	char *c;
 	struct ast_include *i, *il = NULL; /* include, include_last */
+	int length;
+	char *p;
+	
+	length = sizeof(struct ast_include);
+	length += 2 * (strlen(value) + 1);
 
 	/* allocate new include structure ... */
-	if (!(new_include = malloc(sizeof(struct ast_include)))) {
+	if (!(new_include = malloc(length))) {
 		ast_log(LOG_ERROR, "Out of memory\n");
 		errno = ENOMEM;
 		return -1;
 	}
 	
 	/* ... fill in this structure ... */
-	memset(new_include, 0, sizeof(struct ast_include));
-	strncpy(new_include->name, value, sizeof(new_include->name)-1);
-	strncpy(new_include->rname, value, sizeof(new_include->rname)-1);
+	memset(new_include, 0, length);
+	p = new_include->stuff;
+	new_include->name = p;
+	strcpy(new_include->name, value);
+	p += strlen(value) + 1;
+	new_include->rname = p;
+	strcpy(new_include->rname, value);
 	c = new_include->rname;
 	/* Strip off timing info */
 	while(*c && (*c != '|')) c++; 
@@ -3405,7 +3450,7 @@
  *  EBUSY  - can't lock
  *  ENOENT - no existence of context
  */
-int ast_context_add_switch(char *context, char *sw, char *data, char *registrar)
+int ast_context_add_switch(const char *context, const char *sw, const char *data, const char *registrar)
 {
 	struct ast_context *c;
 
@@ -3440,26 +3485,38 @@
  *  EEXIST - already included
  *  EINVAL - there is no existence of context for inclusion
  */
-int ast_context_add_switch2(struct ast_context *con, char *value,
-	char *data, char *registrar)
+int ast_context_add_switch2(struct ast_context *con, const char *value,
+	const char *data, const char *registrar)
 {
 	struct ast_sw *new_sw;
 	struct ast_sw *i, *il = NULL; /* sw, sw_last */
+	int length;
+	char *p;
+	
+	length = sizeof(struct ast_sw);
+	length += strlen(value) + 1;
+	if (data)
+		length += strlen(data);
+	length++;
 
 	/* allocate new sw structure ... */
-	if (!(new_sw = malloc(sizeof(struct ast_sw)))) {
+	if (!(new_sw = malloc(length))) {
 		ast_log(LOG_ERROR, "Out of memory\n");
 		errno = ENOMEM;
 		return -1;
 	}
 	
 	/* ... fill in this structure ... */
-	memset(new_sw, 0, sizeof(struct ast_sw));
-	strncpy(new_sw->name, value, sizeof(new_sw->name)-1);
+	memset(new_sw, 0, length);
+	p = new_sw->stuff;
+	new_sw->name = p;
+	strcpy(new_sw->name, value);
+	p += strlen(value) + 1;
+	new_sw->data = p;
 	if (data)
-		strncpy(new_sw->data, data, sizeof(new_sw->data)-1);
+		strcpy(new_sw->data, data);
 	else
-		strncpy(new_sw->data, "", sizeof(new_sw->data)-1);
+		strcpy(new_sw->data, "");
 	new_sw->next      = NULL;
 	new_sw->registrar = registrar;
 
@@ -3499,7 +3556,7 @@
  * EBUSY  - can't lock
  * ENOENT - there is not context existence
  */
-int ast_context_remove_ignorepat(char *context, char *ignorepat, char *registrar)
+int ast_context_remove_ignorepat(const char *context, const char *ignorepat, const char *registrar)
 {
 	struct ast_context *c;
 
@@ -3523,7 +3580,7 @@
 	return -1;
 }
 
-int ast_context_remove_ignorepat2(struct ast_context *con, char *ignorepat, char *registrar)
+int ast_context_remove_ignorepat2(struct ast_context *con, const char *ignorepat, const char *registrar)
 {
 	struct ast_ignorepat *ip, *ipl = NULL;
 
@@ -3558,7 +3615,7 @@
  * EBUSY - can't lock
  * ENOENT - there is no existence of context
  */
-int ast_context_add_ignorepat(char *con, char *value, char *registrar)
+int ast_context_add_ignorepat(const char *con, const char *value, const char *registrar)
 {
 	struct ast_context *c;
 
@@ -3582,18 +3639,20 @@
 	return -1;
 }
 
-int ast_context_add_ignorepat2(struct ast_context *con, char *value, char *registrar)
+int ast_context_add_ignorepat2(struct ast_context *con, const char *value, const char *registrar)
 {
 	struct ast_ignorepat *ignorepat, *ignorepatc, *ignorepatl = NULL;
-
-	ignorepat = malloc(sizeof(struct ast_ignorepat));
+	int length;
+	length = sizeof(struct ast_ignorepat);
+	length += strlen(value) + 1;
+	ignorepat = malloc(length);
 	if (!ignorepat) {
 		ast_log(LOG_ERROR, "Out of memory\n");
 		errno = ENOMEM;
 		return -1;
 	}
-	memset(ignorepat, 0, sizeof(struct ast_ignorepat));
-	strncpy(ignorepat->pattern, value, sizeof(ignorepat->pattern)-1);
+	memset(ignorepat, 0, length);
+	strcpy(ignorepat->pattern, value);
 	ignorepat->next = NULL;
 	ignorepat->registrar = registrar;
 	ast_mutex_lock(&con->lock);
@@ -3617,7 +3676,7 @@
 	
 }
 
-int ast_ignore_pattern(char *context, char *pattern)
+int ast_ignore_pattern(const char *context, const char *pattern)
 {
 	struct ast_context *con;
 	struct ast_ignorepat *pat;
@@ -3639,8 +3698,8 @@
  * ENOENT  - no existence of context
  *
  */
-int ast_add_extension(char *context, int replace, char *extension, int priority, char *callerid,
-	char *application, void *data, void (*datad)(void *), char *registrar)
+int ast_add_extension(const char *context, int replace, const char *extension, int priority, const char *label, const char *callerid,
+	const char *application, void *data, void (*datad)(void *), const char *registrar)
 {
 	struct ast_context *c;
 
@@ -3652,7 +3711,7 @@
 	c = ast_walk_contexts(NULL);
 	while (c) {
 		if (!strcmp(context, ast_get_context_name(c))) {
-			int ret = ast_add_extension2(c, replace, extension, priority, callerid,
+			int ret = ast_add_extension2(c, replace, extension, priority, label, callerid,
 				application, data, datad, registrar);
 			ast_unlock_contexts();
 			return ret;
@@ -3665,7 +3724,7 @@
 	return -1;
 }
 
-int ast_async_goto(struct ast_channel *chan, char *context, char *exten, int priority)
+int ast_async_goto(struct ast_channel *chan, const char *context, const char *exten, int priority)
 {
 	int res = 0;
 	ast_mutex_lock(&chan->lock);
@@ -3726,7 +3785,7 @@
 	return res;
 }
 
-int ast_async_goto_by_name(char *channame, char *context, char *exten, int priority)
+int ast_async_goto_by_name(const char *channame, const char *context, const char *exten, int priority)
 {
 	struct ast_channel *chan;
 	int res = -1;
@@ -3746,7 +3805,7 @@
 	return res;
 }
 
-static void ext_strncpy(char *dst, char *src, int len)
+static void ext_strncpy(char *dst, const char *src, int len)
 {
 	int count=0;
 
@@ -3773,9 +3832,9 @@
  *
  */
 int ast_add_extension2(struct ast_context *con,
-					  int replace, char *extension, int priority, char *callerid,
-					  char *application, void *data, void (*datad)(void *),
-					  char *registrar)
+					  int replace, const char *extension, int priority, const char *label, const char *callerid,
+					  const char *application, void *data, void (*datad)(void *),
+					  const char *registrar)
 {
 
 #define LOG do { 	if (option_debug) {\
@@ -3800,21 +3859,44 @@
 	 */
 	struct ast_exten *tmp, *e, *el = NULL, *ep = NULL;
 	int res;
+	int length;
+	char *p;
+	length = sizeof(struct ast_exten);
+	length += strlen(extension) + 1;
+	length += strlen(application) + 1;
+	if (label)
+		length += strlen(label) + 1;
+	if (callerid)
+		length += strlen(callerid) + 1;
+	else
+		length ++;
 
 	/* Be optimistic:  Build the extension structure first */
-	tmp = malloc(sizeof(struct ast_exten));
+	tmp = malloc(length);
 	if (tmp) {
-		memset(tmp, 0, sizeof(struct ast_exten));
-		ext_strncpy(tmp->exten, extension, sizeof(tmp->exten));
+		memset(tmp, 0, length);
+		p = tmp->stuff;
+		if (label) {
+			tmp->label = p;
+			strcpy(tmp->label, label);
+			p += strlen(label) + 1;
+		}
+		tmp->exten = p;
+		ext_strncpy(tmp->exten, extension, strlen(extension) + 1);
+		p += strlen(extension) + 1;
 		tmp->priority = priority;
+		tmp->cidmatch = p;
 		if (callerid) {
-			ext_strncpy(tmp->cidmatch, callerid, sizeof(tmp->cidmatch));
+			ext_strncpy(tmp->cidmatch, callerid, strlen(callerid) + 1);
+			p += strlen(callerid) + 1;
 			tmp->matchcid = 1;
 		} else {
 			tmp->cidmatch[0] = '\0';
 			tmp->matchcid = 0;
+			p++;
 		}
-		strncpy(tmp->app, application, sizeof(tmp->app)-1);
+		tmp->app = p;
+		strcpy(tmp->app, application);
 		tmp->parent = con;
 		tmp->data = data;
 		tmp->datad = datad;
@@ -4039,7 +4121,7 @@
 	return NULL;
 }
 
-int ast_pbx_outgoing_exten(char *type, int format, void *data, int timeout, char *context, char *exten, int priority, int *reason, int sync, char *cid_num, char *cid_name, char *variable, char *account)
+int ast_pbx_outgoing_exten(const char *type, int format, void *data, int timeout, const char *context, const char *exten, int priority, int *reason, int sync, const char *cid_num, const char *cid_name, const char *variable, const char *account)
 {
 	struct ast_channel *chan;
 	struct async_stat *as;
@@ -4052,7 +4134,8 @@
 		LOAD_OH(oh);
 		chan = __ast_request_and_dial(type, format, data, timeout, reason, cid_num, cid_name, &oh);
 		if (chan) {
-			pbx_builtin_setaccount(chan, account);
+			if (account)
+				ast_cdr_setaccount(chan, account);
 			if (chan->_state == AST_STATE_UP) {
 					res = 0;
 				if (option_verbose > 3)
@@ -4110,7 +4193,8 @@
 			free(as);
 			return -1;
 		}
-		pbx_builtin_setaccount(chan, account);
+		if (account)
+			ast_cdr_setaccount(chan, account);
 		as->chan = chan;
 		strncpy(as->context, context, sizeof(as->context) - 1);
 		strncpy(as->exten,  exten, sizeof(as->exten) - 1);
@@ -4157,7 +4241,7 @@
 	return NULL;
 }
 
-int ast_pbx_outgoing_app(char *type, int format, void *data, int timeout, char *app, char *appdata, int *reason, int sync, char *cid_num, char *cid_name, char *variable, char *account)
+int ast_pbx_outgoing_app(const char *type, int format, void *data, int timeout, const char *app, const char *appdata, int *reason, int sync, const char *cid_num, const char *cid_name, const char *variable, const char *account)
 {
 	struct ast_channel *chan;
 	struct async_stat *as;
@@ -4171,7 +4255,8 @@
 	if (sync) {
 		chan = ast_request_and_dial(type, format, data, timeout, reason, cid_num, cid_name);
 		if (chan) {
-			pbx_builtin_setaccount(chan, account);
+			if (account)
+				ast_cdr_setaccount(chan, account);
 			if (variable) {
 				vartmp = ast_strdupa(variable);
 				for (var = strtok_r(vartmp, "|", &vartmp); var; var = strtok_r(NULL, "|", &vartmp)) {
@@ -4220,7 +4305,8 @@
 			free(as);
 			return -1;
 		}
-		pbx_builtin_setaccount(chan, account);
+		if (account)
+			ast_cdr_setaccount(chan, account);
 		as->chan = chan;
 		strncpy(as->app, app, sizeof(as->app) - 1);
 		if (appdata)
@@ -4255,7 +4341,7 @@
 	free(e);
 }
 
-void __ast_context_destroy(struct ast_context *con, char *registrar)
+void __ast_context_destroy(struct ast_context *con, const char *registrar)
 {
 	struct ast_context *tmp, *tmpl=NULL;
 	struct ast_include *tmpi, *tmpil= NULL;
@@ -4328,7 +4414,7 @@
 	ast_mutex_unlock(&conlock);
 }
 
-void ast_context_destroy(struct ast_context *con, char *registrar)
+void ast_context_destroy(struct ast_context *con, const char *registrar)
 {
 	__ast_context_destroy(con,registrar);
 }
@@ -4615,6 +4701,7 @@
 	char *s;
 	char *exten, *pri, *context;
 	char *stringp=NULL;
+	int ipri;
 
 	if (!data || ast_strlen_zero(data)) {
 		ast_log(LOG_WARNING, "Goto requires an argument (optional context|optional extension|priority)\n");
@@ -4638,12 +4725,15 @@
 			context = NULL;
 		}
 	}
-	if (atoi(pri) < 0) {
-		ast_log(LOG_WARNING, "Priority '%s' must be a number > 0\n", pri);
-		return -1;
-	}
+	if (sscanf(pri, "%i", &ipri) != 1) {
+		if ((ipri = ast_findlabel_extension(chan, context ? context : chan->context, (exten && strcasecmp(exten, "BYEXTENSION")) ? exten : chan->exten, 
+			pri, chan->cid.cid_num)) < 1) {
+			ast_log(LOG_WARNING, "Priority '%s' must be a number > 0, or valid label\n", pri);
+			return -1;
+		}
+	} 
 	/* At this point we have a priority and maybe an extension and a context */
-	chan->priority = atoi(pri) - 1;
+	chan->priority = ipri - 1;
 	if (exten && strcasecmp(exten, "BYEXTENSION"))
 		strncpy(chan->exten, exten, sizeof(chan->exten)-1);
 	if (context)
@@ -4907,22 +4997,27 @@
 /*
  * Name functions ...
  */
-char *ast_get_context_name(struct ast_context *con)
+const char *ast_get_context_name(struct ast_context *con)
 {
 	return con ? con->name : NULL;
 }
 
-char *ast_get_extension_name(struct ast_exten *exten)
+const char *ast_get_extension_name(struct ast_exten *exten)
 {
 	return exten ? exten->exten : NULL;
 }
 
-char *ast_get_include_name(struct ast_include *inc)
+const char *ast_get_extension_label(struct ast_exten *exten)
+{
+	return exten ? exten->label : NULL;
+}
+
+const char *ast_get_include_name(struct ast_include *inc)
 {
 	return inc ? inc->name : NULL;
 }
 
-char *ast_get_ignorepat_name(struct ast_ignorepat *ip)
+const char *ast_get_ignorepat_name(struct ast_ignorepat *ip)
 {
 	return ip ? ip->pattern : NULL;
 }
@@ -4935,22 +5030,22 @@
 /*
  * Registrar info functions ...
  */
-char *ast_get_context_registrar(struct ast_context *c)
+const char *ast_get_context_registrar(struct ast_context *c)
 {
 	return c ? c->registrar : NULL;
 }
 
-char *ast_get_extension_registrar(struct ast_exten *e)
+const char *ast_get_extension_registrar(struct ast_exten *e)
 {
 	return e ? e->registrar : NULL;
 }
 
-char *ast_get_include_registrar(struct ast_include *i)
+const char *ast_get_include_registrar(struct ast_include *i)
 {
 	return i ? i->registrar : NULL;
 }
 
-char *ast_get_ignorepat_registrar(struct ast_ignorepat *ip)
+const char *ast_get_ignorepat_registrar(struct ast_ignorepat *ip)
 {
 	return ip ? ip->registrar : NULL;
 }
@@ -4960,12 +5055,12 @@
 	return e ? e->matchcid : 0;
 }
 
-char *ast_get_extension_cidmatch(struct ast_exten *e)
+const char *ast_get_extension_cidmatch(struct ast_exten *e)
 {
 	return e ? e->cidmatch : NULL;
 }
 
-char *ast_get_extension_app(struct ast_exten *e)
+const char *ast_get_extension_app(struct ast_exten *e)
 {
 	return e ? e->app : NULL;
 }
@@ -4975,17 +5070,17 @@
 	return e ? e->data : NULL;
 }
 
-char *ast_get_switch_name(struct ast_sw *sw)
+const char *ast_get_switch_name(struct ast_sw *sw)
 {
 	return sw ? sw->name : NULL;
 }
 
-char *ast_get_switch_data(struct ast_sw *sw)
+const char *ast_get_switch_data(struct ast_sw *sw)
 {
 	return sw ? sw->data : NULL;
 }
 
-char *ast_get_switch_registrar(struct ast_sw *sw)
+const char *ast_get_switch_registrar(struct ast_sw *sw)
 {
 	return sw ? sw->registrar : NULL;
 }




More information about the svn-commits mailing list