[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