comparison libpurple/network.c @ 31558:ce968e115c95

propagate from branch 'im.pidgin.cpw.masca.p2p' (head 33ca865dacb9e5bcf763d06f6a42cbaca337cc64) to branch 'im.pidgin.pidgin' (head 92f47f4e8b0cbb107fd97e1ab814d1cedbf109ad)
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Fri, 06 May 2011 06:25:14 +0000
parents b671728e6ee9
children 8b434ffd4efc
comparison
equal deleted inserted replaced
31557:f021d93a1f9b 31558:ce968e115c95
69 69
70 #ifdef HAVE_NETWORKMANAGER 70 #ifdef HAVE_NETWORKMANAGER
71 #include <dbus/dbus-glib.h> 71 #include <dbus/dbus-glib.h>
72 #include <NetworkManager.h> 72 #include <NetworkManager.h>
73 73
74 #if !defined(NM_CHECK_VERSION)
75 #define NM_CHECK_VERSION(x,y,z) 0
76 #endif
77
74 static DBusGConnection *nm_conn = NULL; 78 static DBusGConnection *nm_conn = NULL;
75 static DBusGProxy *nm_proxy = NULL; 79 static DBusGProxy *nm_proxy = NULL;
76 static DBusGProxy *dbus_proxy = NULL; 80 static DBusGProxy *dbus_proxy = NULL;
77 static NMState nm_state = NM_STATE_UNKNOWN; 81 static NMState nm_state = NM_STATE_UNKNOWN;
78 static gboolean have_nm_state = FALSE; 82 static gboolean have_nm_state = FALSE;
269 if (ifr->ifr_addr.sa_family == AF_INET) { 273 if (ifr->ifr_addr.sa_family == AF_INET) {
270 struct sockaddr_in *sinptr = (struct sockaddr_in *)&ifr->ifr_addr; 274 struct sockaddr_in *sinptr = (struct sockaddr_in *)&ifr->ifr_addr;
271 275
272 inet_ntop(AF_INET, &sinptr->sin_addr, dst, 276 inet_ntop(AF_INET, &sinptr->sin_addr, dst,
273 sizeof(dst)); 277 sizeof(dst));
274 purple_debug_info("network", 278 purple_debug_info("network",
275 "found local i/f with address %s on IPv4\n", dst); 279 "found local i/f with address %s on IPv4\n", dst);
276 if (!purple_strequal(dst, "127.0.0.1")) { 280 if (!purple_strequal(dst, "127.0.0.1")) {
277 result = g_list_append(result, g_strdup(dst)); 281 result = g_list_append(result, g_strdup(dst));
278 } 282 }
279 } 283 }
861 865
862 purple_signal_emit(purple_network_get_handle(), "network-configuration-changed", NULL); 866 purple_signal_emit(purple_network_get_handle(), "network-configuration-changed", NULL);
863 867
864 switch(state) 868 switch(state)
865 { 869 {
870 #if NM_CHECK_VERSION(0,8,992)
871 case NM_STATE_CONNECTED_LOCAL:
872 case NM_STATE_CONNECTED_SITE:
873 case NM_STATE_CONNECTED_GLOBAL:
874 #else
866 case NM_STATE_CONNECTED: 875 case NM_STATE_CONNECTED:
876 #endif
867 /* Call res_init in case DNS servers have changed */ 877 /* Call res_init in case DNS servers have changed */
868 res_init(); 878 res_init();
869 /* update STUN IP in case we it changed (theoretically we could 879 /* update STUN IP in case we it changed (theoretically we could
870 have gone from IPv4 to IPv6, f.ex. or we were previously 880 have gone from IPv4 to IPv6, f.ex. or we were previously
871 offline */ 881 offline */
872 purple_network_set_stun_server( 882 purple_network_set_stun_server(
873 purple_prefs_get_string("/purple/network/stun_server")); 883 purple_prefs_get_string("/purple/network/stun_server"));
874 purple_network_set_turn_server( 884 purple_network_set_turn_server(
875 purple_prefs_get_string("/purple/network/turn_server")); 885 purple_prefs_get_string("/purple/network/turn_server"));
876 886
877 if (ui_ops != NULL && ui_ops->network_connected != NULL) 887 if (ui_ops != NULL && ui_ops->network_connected != NULL)
878 ui_ops->network_connected(); 888 ui_ops->network_connected();
879 break; 889 break;
880 case NM_STATE_ASLEEP: 890 case NM_STATE_ASLEEP:
881 case NM_STATE_CONNECTING: 891 case NM_STATE_CONNECTING:
882 case NM_STATE_DISCONNECTED: 892 case NM_STATE_DISCONNECTED:
893 #if NM_CHECK_VERSION(0,8,992)
894 case NM_STATE_DISCONNECTING:
895 #endif
883 if (prev != NM_STATE_CONNECTED && prev != NM_STATE_UNKNOWN) 896 if (prev != NM_STATE_CONNECTED && prev != NM_STATE_UNKNOWN)
884 break; 897 break;
885 if (ui_ops != NULL && ui_ops->network_disconnected != NULL) 898 if (ui_ops != NULL && ui_ops->network_disconnected != NULL)
886 ui_ops->network_disconnected(); 899 ui_ops->network_disconnected();
887 break; 900 break;
934 } 947 }
935 948
936 #endif 949 #endif
937 950
938 static void 951 static void
939 purple_network_ip_lookup_cb(GSList *hosts, gpointer data, 952 purple_network_ip_lookup_cb(GSList *hosts, gpointer data,
940 const char *error_message) 953 const char *error_message)
941 { 954 {
942 const gchar **ip = (const gchar **) data; 955 const gchar **ip = (const gchar **) data;
943 956
944 if (error_message) { 957 if (error_message) {
945 purple_debug_error("network", "lookup of IP address failed: %s\n", 958 purple_debug_error("network", "lookup of IP address failed: %s\n",
946 error_message); 959 error_message);
947 g_slist_free(hosts); 960 g_slist_free(hosts);
948 return; 961 return;
949 } 962 }
950 963
951 if (hosts && g_slist_next(hosts)) { 964 if (hosts && g_slist_next(hosts)) {
952 struct sockaddr *addr = g_slist_next(hosts)->data; 965 struct sockaddr *addr = g_slist_next(hosts)->data;
953 char dst[INET6_ADDRSTRLEN]; 966 char dst[INET6_ADDRSTRLEN];
954 967
955 if (addr->sa_family == AF_INET6) { 968 if (addr->sa_family == AF_INET6) {
956 inet_ntop(addr->sa_family, &((struct sockaddr_in6 *) addr)->sin6_addr, 969 inet_ntop(addr->sa_family, &((struct sockaddr_in6 *) addr)->sin6_addr,
957 dst, sizeof(dst)); 970 dst, sizeof(dst));
958 } else { 971 } else {
959 inet_ntop(addr->sa_family, &((struct sockaddr_in *) addr)->sin_addr, 972 inet_ntop(addr->sa_family, &((struct sockaddr_in *) addr)->sin_addr,
960 dst, sizeof(dst)); 973 dst, sizeof(dst));
961 } 974 }
962 975
963 *ip = g_strdup(dst); 976 *ip = g_strdup(dst);
964 purple_debug_info("network", "set IP address: %s\n", *ip); 977 purple_debug_info("network", "set IP address: %s\n", *ip);
976 purple_network_set_stun_server(const gchar *stun_server) 989 purple_network_set_stun_server(const gchar *stun_server)
977 { 990 {
978 if (stun_server && stun_server[0] != '\0') { 991 if (stun_server && stun_server[0] != '\0') {
979 if (purple_network_is_available()) { 992 if (purple_network_is_available()) {
980 purple_debug_info("network", "running DNS query for STUN server\n"); 993 purple_debug_info("network", "running DNS query for STUN server\n");
981 purple_dnsquery_a(stun_server, 3478, purple_network_ip_lookup_cb, 994 purple_dnsquery_a_account(NULL, stun_server, 3478, purple_network_ip_lookup_cb,
982 &stun_ip); 995 &stun_ip);
983 } else { 996 } else {
984 purple_debug_info("network", 997 purple_debug_info("network",
985 "network is unavailable, don't try to update STUN IP"); 998 "network is unavailable, don't try to update STUN IP");
986 } 999 }
987 } else if (stun_ip) { 1000 } else if (stun_ip) {
988 g_free(stun_ip); 1001 g_free(stun_ip);
989 stun_ip = NULL; 1002 stun_ip = NULL;
994 purple_network_set_turn_server(const gchar *turn_server) 1007 purple_network_set_turn_server(const gchar *turn_server)
995 { 1008 {
996 if (turn_server && turn_server[0] != '\0') { 1009 if (turn_server && turn_server[0] != '\0') {
997 if (purple_network_is_available()) { 1010 if (purple_network_is_available()) {
998 purple_debug_info("network", "running DNS query for TURN server\n"); 1011 purple_debug_info("network", "running DNS query for TURN server\n");
999 purple_dnsquery_a(turn_server, 1012 purple_dnsquery_a_account(NULL, turn_server,
1000 purple_prefs_get_int("/purple/network/turn_port"), 1013 purple_prefs_get_int("/purple/network/turn_port"),
1001 purple_network_ip_lookup_cb, &turn_ip); 1014 purple_network_ip_lookup_cb, &turn_ip);
1002 } else { 1015 } else {
1003 purple_debug_info("network", 1016 purple_debug_info("network",
1004 "network is unavailable, don't try to update TURN IP"); 1017 "network is unavailable, don't try to update TURN IP");
1005 } 1018 }
1006 } else if (turn_ip) { 1019 } else if (turn_ip) {
1007 g_free(turn_ip); 1020 g_free(turn_ip);
1008 turn_ip = NULL; 1021 turn_ip = NULL;