summaryrefslogtreecommitdiff
path: root/res/snmp
diff options
context:
space:
mode:
Diffstat (limited to 'res/snmp')
-rw-r--r--res/snmp/agent.c61
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);