Mercurial > pidgin
comparison libpurple/network.c @ 26055:c56e8826fed0
Added support to generate relayed candidates (TURN).
Added prefs setting for relay server in Pidgin
author | Marcus Lundblad <ml@update.uu.se> |
---|---|
date | Thu, 22 Jan 2009 23:04:52 +0000 |
parents | ae3d25465d0f |
children | 4f0aec6d4ad7 |
comparison
equal
deleted
inserted
replaced
26054:d68924f1265f | 26055:c56e8826fed0 |
---|---|
91 | 91 |
92 #ifdef HAVE_NETWORKMANAGER | 92 #ifdef HAVE_NETWORKMANAGER |
93 static NMState nm_get_network_state(void); | 93 static NMState nm_get_network_state(void); |
94 #endif | 94 #endif |
95 | 95 |
96 /* Cached IP address for STUN server */ | 96 /* Cached IP addresses for STUN and TURN servers (set globally in prefs) */ |
97 static gchar *stun_ip = NULL; | 97 static gchar *stun_ip = NULL; |
98 static gchar *turn_ip = NULL; | |
98 | 99 |
99 const unsigned char * | 100 const unsigned char * |
100 purple_network_ip_atoi(const char *ip) | 101 purple_network_ip_atoi(const char *ip) |
101 { | 102 { |
102 static unsigned char ret[4]; | 103 static unsigned char ret[4]; |
692 /* update STUN IP in case we it changed (theoretically we could | 693 /* update STUN IP in case we it changed (theoretically we could |
693 have gone from IPv4 to IPv6, f.ex. or we were previously | 694 have gone from IPv4 to IPv6, f.ex. or we were previously |
694 offline */ | 695 offline */ |
695 purple_network_set_stun_server( | 696 purple_network_set_stun_server( |
696 purple_prefs_get_string("/purple/network/stun_server")); | 697 purple_prefs_get_string("/purple/network/stun_server")); |
698 purple_network_set_turn_server( | |
699 purple_prefs_get_string("/purple/network/turn_server")); | |
697 | 700 |
698 if (ui_ops != NULL && ui_ops->network_connected != NULL) | 701 if (ui_ops != NULL && ui_ops->network_connected != NULL) |
699 ui_ops->network_connected(); | 702 ui_ops->network_connected(); |
700 break; | 703 break; |
701 case NM_STATE_ASLEEP: | 704 case NM_STATE_ASLEEP: |
755 } | 758 } |
756 | 759 |
757 #endif | 760 #endif |
758 | 761 |
759 static void | 762 static void |
760 purple_network_stun_lookup_cb(GSList *hosts, gpointer data, | 763 purple_network_ip_lookup_cb(GSList *hosts, gpointer data, |
761 const char *error_message) | 764 const char *error_message) |
762 { | 765 { |
766 const gchar **ip = (const gchar **) data; | |
767 | |
763 if (error_message) { | 768 if (error_message) { |
764 purple_debug_error("network", "lookup of STUN server IP failed: %s\n", | 769 purple_debug_error("network", "lookup of IP address failed: %s\n", |
765 error_message); | 770 error_message); |
766 g_slist_free(hosts); | 771 g_slist_free(hosts); |
767 return; | 772 return; |
768 } | 773 } |
769 | 774 |
778 } else { | 783 } else { |
779 inet_ntop(addr->sa_family, &((struct sockaddr_in *) addr)->sin_addr, | 784 inet_ntop(addr->sa_family, &((struct sockaddr_in *) addr)->sin_addr, |
780 dst, sizeof(dst)); | 785 dst, sizeof(dst)); |
781 } | 786 } |
782 | 787 |
783 stun_ip = g_strdup(dst); | 788 *ip = g_strdup(dst); |
784 purple_debug_info("network", "set STUN IP: %s\n", stun_ip); | 789 purple_debug_info("network", "set IP address: %s\n", *ip); |
785 } | 790 } |
786 | 791 |
787 g_slist_free(hosts); | 792 g_slist_free(hosts); |
788 } | 793 } |
789 | 794 |
791 purple_network_set_stun_server(const gchar *stun_server) | 796 purple_network_set_stun_server(const gchar *stun_server) |
792 { | 797 { |
793 if (stun_server && stun_server[0] != '\0') { | 798 if (stun_server && stun_server[0] != '\0') { |
794 if (purple_network_is_available()) { | 799 if (purple_network_is_available()) { |
795 purple_debug_info("network", "running DNS query for STUN server\n"); | 800 purple_debug_info("network", "running DNS query for STUN server\n"); |
796 purple_dnsquery_a(stun_server, 3478, purple_network_stun_lookup_cb, | 801 purple_dnsquery_a(stun_server, 3478, purple_network_ip_lookup_cb, |
797 NULL); | 802 &stun_ip); |
798 } else { | 803 } else { |
799 purple_debug_info("network", | 804 purple_debug_info("network", |
800 "network is unavailable, don't try to update STUN IP"); | 805 "network is unavailable, don't try to update STUN IP"); |
801 } | 806 } |
802 } else if (stun_ip) { | 807 } else if (stun_ip) { |
803 g_free(stun_ip); | 808 g_free(stun_ip); |
804 stun_ip = NULL; | 809 stun_ip = NULL; |
805 } | 810 } |
806 } | 811 } |
807 | 812 |
813 void | |
814 purple_network_set_turn_server(const gchar *turn_server) | |
815 { | |
816 if (turn_server && turn_server[0] != '\0') { | |
817 if (purple_network_is_available()) { | |
818 purple_debug_info("network", "running DNS query for TURN server\n"); | |
819 purple_dnsquery_a(turn_server, | |
820 purple_prefs_get_int("/purple/network/turn_port"), | |
821 purple_network_ip_lookup_cb, &turn_ip); | |
822 } else { | |
823 purple_debug_info("network", | |
824 "network is unavailable, don't try to update TURN IP"); | |
825 } | |
826 } else if (turn_ip) { | |
827 g_free(turn_ip); | |
828 turn_ip = NULL; | |
829 } | |
830 } | |
831 | |
832 | |
808 const gchar * | 833 const gchar * |
809 purple_network_get_stun_ip(void) | 834 purple_network_get_stun_ip(void) |
810 { | 835 { |
811 return stun_ip; | 836 return stun_ip; |
837 } | |
838 | |
839 const gchar * | |
840 purple_network_get_turn_ip(void) | |
841 { | |
842 return turn_ip; | |
812 } | 843 } |
813 | 844 |
814 void * | 845 void * |
815 purple_network_get_handle(void) | 846 purple_network_get_handle(void) |
816 { | 847 { |
841 } | 872 } |
842 #endif | 873 #endif |
843 | 874 |
844 purple_prefs_add_none ("/purple/network"); | 875 purple_prefs_add_none ("/purple/network"); |
845 purple_prefs_add_string("/purple/network/stun_server", ""); | 876 purple_prefs_add_string("/purple/network/stun_server", ""); |
877 purple_prefs_add_string("/purple/network/turn_server", ""); | |
878 purple_prefs_add_int ("/purple/network/turn_port", 3478); | |
879 purple_prefs_add_string("/purple/network/turn_username", ""); | |
880 purple_prefs_add_string("/purple/network/turn_password", ""); | |
846 purple_prefs_add_bool ("/purple/network/auto_ip", TRUE); | 881 purple_prefs_add_bool ("/purple/network/auto_ip", TRUE); |
847 purple_prefs_add_string("/purple/network/public_ip", ""); | 882 purple_prefs_add_string("/purple/network/public_ip", ""); |
848 purple_prefs_add_bool ("/purple/network/map_ports", TRUE); | 883 purple_prefs_add_bool ("/purple/network/map_ports", TRUE); |
849 purple_prefs_add_bool ("/purple/network/ports_range_use", FALSE); | 884 purple_prefs_add_bool ("/purple/network/ports_range_use", FALSE); |
850 purple_prefs_add_int ("/purple/network/ports_range_start", 1024); | 885 purple_prefs_add_int ("/purple/network/ports_range_start", 1024); |
882 purple_pmp_init(); | 917 purple_pmp_init(); |
883 purple_upnp_init(); | 918 purple_upnp_init(); |
884 | 919 |
885 purple_network_set_stun_server( | 920 purple_network_set_stun_server( |
886 purple_prefs_get_string("/purple/network/stun_server")); | 921 purple_prefs_get_string("/purple/network/stun_server")); |
922 purple_network_set_turn_server( | |
923 purple_prefs_get_string("/purple/network/turn_server")); | |
887 } | 924 } |
888 | 925 |
889 void | 926 void |
890 purple_network_uninit(void) | 927 purple_network_uninit(void) |
891 { | 928 { |