diff --git a/main/channel.c b/main/channel.c index f3e661d0e5c69894a81f5d81418ab08fd558e154..d7c0fb4f7adf78c9efe2e9f34325ff7d6ac9a2c9 100644 --- a/main/channel.c +++ b/main/channel.c @@ -1367,6 +1367,45 @@ struct ast_channel *ast_channel_iterator_next(struct ast_channel_iterator *i) return chan; } +static int ast_channel_cmp_cb(void *obj, void *arg, int flags) +{ + struct ast_channel *chan = obj, *cmp_args = arg; + size_t name_len; + int ret = CMP_MATCH; + + /* This is sort of a hack. Basically, we're using an arbitrary field + * in ast_channel to pass the name_len for a prefix match. If this + * gets changed, then the uses of ao2_find() must be changed, too. */ + name_len = cmp_args->rings; + + ast_channel_lock(chan); + + if (cmp_args->name) { /* match by name */ + if ((!name_len && strcasecmp(chan->name, cmp_args->name)) || + (name_len && strncasecmp(chan->name, cmp_args->name, name_len))) { + ret = 0; /* name match failed */ + } + } else if (cmp_args->exten) { + if (cmp_args->context && strcasecmp(chan->context, cmp_args->context) && + strcasecmp(chan->macrocontext, cmp_args->context)) { + ret = 0; /* context match failed */ + } + if (ret && strcasecmp(chan->exten, cmp_args->exten) && + strcasecmp(chan->macroexten, cmp_args->exten)) { + ret = 0; /* exten match failed */ + } + } else if (cmp_args->uniqueid) { + if ((!name_len && strcasecmp(chan->uniqueid, cmp_args->uniqueid)) || + (name_len && strncasecmp(chan->uniqueid, cmp_args->uniqueid, name_len))) { + ret = 0; /* uniqueid match failed */ + } + } + + ast_channel_unlock(chan); + + return ret; +} + static struct ast_channel *ast_channel_get_full(const char *name, size_t name_len, const char *exten, const char *context) { @@ -1387,7 +1426,8 @@ static struct ast_channel *ast_channel_get_full(const char *name, size_t name_le ast_copy_string(tmp_chan.context, context, sizeof(tmp_chan.context)); } - if ((chan = ao2_find(channels, &tmp_chan, !ast_strlen_zero(name) ? OBJ_POINTER : 0))) { + if ((chan = ao2_find(channels, &tmp_chan, + (!ast_strlen_zero(name) && (name_len != 0)) ? OBJ_POINTER : 0))) { return chan; } @@ -6248,45 +6288,6 @@ static int ast_channel_hash_cb(const void *obj, const int flags) return ast_str_case_hash(chan->name); } -static int ast_channel_cmp_cb(void *obj, void *arg, int flags) -{ - struct ast_channel *chan = obj, *cmp_args = arg; - size_t name_len; - int ret = CMP_MATCH; - - /* This is sort of a hack. Basically, we're using an arbitrary field - * in ast_channel to pass the name_len for a prefix match. If this - * gets changed, then the uses of ao2_find() must be changed, too. */ - name_len = cmp_args->rings; - - ast_channel_lock(chan); - - if (cmp_args->name) { /* match by name */ - if ((!name_len && strcasecmp(chan->name, cmp_args->name)) || - (name_len && strncasecmp(chan->name, cmp_args->name, name_len))) { - ret = 0; /* name match failed */ - } - } else if (cmp_args->exten) { - if (cmp_args->context && strcasecmp(chan->context, cmp_args->context) && - strcasecmp(chan->macrocontext, cmp_args->context)) { - ret = 0; /* context match failed */ - } - if (ret && strcasecmp(chan->exten, cmp_args->exten) && - strcasecmp(chan->macroexten, cmp_args->exten)) { - ret = 0; /* exten match failed */ - } - } else if (cmp_args->uniqueid) { - if ((!name_len && strcasecmp(chan->uniqueid, cmp_args->uniqueid)) || - (name_len && strncasecmp(chan->uniqueid, cmp_args->uniqueid, name_len))) { - ret = 0; /* uniqueid match failed */ - } - } - - ast_channel_unlock(chan); - - return ret; -} - void ast_channels_init(void) { channels = ao2_container_alloc(NUM_CHANNEL_BUCKETS,