SWITCH_DECLARE(void) switch_nat_republish(void) { switch_xml_t natxml = NULL; switch_xml_t row = NULL; switch_xml_t child = NULL; switch_stream_handle_t stream = { 0 }; SWITCH_STANDARD_STREAM(stream); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "Refreshing nat maps\n"); switch_api_execute("show", "nat_map as xml", NULL, &stream); if (!(natxml = switch_xml_parse_str_dup(stream.data))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to parse XML: %s\n", (char *) stream.data); switch_safe_free(stream.data); return; } /* iterate the xml and publish the mappings */ row = switch_xml_find_child(natxml, "row", "row_id", "1"); while (row != NULL) { char *sport = NULL; char *sproto = NULL; switch_port_t port; switch_nat_ip_proto_t proto; if ((child = switch_xml_child(row, "port"))) { sport = child->txt; } if ((child = switch_xml_child(row, "proto_num"))) { sproto = child->txt; } if (sport && sproto) { port = (switch_port_t) (atoi(sport)); proto = (switch_nat_ip_proto_t) (atoi(sproto)); switch_nat_add_mapping_internal(port, proto, NULL, SWITCH_FALSE, SWITCH_FALSE); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to parse port/proto info: XML: %s\n", (char *) stream.data); } row = switch_xml_next(row); } switch_safe_free(stream.data); switch_xml_free(natxml); }
static cid_data_t *do_whitepages_lookup(switch_memory_pool_t *pool, switch_event_t *event, const char *num) { char *xml_s = NULL; char *query = NULL; char *name = NULL; char *city = NULL; char *state = NULL; char *area = NULL; switch_xml_t xml = NULL; switch_xml_t node = NULL; cid_data_t *cid = NULL; /* NANPA check */ if (strlen(num) == 11 && num[0] == '1') { num++; /* skip past leading 1 */ } else { goto done; } switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "whitepages-cid", num); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "whitepages-api-key", globals.whitepages_apikey); query = switch_event_expand_headers(event, "http://api.whitepages.com/reverse_phone/1.0/?phone=${whitepages-cid};api_key=${whitepages-api-key}"); do_lookup_url(pool, event, &xml_s, query, NULL, NULL, 0); if (zstr(xml_s)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No XML returned for number %s\n", num); goto done; } xml = switch_xml_parse_str_dup(xml_s); if (!xml) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to parse XML: %s\n", xml_s); goto done; } /* try for bizname first */ node = switch_xml_get(xml, "wp:listings", 0, "wp:listing", 0, "wp:business", 0, "wp:businessname", -1); if (node) { name = switch_core_strdup(pool, switch_xml_txt(node)); goto area; } node = switch_xml_get(xml, "wp:listings", 0, "wp:listing", 0, "wp:displayname", -1); if (node) { name = switch_core_strdup(pool, switch_xml_txt(node)); } area: node = switch_xml_get(xml, "wp:listings", 0, "wp:listing", 0, "wp:address", 0, "wp:city", -1); if (node) { city = switch_xml_txt(node); } node = switch_xml_get(xml, "wp:listings", 0, "wp:listing", 0, "wp:address", 0, "wp:state", -1); if (node) { state = switch_xml_txt(node); } if (city || state) { area = switch_core_sprintf(pool, "%s %s", city ? city : "", state ? state : ""); } done: if (query) { switch_safe_free(query); } if (xml) { switch_xml_free(xml); } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "whitepages XML: %s\n", xml_s); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "whitepages name: %s, area: %s\n", name ? name : "(null)", area ? area : "(null)"); cid = switch_core_alloc(pool, sizeof(cid_data_t)); switch_assert(cid); cid->name = name; cid->area = area; cid->src = "whitepages"; return cid; }