diff options
Diffstat (limited to 'res/snmp')
-rw-r--r-- | res/snmp/agent.c | 61 |
1 files changed, 50 insertions, 11 deletions
diff --git a/res/snmp/agent.c b/res/snmp/agent.c index f7e08220d..5a13142d2 100644 --- a/res/snmp/agent.c +++ b/res/snmp/agent.c @@ -236,19 +236,32 @@ static u_char *ast_var_channels_table(struct variable *vp, oid *name, size_t *le u_char *ret = NULL; int i, bit; struct ast_str *out = ast_str_alloca(2048); + struct ast_channel_iterator *iter; if (header_simple_table(vp, name, length, exact, var_len, write_method, ast_active_channels())) return NULL; i = name[*length - 1] - 1; - for (chan = ast_channel_walk_locked(NULL); - chan && i; - chan = ast_channel_walk_locked(chan), i--) - ast_channel_unlock(chan); - if (chan == NULL) + + if (!(iter = ast_channel_iterator_all_new(0))) { return NULL; + } + + while ((chan = ast_channel_iterator_next(iter)) && i) { + ast_channel_unref(chan); + i--; + } + + iter = ast_channel_iterator_destroy(iter); + + if (chan == NULL) { + return NULL; + } + *var_len = sizeof(long_ret); + ast_channel_lock(chan); + switch (vp->magic) { case ASTCHANINDEX: long_ret = name[*length - 1]; @@ -503,7 +516,10 @@ static u_char *ast_var_channels_table(struct variable *vp, oid *name, size_t *le default: break; } + ast_channel_unlock(chan); + chan = ast_channel_unref(chan); + return ret; } @@ -567,13 +583,26 @@ static u_char *ast_var_channel_types_table(struct variable *vp, oid *name, size_ long_ret = tech->transfer ? 1 : 2; return (u_char *)&long_ret; case ASTCHANTYPECHANNELS: + { + struct ast_channel_iterator *iter; + long_ret = 0; - for (chan = ast_channel_walk_locked(NULL); chan; chan = ast_channel_walk_locked(chan)) { - if (chan->tech == tech) + + if (!(iter = ast_channel_iterator_all_new(0))) { + return NULL; + } + + while ((chan = ast_channel_iterator_next(iter))) { + if (chan->tech == tech) { long_ret++; - ast_channel_unlock(chan); + } + chan = ast_channel_unref(chan); } + + ast_channel_iterator_destroy(iter); + return (u_char *)&long_ret; + } default: break; } @@ -585,15 +614,25 @@ static u_char *ast_var_channel_bridge(struct variable *vp, oid *name, size_t *le { static unsigned long long_ret; struct ast_channel *chan = NULL; + struct ast_channel_iterator *iter; long_ret = 0; - if (header_generic(vp, name, length, exact, var_len, write_method)) + + if (header_generic(vp, name, length, exact, var_len, write_method)) { return NULL; + } - while ((chan = ast_channel_walk_locked(chan))) { - if (ast_bridged_channel(chan)) + if (!(iter = ast_channel_iterator_all_new(0))) { + return NULL; + } + + while ((chan = ast_channel_iterator_next(iter))) { + ast_channel_lock(chan); + if (ast_bridged_channel(chan)) { long_ret++; + } ast_channel_unlock(chan); + chan = ast_channel_unref(chan); } *var_len = sizeof(long_ret); |