Update the device state functionality of chan_local such that it will return

NOT_INUSE or INUSE when Local channels are in use as opposed to just UNKNOWN.
It will still return INVALID if the extension doesn't exist at all.
(issue #8048, patch from tim_ringenbach)


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@62673 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.6.0
Russell Bryant 19 years ago
parent 0dc5766279
commit 3d409eb793

@ -182,3 +182,6 @@ Miscellaneous
back to the person that did the transfer if the transfer is not successful. back to the person that did the transfer if the transfer is not successful.
See the options "atxferdropcall", "atxferloopdelay", and "atxfercallbackretries" See the options "atxferdropcall", "atxferloopdelay", and "atxfercallbackretries"
in features.conf.sample. in features.conf.sample.
* The device state functionality in the Local channel driver has been updated
to indicate INUSE or NOT_INUSE when a Local channel is being used as opposed
to just UNKNOWN if the extension exists.

@ -129,6 +129,7 @@ static int local_devicestate(void *data)
char *exten = ast_strdupa(data); char *exten = ast_strdupa(data);
char *context = NULL, *opts = NULL; char *context = NULL, *opts = NULL;
int res; int res;
struct local_pvt *lp;
if (!(context = strchr(exten, '@'))) { if (!(context = strchr(exten, '@'))) {
ast_log(LOG_WARNING, "Someone used Local/%s somewhere without a @context. This is bad.\n", exten); ast_log(LOG_WARNING, "Someone used Local/%s somewhere without a @context. This is bad.\n", exten);
@ -143,11 +144,22 @@ static int local_devicestate(void *data)
if (option_debug > 2) if (option_debug > 2)
ast_log(LOG_DEBUG, "Checking if extension %s@%s exists (devicestate)\n", exten, context); ast_log(LOG_DEBUG, "Checking if extension %s@%s exists (devicestate)\n", exten, context);
res = ast_exists_extension(NULL, context, exten, 1, NULL); res = ast_exists_extension(NULL, context, exten, 1, NULL);
if (!res) if (!res)
return AST_DEVICE_INVALID; return AST_DEVICE_INVALID;
else
return AST_DEVICE_UNKNOWN; res = AST_DEVICE_NOT_INUSE;
AST_LIST_LOCK(&locals);
AST_LIST_TRAVERSE(&locals, lp, list) {
if (!strcmp(exten, lp->exten) && !strcmp(context, lp->context) && lp->owner) {
res = AST_DEVICE_INUSE;
break;
}
}
AST_LIST_UNLOCK(&locals);
return res;
} }
static int local_queue_frame(struct local_pvt *p, int isoutbound, struct ast_frame *f, struct ast_channel *us) static int local_queue_frame(struct local_pvt *p, int isoutbound, struct ast_frame *f, struct ast_channel *us)

Loading…
Cancel
Save