]> sjero.net Git - linphone/commitdiff
allow setting of a nat address as hostname
authorSimon Morlat <simon.morlat@linphone.org>
Mon, 4 Apr 2011 19:26:45 +0000 (21:26 +0200)
committerSimon Morlat <simon.morlat@linphone.org>
Mon, 4 Apr 2011 19:26:45 +0000 (21:26 +0200)
coreapi/linphonecore.c
coreapi/linphonecore.h
coreapi/misc.c
coreapi/private.h
mediastreamer2

index f8ed10ce010e3a368d1add474270b1ceec1713b5..b3eabe12ffe8446570226de01098432683d2b23c 100644 (file)
@@ -41,7 +41,7 @@ static const char *liblinphone_version=LIBLINPHONE_VERSION;
 static void set_network_reachable(LinphoneCore* lc,bool_t isReachable, time_t curtime);
 
 #include "enum.h"
-
+const char *linphone_core_get_nat_address_resolved(LinphoneCore *lc);
 void linphone_core_get_local_ip(LinphoneCore *lc, const char *dest, char *result);
 static void toggle_video_preview(LinphoneCore *lc, bool_t val);
 
@@ -358,6 +358,7 @@ static void net_config_read (LinphoneCore *lc)
        const char *tmpstr;
        LpConfig *config=lc->config;
 
+       lc->net_conf.nat_address_ip = NULL;
        tmp=lp_config_get_int(config,"net","download_bw",0);
        linphone_core_set_download_bandwidth(lc,tmp);
        tmp=lp_config_get_int(config,"net","upload_bw",0);
@@ -1080,9 +1081,10 @@ int linphone_core_set_primary_contact(LinphoneCore *lc, const char *contact)
 
 /*result must be an array of chars at least LINPHONE_IPADDR_SIZE */
 void linphone_core_get_local_ip(LinphoneCore *lc, const char *dest, char *result){
+       const char *ip;
        if (linphone_core_get_firewall_policy(lc)==LinphonePolicyUseNatAddress
-           && linphone_core_get_nat_address(lc)!=NULL){
-               strncpy(result,linphone_core_get_nat_address(lc),LINPHONE_IPADDR_SIZE);
+           && (ip=linphone_core_get_nat_address_resolved(lc))!=NULL){
+               strncpy(result,ip,LINPHONE_IPADDR_SIZE);
                return;
        }
        if (linphone_core_get_local_ip_for(lc->sip_conf.ipv6_enabled ? AF_INET6 : AF_INET,dest,result)==0)
@@ -1894,7 +1896,7 @@ static char *get_fixed_contact(LinphoneCore *lc, LinphoneCall *call , LinphonePr
        if (linphone_core_get_firewall_policy(lc)==LinphonePolicyUseNatAddress){
                ctt=linphone_core_get_primary_contact_parsed(lc);
                return ms_strdup_printf("sip:%s@%s",linphone_address_get_username(ctt),
-                       linphone_core_get_nat_address(lc));
+                       linphone_core_get_nat_address_resolved(lc));
        }
 
        /* if already choosed, don't change it */
@@ -3092,11 +3094,34 @@ void linphone_core_set_nat_address(LinphoneCore *lc, const char *addr)
        if (lc->sip_conf.contact) update_primary_contact(lc);
 }
 
