[asterisk-commits] file: trunk r42311 - /trunk/channels/chan_local.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Thu Sep 7 12:50:59 MST 2006
Author: file
Date: Thu Sep 7 14:50:59 2006
New Revision: 42311
URL: http://svn.digium.com/view/asterisk?rev=42311&view=rev
Log:
Code cleaning/updates/potential bug fixes
Modified:
trunk/channels/chan_local.c
Modified: trunk/channels/chan_local.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_local.c?rev=42311&r1=42310&r2=42311&view=diff
==============================================================================
--- trunk/channels/chan_local.c (original)
+++ trunk/channels/chan_local.c Thu Sep 7 14:50:59 2006
@@ -124,42 +124,35 @@
/*! \brief Adds devicestate to local channels */
static int local_devicestate(void *data)
{
- char *exten;
- char *context;
-
+ char *exten = ast_strdupa(data);
+ char *context = NULL;
int res;
-
- exten = ast_strdupa(data);
- context = strchr(exten, '@');
-
- if (!context) {
+
+ if (!(context = strchr(exten, '@'))) {
ast_log(LOG_WARNING, "Someone used Local/%s somewhere without a @context. This is bad.\n", exten);
return AST_DEVICE_INVALID;
}
- *context = '\0';
- context = context + 1;
+ *context++ = '\0';
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) {
-
+ if (!res)
return AST_DEVICE_INVALID;
- } else
+ else
return AST_DEVICE_UNKNOWN;
}
static int local_queue_frame(struct local_pvt *p, int isoutbound, struct ast_frame *f, struct ast_channel *us)
{
- struct ast_channel *other;
+ struct ast_channel *other = NULL;
+
retrylock:
+
/* Recalculate outbound channel */
- if (isoutbound) {
- other = p->owner;
- } else {
- other = p->chan;
- }
+ other = isoutbound ? p->owner : p->chan;
+
/* Set glare detection */
p->glaredetect = 1;
if (p->cancelqueue) {
@@ -218,9 +211,7 @@
static void check_bridge(struct local_pvt *p, int isoutbound)
{
- if (p->alreadymasqed || p->nooptimization)
- return;
- if (!p->chan || !p->owner)
+ if (p->alreadymasqed || p->nooptimization || !p->chan || !p->owner)
return;
/* only do the masquerade if we are being called on the outbound channel,
@@ -324,6 +315,8 @@
ast_mutex_lock(&p->lock);
isoutbound = IS_OUTBOUND(ast, p);
f.subclass = condition;
+ f.data = (void*)data;
+ f.datalen = datalen;
res = local_queue_frame(p, isoutbound, &f, ast);
ast_mutex_unlock(&p->lock);
return res;
@@ -433,27 +426,6 @@
ast_mutex_unlock(&p->lock);
return res;
}
-
-#if 0
-static void local_destroy(struct local_pvt *p)
-{
- struct local_pvt *cur;
-
- AST_LIST_LOCK(&locals);
- AST_LIST_TRAVERSE_SAFE_BEGIN(&locals, cur, list) {
- if (cur == p) {
- AST_LIST_REMOVE_CURRENT(&locals, list);
- ast_mutex_destroy(&cur->lock);
- free(cur);
- break;
- }
- }
- AST_LIST_TRAVERSE_SAFE_END
- AST_LIST_UNLOCK(&locals);
- if (!cur)
- ast_log(LOG_WARNING, "Unable ot find local '%s@%s' in local list\n", p->exten, p->context);
-}
-#endif
/*! \brief Hangup a call through the local proxy channel */
static int local_hangup(struct ast_channel *ast)
@@ -516,26 +488,31 @@
/*! \brief Create a call structure */
static struct local_pvt *local_alloc(const char *data, int format)
{
- struct local_pvt *tmp;
- char *c;
- char *opts;
+ struct local_pvt *tmp = NULL;
+ char *c = NULL, *opts = NULL;
if (!(tmp = ast_calloc(1, sizeof(*tmp))))
return NULL;
-
+
+ /* Initialize private structure information */
ast_mutex_init(&tmp->lock);
ast_copy_string(tmp->exten, data, sizeof(tmp->exten));
- opts = strchr(tmp->exten, '/');
- if (opts) {
+
+ /* Look for options */
+ if ((opts = strchr(tmp->exten, '/'))) {
*opts++ = '\0';
if (strchr(opts, 'n'))
tmp->nooptimization = 1;
}
- c = strchr(tmp->exten, '@');
- if (c)
+
+ /* Look for a context */
+ if ((c = strchr(tmp->exten, '@')))
*c++ = '\0';
+
ast_copy_string(tmp->context, c ? c : "default", sizeof(tmp->context));
+
tmp->reqformat = format;
+
if (!ast_exists_extension(NULL, tmp->context, tmp->exten, 1, NULL)) {
ast_log(LOG_NOTICE, "No such extension/context %s@%s creating local channel\n", tmp->exten, tmp->context);
ast_mutex_destroy(&tmp->lock);
@@ -554,12 +531,11 @@
/*! \brief Start new local channel */
static struct ast_channel *local_new(struct local_pvt *p, int state)
{
- struct ast_channel *tmp, *tmp2;
- int randnum = ast_random() & 0xffff;
-
- tmp = ast_channel_alloc(1);
- tmp2 = ast_channel_alloc(1);
- if (!tmp || !tmp2) {
+ struct ast_channel *tmp = NULL, *tmp2 = NULL;
+ int randnum = ast_random() & 0xffff, fmt = 0;
+
+ /* Allocate two new Asterisk channels */
+ if (!(tmp = ast_channel_alloc(1)) || !(tmp2 = ast_channel_alloc(1))) {
if (tmp)
ast_channel_free(tmp);
if (tmp2)
@@ -569,26 +545,35 @@
}
tmp2->tech = tmp->tech = &local_tech;
+
tmp->nativeformats = p->reqformat;
tmp2->nativeformats = p->reqformat;
+
ast_string_field_build(tmp, name, "Local/%s@%s-%04x,1", p->exten, p->context, randnum);
ast_string_field_build(tmp2, name, "Local/%s@%s-%04x,2", p->exten, p->context, randnum);
+
ast_setstate(tmp, state);
ast_setstate(tmp2, AST_STATE_RING);
- tmp->writeformat = p->reqformat;
- tmp2->writeformat = p->reqformat;
- tmp->rawwriteformat = p->reqformat;
- tmp2->rawwriteformat = p->reqformat;
- tmp->readformat = p->reqformat;
- tmp2->readformat = p->reqformat;
- tmp->rawreadformat = p->reqformat;
- tmp2->rawreadformat = p->reqformat;
+
+ /* Determine our read/write format and set it on each channel */
+ fmt = ast_best_codec(p->reqformat);
+ tmp->writeformat = fmt;
+ tmp2->writeformat = fmt;
+ tmp->rawwriteformat = fmt;
+ tmp2->rawwriteformat = fmt;
+ tmp->readformat = fmt;
+ tmp2->readformat = fmt;
+ tmp->rawreadformat = fmt;
+ tmp2->rawreadformat = fmt;
+
tmp->tech_pvt = p;
tmp2->tech_pvt = p;
+
p->owner = tmp;
p->chan = tmp2;
p->u_owner = ast_module_user_add(p->owner);
p->u_chan = ast_module_user_add(p->chan);
+
ast_copy_string(tmp->context, p->context, sizeof(tmp->context));
ast_copy_string(tmp2->context, p->context, sizeof(tmp2->context));
ast_copy_string(tmp2->exten, p->exten, sizeof(tmp->exten));
@@ -602,31 +587,35 @@
/*! \brief Part of PBX interface */
static struct ast_channel *local_request(const char *type, int format, void *data, int *cause)
{
- struct local_pvt *p;
+ struct local_pvt *p = NULL;
struct ast_channel *chan = NULL;
- p = local_alloc(data, format);
- if (p)
+ /* Allocate a new private structure and then Asterisk channel */
+ if ((p = local_alloc(data, format)))
chan = local_new(p, AST_STATE_DOWN);
+
return chan;
}
/*! \brief CLI command "local show channels" */
static int locals_show(int fd, int argc, char **argv)
{
- struct local_pvt *p;
+ struct local_pvt *p = NULL;
if (argc != 3)
return RESULT_SHOWUSAGE;
- if (AST_LIST_EMPTY(&locals))
+
+ AST_LIST_LOCK(&locals);
+ if (!AST_LIST_EMPTY(&locals)) {
+ AST_LIST_TRAVERSE(&locals, p, list) {
+ ast_mutex_lock(&p->lock);
+ ast_cli(fd, "%s -- %s@%s\n", p->owner ? p->owner->name : "<unowned>", p->exten, p->context);
+ ast_mutex_unlock(&p->lock);
+ }
+ } else
ast_cli(fd, "No local channels in use\n");
- AST_LIST_LOCK(&locals);
- AST_LIST_TRAVERSE(&locals, p, list) {
- ast_mutex_lock(&p->lock);
- ast_cli(fd, "%s -- %s@%s\n", p->owner ? p->owner->name : "<unowned>", p->exten, p->context);
- ast_mutex_unlock(&p->lock);
- }
AST_LIST_UNLOCK(&locals);
+
return RESULT_SUCCESS;
}
@@ -653,7 +642,7 @@
/*! \brief Unload the local proxy channel from Asterisk */
static int unload_module(void)
{
- struct local_pvt *p;
+ struct local_pvt *p = NULL;
/* First, take us out of the channel loop */
ast_cli_unregister(&cli_show_locals);
More information about the asterisk-commits
mailing list