static void dump_gw(rpc_t *rpc, void *st, struct gw_info *gw, unsigned int gw_index, unsigned int lcr_id) { str scheme, gw_name, hostname, params, transport; str prefix, tag; char buf[INT2STR_MAX_LEN], *start; int len; rpc->struct_add(st, "d", "lcr_id", lcr_id); rpc->struct_add(st, "d", "gw_index", gw_index); rpc->struct_add(st, "d", "gw_id", gw->gw_id); gw_name.s = gw->gw_name; gw_name.len = gw->gw_name_len; rpc->struct_add(st, "S", "gw_name", &gw_name); scheme.s = gw->scheme; scheme.len = gw->scheme_len; rpc->struct_add(st, "S", "scheme", &scheme); switch(gw->ip_addr.af) { case AF_INET: rpc->struct_printf(st, "ip_addr", "%d.%d.%d.%d", gw->ip_addr.u.addr[0], gw->ip_addr.u.addr[1], gw->ip_addr.u.addr[2], gw->ip_addr.u.addr[3]); break; case AF_INET6: rpc->struct_printf(st, "ip_addr", "%x:%x:%x:%x:%x:%x:%x:%x", gw->ip_addr.u.addr16[0], gw->ip_addr.u.addr16[1], gw->ip_addr.u.addr16[2], gw->ip_addr.u.addr16[3], gw->ip_addr.u.addr16[4], gw->ip_addr.u.addr16[5], gw->ip_addr.u.addr16[6], gw->ip_addr.u.addr16[7]); break; case 0: rpc->struct_add(st, "s", "ip_addr", "0.0.0.0"); break; } hostname.s = gw->hostname; hostname.len = gw->hostname_len; rpc->struct_add(st, "S", "hostname", &hostname); rpc->struct_add(st, "d", "port", gw->port); params.s = gw->params; params.len = gw->params_len; rpc->struct_add(st, "S", "params", ¶ms); transport.s = gw->transport; transport.len = gw->transport_len; rpc->struct_add(st, "S", "transport", &transport); prefix.s = gw->prefix; prefix.len = gw->prefix_len; tag.s = gw->tag; tag.len = gw->tag_len; start = int2strbuf( gw->defunct_until, &(buf[0]), INT2STR_MAX_LEN, &len); rpc->struct_add(st, "dSSdds", "strip", gw->strip, "prefix", &prefix, "tag", &tag, "flags", gw->flags, "state", gw->state, "defunct_until", start); }
static void dump_gws(rpc_t* rpc, void* c) { void* st; unsigned int i, j; enum sip_protos transport; str gw_name, hostname, params; str prefix, tag; struct gw_info *gws; char buf[INT2STR_MAX_LEN], *start; int len; for (j = 1; j <= lcr_count_param; j++) { gws = gw_pt[j]; for (i = 1; i <= gws[0].ip_addr.u.addr32[0]; i++) { if (rpc->add(c, "{", &st) < 0) return; rpc->struct_add(st, "d", "lcr_id", j); rpc->struct_add(st, "d", "gw_id", gws[i].gw_id); rpc->struct_add(st, "d", "gw_index", i); gw_name.s=gws[i].gw_name; gw_name.len=gws[i].gw_name_len; rpc->struct_add(st, "S", "gw_name", &gw_name); if (gws[i].scheme == SIP_URI_T) { rpc->struct_add(st, "s", "scheme", "sip"); } else { rpc->struct_add(st, "s", "scheme", "sips"); } switch (gws[i].ip_addr.af) { case AF_INET: rpc->struct_printf(st, "ip_addr", "%d.%d.%d.%d", gws[i].ip_addr.u.addr[0], gws[i].ip_addr.u.addr[1], gws[i].ip_addr.u.addr[2], gws[i].ip_addr.u.addr[3]); break; case AF_INET6: rpc->struct_printf(st, "ip_addr", "%x:%x:%x:%x:%x:%x:%x:%x", gws[i].ip_addr.u.addr16[0], gws[i].ip_addr.u.addr16[1], gws[i].ip_addr.u.addr16[2], gws[i].ip_addr.u.addr16[3], gws[i].ip_addr.u.addr16[4], gws[i].ip_addr.u.addr16[5], gws[i].ip_addr.u.addr16[6], gws[i].ip_addr.u.addr16[7]); break; case 0: rpc->struct_add(st, "s", "ip_addr", "0.0.0.0"); break; } hostname.s=gws[i].hostname; hostname.len=gws[i].hostname_len; rpc->struct_add(st, "S", "hostname", &hostname); rpc->struct_add(st, "d", "port", gws[i].port); params.s=gws[i].params; params.len=gws[i].params_len; rpc->struct_add(st, "S", "params", ¶ms); transport = gws[i].transport; switch(transport){ case PROTO_UDP: rpc->struct_add(st, "s", "transport", "UDP"); break; case PROTO_TCP: rpc->struct_add(st, "s", "transport", "TCP"); break; case PROTO_TLS: rpc->struct_add(st, "s", "transport", "TLS"); break; case PROTO_SCTP: rpc->struct_add(st, "s", "transport", "SCTP"); break; case PROTO_OTHER: rpc->struct_add(st, "s", "transport", "OTHER"); break; case PROTO_WS: case PROTO_WSS: case PROTO_NONE: break; } prefix.s=gws[i].prefix; prefix.len=gws[i].prefix_len; tag.s=gws[i].tag; tag.len=gws[i].tag_len; start = int2strbuf(gws[i].defunct_until, &(buf[0]), INT2STR_MAX_LEN, &len); rpc->struct_add(st, "dSSds", "strip", gws[i].strip, "prefix", &prefix, "tag", &tag, "flags", gws[i].flags, "defunct_until", start ); } } }