-const char *linphone_core_get_nat_address(const LinphoneCore *lc)
-{
+const char *linphone_core_get_nat_address(const LinphoneCore *lc) {
        return lc->net_conf.nat_address;
 }
 
+const char *linphone_core_get_nat_address_resolved(LinphoneCore *lc)
+{
+       struct sockaddr_storage ss;
+       socklen_t ss_len;
+       int error;
+       char ipstring [INET6_ADDRSTRLEN];
+
+       if (parse_hostname_to_addr (lc->net_conf.nat_address, &ss, &ss_len)<0) {
+               return lc->net_conf.nat_address;
+       }
+
+       error = getnameinfo((struct sockaddr *)&ss, ss_len,
+               ipstring, sizeof(ipstring), NULL, 0, NI_NUMERICHOST);
+       if (error) {
+               return lc->net_conf.nat_address;
+       } 
+       
+       if (lc->net_conf.nat_address_ip!=NULL){
+               ms_free(lc->net_conf.nat_address_ip);
+       }
+       lc->net_conf.nat_address_ip = ms_strdup (ipstring);
+       return lc->net_conf.nat_address_ip;
+}
+
 void linphone_core_set_firewall_policy(LinphoneCore *lc, LinphoneFirewallPolicy pol){
        lc->net_conf.firewall_policy=pol;
        if (lc->sip_conf.contact) update_primary_contact(lc);
@@ -3715,6 +3740,9 @@ void net_config_uninit(LinphoneCore *lc)
                lp_config_set_string(lc->config,"net","nat_address",config->nat_address);
                ms_free(lc->net_conf.nat_address);
        }
+       if (lc->net_conf.nat_address_ip !=NULL){
+               ms_free(lc->net_conf.nat_address_ip);
+       }
        lp_config_set_int(lc->config,"net","firewall_policy",config->firewall_policy);
        lp_config_set_int(lc->config,"net","mtu",config->mtu);  
 }
index dc673756617d7477f3f6cfd7083e6f687c7b6fe5..e9e410b11e7fa4ca7e30d17af17dc97a73d6fbb7 100644 (file)
@@ -994,6 +994,9 @@ LinphoneGlobalState linphone_core_get_global_state(const LinphoneCore *lc);
  * @ingroup proxies
  */
 void linphone_core_refresh_registers(LinphoneCore* lc);        
+
+int parse_hostname_to_addr(const char *server, struct sockaddr_storage *ss, socklen_t *socklen);
+
 #ifdef __cplusplus
 }
 #endif
index 9cce4c480643be8ff645cd8fe837bdf4365439ed..ccadf03e2db63fe1d779d625673021999549cfa4 100644 (file)
@@ -396,7 +396,7 @@ static int sendStunRequest(int sock, const struct sockaddr *server, socklen_t ad
        return 0;
 }
 
-static int parse_stun_server_addr(const char *server, struct sockaddr_storage *ss, socklen_t *socklen){
+int parse_hostname_to_addr(const char *server, struct sockaddr_storage *ss, socklen_t *socklen){
        struct addrinfo hints,*res=NULL;
        int ret;
        const char *port;
@@ -466,7 +466,7 @@ void linphone_core_run_stun_tests(LinphoneCore *lc, LinphoneCall *call){
                ac=&call->localdesc->streams[0].candidates[0];
                vc=&call->localdesc->streams[1].candidates[0];
                
-               if (parse_stun_server_addr(server,&ss,&ss_len)<0){
+               if (parse_hostname_to_addr(server,&ss,&ss_len)<0){
                        ms_error("Fail to parser stun server address: %s",server);
                        return;
                }
@@ -596,7 +596,7 @@ int linphone_core_wake_up_possible_already_running_instance(
                socklen_t sslen;
                char tmp[100];
                snprintf(tmp,sizeof(tmp),"127.0.0.1:%i",port);
-               if (parse_stun_server_addr(tmp,&ss,&sslen)==0){
+               if (parse_hostname_to_addr(tmp,&ss,&sslen)==0){
                        int locport=57123;
                        ortp_socket_t sock=create_socket(locport);
                        if (sock<0) sock=create_socket(++locport);
index 08c9b6aac51b6626bcb7b58be20f029791152da3..305e5a05c84eb38926aee32045b8e9cad6b237d4 100644 (file)
@@ -311,7 +311,8 @@ typedef struct rtp_config
 
 typedef struct net_config
 {
-       char *nat_address;
+       char *nat_address; /* may be IP or host name */
+       char *nat_address_ip; /* ip translated from nat_address */
        char *stun_server;
        char *relay;
        int download_bw;
index 39a3f4ddd4a0f60cdd563fdef1d1b7d6e04d140d..f5aeb6f365a85888c1049c346af6f7912cc4f4f1 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 39a3f4ddd4a0f60cdd563fdef1d1b7d6e04d140d
+Subproject commit f5aeb6f365a85888c1049c346af6f7912cc4f4f1