diff --git a/src/sipvoiplink.cpp b/src/sipvoiplink.cpp index 04c8c4a7856514c8b0429d65eaad67e9013f6483..df38379106c088a69e9cc2093d885952d521a191 100644 --- a/src/sipvoiplink.cpp +++ b/src/sipvoiplink.cpp @@ -25,6 +25,11 @@ #include "sipaccount.h" #include "audio/audiortp.h" +#include <netinet/in.h> +#include <arpa/nameser.h> +#include <resolv.h> +//extern struct state _res; + #define CAN_REINVITE 1 @@ -1261,13 +1266,42 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam // Private functions /////////////////////////////////////////////////////////////////////////////// + + bool get_dns_server_addresses (std::vector<std::string> *servers) { + + int server_count, i; + std::vector<std::string> nameservers; + struct sockaddr_in current_server; + in_addr address; + + // Read configuration files + if (res_init () != 0) + { + _debug ("Resolver initialization failed\n"); + return false; + } + + server_count = _res.nscount; + for (i=0; i<server_count; i++) { + current_server = (struct sockaddr_in)_res.nsaddr_list[i]; + address = current_server.sin_addr; + nameservers.push_back (inet_ntoa (address)); + } + + //nameservers.push_back ("192.168.50.3"); + *servers = nameservers; + + return true; + } + pj_status_t SIPVoIPLink::enable_dns_srv_resolver (pjsip_endpoint *endpt, pj_dns_resolver **p_resv) { pj_status_t status; pj_dns_resolver *resv; - pj_str_t servers[1]; + std::vector <std::string> dns_servers; pj_uint16_t port = 5353; pjsip_resolver_t *res; + int scount, i; // Create the DNS resolver instance status = pjsip_endpt_create_resolver (endpt, &resv); @@ -1276,9 +1310,22 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam return status; } + if (!get_dns_server_addresses (&dns_servers)) + { + _debug ("Error while fetching DNS information\n"); + return -1; + } + + // Build the nameservers list needed by pjsip + scount = dns_servers.size (); + pj_str_t nameservers[scount]; + + for (i = 0; i<scount; i++) { + nameservers[i] = pj_str((char*)dns_servers[i].c_str()); + } + // Update the name servers for the DNS resolver - servers[0] = pj_str((char*)"savoirfairelinux.com"); - status = pj_dns_resolver_set_ns (resv, 1, servers, NULL); + status = pj_dns_resolver_set_ns (resv, scount, nameservers, NULL); if (status != PJ_SUCCESS){ _debug ("Error updating the name servers for the DNS resolver\n"); return status; @@ -1431,8 +1478,8 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam status = pjsip_xfer_init_module(_endpt); PJ_ASSERT_RETURN( status == PJ_SUCCESS, 1 ); - //status = enable_dns_srv_resolver (_endpt, &p_resv); - //PJ_ASSERT_RETURN( status == PJ_SUCCESS, 1 ); + status = enable_dns_srv_resolver (_endpt, &p_resv); + PJ_ASSERT_RETURN( status == PJ_SUCCESS, 1 ); // Init the callback for INVITE session: pj_bzero(&inv_cb, sizeof (inv_cb));