Mercurial > pidgin.yaz
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 } |