mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-16 14:58:25 +00:00
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
This commit is contained in:
3
CHANGES
3
CHANGES
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user