From 0252969c39ccda27c8cd78a9a4ad58d0f2b77354 Mon Sep 17 00:00:00 2001 From: Daniel-Constantin Mierla Date: Fri, 6 Jan 2017 15:10:25 +0100 Subject: [PATCH] ctl: proper handling of rpc array type in response --- src/modules/ctl/binrpc_run.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/modules/ctl/binrpc_run.c b/src/modules/ctl/binrpc_run.c index 4adad7274c3..0f4f1a5773c 100644 --- a/src/modules/ctl/binrpc_run.c +++ b/src/modules/ctl/binrpc_run.c @@ -974,12 +974,18 @@ static int rpc_add(struct binrpc_ctx* ctx, char* fmt, ...) break; case '{': case '[': - err=binrpc_start_struct(&ctx->out.pkt); + if(*fmt == '{') + err=binrpc_start_struct(&ctx->out.pkt); + else + err=binrpc_start_array(&ctx->out.pkt); if (err<0) goto error_add; rs=new_rpc_struct(); if (rs==0) goto error_mem; rs->offset=binrpc_pkt_len(&ctx->out.pkt); - err=binrpc_end_struct(&ctx->out.pkt); + if(*fmt == '{') + err=binrpc_end_struct(&ctx->out.pkt); + else + err=binrpc_end_array(&ctx->out.pkt); if (err<0) goto error_add; clist_append(&ctx->out.structs, rs, next, prev); *(va_arg(ap, void**))=rs; @@ -1080,7 +1086,10 @@ static int rpc_struct_add(struct rpc_struct_l* s, char* fmt, ...) break; case '{': case '[': - avp.type=BINRPC_T_STRUCT; + if(*fmt == '{') + avp.type=BINRPC_T_STRUCT; + else + avp.type=BINRPC_T_ARRAY; err=binrpc_addavp(&s->pkt, &avp); if (err<0){ LM_ERR("failed to add attribute-value (%c)\n", *fmt); @@ -1092,7 +1101,10 @@ static int rpc_struct_add(struct rpc_struct_l* s, char* fmt, ...) goto error_mem; } rs->offset=binrpc_pkt_len(&s->pkt); - err=binrpc_end_struct(&s->pkt); + if(*fmt == '{') + err=binrpc_end_struct(&s->pkt); + else + err=binrpc_end_array(&s->pkt); if (err<0) { LM_ERR("failed to end struct (%c)\n", *fmt); goto error_add; @@ -1156,12 +1168,18 @@ static int rpc_array_add(struct rpc_struct_l* s, char* fmt, ...) break; case '{': case '[': - err=binrpc_start_struct(&s->pkt); + if(*fmt == '{') + err=binrpc_start_struct(&s->pkt); + else + err=binrpc_start_array(&s->pkt); if (err<0) goto error_add; rs=new_rpc_struct(); if (rs==0) goto error_mem; rs->offset=binrpc_pkt_len(&s->pkt); - err=binrpc_end_struct(&s->pkt); + if(*fmt == '{') + err=binrpc_end_struct(&s->pkt); + else + err=binrpc_end_array(&s->pkt); if (err<0) goto error_add; clist_append(&s->substructs, rs, next, prev); *(va_arg(ap, void**))=rs;