comparison libpurple/network.c @ 26168:af42303654a5

propagate from branch 'im.pidgin.pidgin' (head 0bb02399ead9501a3e7951cfba2e8e8350fe917c) to branch 'im.pidgin.pidgin.vv' (head a940363ef1efa4bf53c71cbb8201f36ed5795583)
author Mike Ruprecht <maiku@soc.pidgin.im>
date Thu, 05 Feb 2009 00:31:35 +0000
parents 75f72178e361 128a3175668e
children ff4212a5268f
comparison
equal deleted inserted replaced
25056:b0c75121cf66 26168:af42303654a5
46 #include "nat-pmp.h" 46 #include "nat-pmp.h"
47 #include "network.h" 47 #include "network.h"
48 #include "prefs.h" 48 #include "prefs.h"
49 #include "stun.h" 49 #include "stun.h"
50 #include "upnp.h" 50 #include "upnp.h"
51 #include "dnsquery.h"
51 52
52 /* 53 /*
53 * Calling sizeof(struct ifreq) isn't always correct on 54 * Calling sizeof(struct ifreq) isn't always correct on
54 * Mac OS X (and maybe others). 55 * Mac OS X (and maybe others).
55 */ 56 */
93 }; 94 };
94 95
95 #ifdef HAVE_NETWORKMANAGER 96 #ifdef HAVE_NETWORKMANAGER
96 static NMState nm_get_network_state(void); 97 static NMState nm_get_network_state(void);
97 #endif 98 #endif
99
100 /* Cached IP addresses for STUN and TURN servers (set globally in prefs) */
101 static gchar *stun_ip = NULL;
102 static gchar *turn_ip = NULL;
98 103
99 const unsigned char * 104 const unsigned char *
100 purple_network_ip_atoi(const char *ip) 105 purple_network_ip_atoi(const char *ip)
101 { 106 {
102 static unsigned char ret[4]; 107 static unsigned char ret[4];
706 switch(state) 711 switch(state)
707 { 712 {
708 case NM_STATE_CONNECTED: 713 case NM_STATE_CONNECTED:
709 /* Call res_init in case DNS servers have changed */ 714 /* Call res_init in case DNS servers have changed */
710 res_init(); 715 res_init();
716 /* update STUN IP in case we it changed (theoretically we could
717 have gone from IPv4 to IPv6, f.ex. or we were previously
718 offline */
719 purple_network_set_stun_server(
720 purple_prefs_get_string("/purple/network/stun_server"));
721 purple_network_set_turn_server(
722 purple_prefs_get_string("/purple/network/turn_server"));
723
711 if (ui_ops != NULL && ui_ops->network_connected != NULL) 724 if (ui_ops != NULL && ui_ops->network_connected != NULL)
712 ui_ops->network_connected(); 725 ui_ops->network_connected();
713 break; 726 break;
714 case NM_STATE_ASLEEP: 727 case NM_STATE_ASLEEP:
715 case NM_STATE_CONNECTING: 728 case NM_STATE_CONNECTING:
767 } 780 }
768 } 781 }
769 782
770 #endif 783 #endif
771 784
785 static void
786 purple_network_ip_lookup_cb(GSList *hosts, gpointer data,
787 const char *error_message)
788 {
789 const gchar **ip = (const gchar **) data;
790
791 if (error_message) {
792 purple_debug_error("network", "lookup of IP address failed: %s\n",
793 error_message);
794 g_slist_free(hosts);
795 return;
796 }
797
798 if (hosts && g_slist_next(hosts)) {
799 struct sockaddr *addr = g_slist_next(hosts)->data;
800 char dst[INET6_ADDRSTRLEN];
801
802 if (addr->sa_family == AF_INET6) {
803 inet_ntop(addr->sa_family, &((struct sockaddr_in6 *) addr)->sin6_addr,
804 dst, sizeof(dst));
805 } else {
806 inet_ntop(addr->sa_family, &((struct sockaddr_in *) addr)->sin_addr,
807 dst, sizeof(dst));
808 }
809
810 *ip = g_strdup(dst);
811 purple_debug_info("network", "set IP address: %s\n", *ip);
812 }
813
814 g_slist_free(hosts);
815 }
816
817 void
818 purple_network_set_stun_server(const gchar *stun_server)
819 {
820 if (stun_server && stun_server[0] != '\0') {
821 if (purple_network_is_available()) {
822 purple_debug_info("network", "running DNS query for STUN server\n");
823 purple_dnsquery_a(stun_server, 3478, purple_network_ip_lookup_cb,
824 &stun_ip);
825 } else {
826 purple_debug_info("network",
827 "network is unavailable, don't try to update STUN IP");
828 }
829 } else if (stun_ip) {
830 g_free(stun_ip);
831 stun_ip = NULL;
832 }
833 }
834
835 void
836 purple_network_set_turn_server(const gchar *turn_server)
837 {
838 if (turn_server && turn_server[0] != '\0') {
839 if (purple_network_is_available()) {
840 purple_debug_info("network", "running DNS query for TURN server\n");
841 purple_dnsquery_a(turn_server,
842 purple_prefs_get_int("/purple/network/turn_port"),
843 purple_network_ip_lookup_cb, &turn_ip);
844 } else {
845 purple_debug_info("network",
846 "network is unavailable, don't try to update TURN IP");
847 }
848 } else if (turn_ip) {
849 g_free(turn_ip);
850 turn_ip = NULL;
851 }
852 }
853
854
855 const gchar *
856 purple_network_get_stun_ip(void)
857 {
858 return stun_ip;
859 }
860
861 const gchar *
862 purple_network_get_turn_ip(void)
863 {
864 return turn_ip;
865 }
866
772 void * 867 void *
773 purple_network_get_handle(void) 868 purple_network_get_handle(void)
774 { 869 {
775 static int handle; 870 static int handle;
776 871
799 } 894 }
800 } 895 }
801 #endif 896 #endif
802 897
803 purple_prefs_add_none ("/purple/network"); 898 purple_prefs_add_none ("/purple/network");
899 purple_prefs_add_string("/purple/network/stun_server", "");
900 purple_prefs_add_string("/purple/network/turn_server", "");
901 purple_prefs_add_int ("/purple/network/turn_port", 3478);
902 purple_prefs_add_string("/purple/network/turn_username", "");
903 purple_prefs_add_string("/purple/network/turn_password", "");
804 purple_prefs_add_bool ("/purple/network/auto_ip", TRUE); 904 purple_prefs_add_bool ("/purple/network/auto_ip", TRUE);
805 purple_prefs_add_string("/purple/network/public_ip", ""); 905 purple_prefs_add_string("/purple/network/public_ip", "");
806 purple_prefs_add_bool ("/purple/network/map_ports", TRUE); 906 purple_prefs_add_bool ("/purple/network/map_ports", TRUE);
807 purple_prefs_add_bool ("/purple/network/ports_range_use", FALSE); 907 purple_prefs_add_bool ("/purple/network/ports_range_use", FALSE);
808 purple_prefs_add_int ("/purple/network/ports_range_start", 1024); 908 purple_prefs_add_int ("/purple/network/ports_range_start", 1024);
837 purple_signal_register(purple_network_get_handle(), "network-configuration-changed", 937 purple_signal_register(purple_network_get_handle(), "network-configuration-changed",
838 purple_marshal_VOID, NULL, 0); 938 purple_marshal_VOID, NULL, 0);
839 939
840 purple_pmp_init(); 940 purple_pmp_init();
841 purple_upnp_init(); 941 purple_upnp_init();
942
943 purple_network_set_stun_server(
944 purple_prefs_get_string("/purple/network/stun_server"));
945 purple_network_set_turn_server(
946 purple_prefs_get_string("/purple/network/turn_server"));
842 } 947 }
843 948
844 void 949 void
845 purple_network_uninit(void) 950 purple_network_uninit(void)
846 { 951 {
878 g_static_mutex_unlock(&mutex); 983 g_static_mutex_unlock(&mutex);
879 984
880 #endif 985 #endif
881 purple_signal_unregister(purple_network_get_handle(), 986 purple_signal_unregister(purple_network_get_handle(),
882 "network-configuration-changed"); 987 "network-configuration-changed");
883 } 988
989 if (stun_ip)
990 g_free(stun_ip);
991 }