diff --git a/CHANGES b/CHANGES index 23995bb149ef80cca0526bed5a3dca2374c0ced7..ad64b4e900a2f6a7479d4c97bd4d77be3f9e1f65 100644 --- a/CHANGES +++ b/CHANGES @@ -182,3 +182,6 @@ Miscellaneous back to the person that did the transfer if the transfer is not successful. See the options "atxferdropcall", "atxferloopdelay", and "atxfercallbackretries" 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. diff --git a/channels/chan_local.c b/channels/chan_local.c index 15a38a693a3d539f14dcd5acd83bdc4a151d3b08..4b3484b4bc6103c18ba9b30034a5727f126d670a 100644 --- a/channels/chan_local.c +++ b/channels/chan_local.c @@ -129,6 +129,7 @@ static int local_devicestate(void *data) char *exten = ast_strdupa(data); char *context = NULL, *opts = NULL; int res; + struct local_pvt *lp; if (!(context = strchr(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) ast_log(LOG_DEBUG, "Checking if extension %s@%s exists (devicestate)\n", exten, context); + res = ast_exists_extension(NULL, context, exten, 1, NULL); if (!res) 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)