Mercurial > pidgin
annotate libgaim/network.c @ 15209:ffec45ff82d0
[gaim-migrate @ 17999]
Setting this namespaced attribute will tell the Google Talk servers that we can accept back a JID from the bind result that isn't necessarily related to the one we requested. This allows googlemail.com users to enter gmail.com as their server and still authenticate properly. Technically, we shouldn't need an attribute like this (this is all valid XMPP), but lesser clients might choke on this.
committer: Tailor Script <tailor@pidgin.im>
| author | Sean Egan <seanegan@gmail.com> |
|---|---|
| date | Thu, 14 Dec 2006 22:25:18 +0000 |
| parents | f58283ce58ea |
| children | ae58cf5a441f |
| rev | line source |
|---|---|
| 14192 | 1 /** |
| 2 * @file network.c Network Implementation | |
| 3 * @ingroup core | |
| 4 * | |
| 5 * gaim | |
| 6 * | |
| 7 * Gaim is the legal property of its developers, whose names are too numerous | |
| 8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
| 9 * source distribution. | |
| 10 * | |
| 11 * This program is free software; you can redistribute it and/or modify | |
| 12 * it under the terms of the GNU General Public License as published by | |
| 13 * the Free Software Foundation; either version 2 of the License, or | |
| 14 * (at your option) any later version. | |
| 15 * | |
| 16 * This program is distributed in the hope that it will be useful, | |
| 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 19 * GNU General Public License for more details. | |
| 20 * | |
| 21 * You should have received a copy of the GNU General Public License | |
| 22 * along with this program; if not, write to the Free Software | |
| 23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 24 */ | |
| 25 | |
| 26 #include "internal.h" | |
| 27 | |
| 28 #ifndef _WIN32 | |
| 14802 | 29 #include <resolv.h> |
| 30 #include <netinet/in.h> | |
| 31 #include <arpa/nameser.h> | |
| 14192 | 32 #include <net/if.h> |
| 33 #include <sys/ioctl.h> | |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
34 #else |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
35 #include <nspapi.h> |
| 14192 | 36 #endif |
| 37 | |
| 38 /* Solaris */ | |
| 39 #if defined (__SVR4) && defined (__sun) | |
| 40 #include <sys/sockio.h> | |
| 41 #endif | |
| 42 | |
| 43 #include "debug.h" | |
| 44 #include "account.h" | |
| 45 #include "network.h" | |
| 46 #include "prefs.h" | |
| 47 #include "stun.h" | |
| 48 #include "upnp.h" | |
| 49 | |
| 14696 | 50 #ifdef HAVE_LIBNM |
| 51 #include <libnm_glib.h> | |
| 52 | |
| 53 libnm_glib_ctx *nm_context = NULL; | |
| 54 guint nm_callback_idx = 0; | |
| 55 | |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
56 #elif defined _WIN32 |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
57 static int current_network_count; |
| 14696 | 58 #endif |
| 59 | |
| 14267 | 60 struct _GaimNetworkListenData { |
| 14192 | 61 int listenfd; |
| 62 int socket_type; | |
| 63 gboolean retry; | |
| 64 gboolean adding; | |
| 65 GaimNetworkListenCallback cb; | |
| 66 gpointer cb_data; | |
| 14267 | 67 }; |
| 14192 | 68 |
| 14696 | 69 #ifdef HAVE_LIBNM |
| 70 void nm_callback_func(libnm_glib_ctx* ctx, gpointer user_data); | |
| 71 #endif | |
| 72 | |
| 14192 | 73 const unsigned char * |
| 74 gaim_network_ip_atoi(const char *ip) | |
| 75 { | |
| 76 static unsigned char ret[4]; | |
| 77 gchar *delimiter = "."; | |
| 78 gchar **split; | |
| 79 int i; | |
| 80 | |
| 81 g_return_val_if_fail(ip != NULL, NULL); | |
| 82 | |
| 83 split = g_strsplit(ip, delimiter, 4); | |
| 84 for (i = 0; split[i] != NULL; i++) | |
| 85 ret[i] = atoi(split[i]); | |
| 86 g_strfreev(split); | |
| 87 | |
| 88 /* i should always be 4 */ | |
| 89 if (i != 4) | |
| 90 return NULL; | |
| 91 | |
| 92 return ret; | |
| 93 } | |
| 94 | |
| 95 void | |
| 96 gaim_network_set_public_ip(const char *ip) | |
| 97 { | |
| 98 g_return_if_fail(ip != NULL); | |
| 99 | |
| 100 /* XXX - Ensure the IP address is valid */ | |
| 101 | |
| 102 gaim_prefs_set_string("/core/network/public_ip", ip); | |
| 103 } | |
| 104 | |
| 105 const char * | |
| 106 gaim_network_get_public_ip(void) | |
| 107 { | |
| 108 return gaim_prefs_get_string("/core/network/public_ip"); | |
| 109 } | |
| 110 | |
| 111 const char * | |
| 112 gaim_network_get_local_system_ip(int fd) | |
| 113 { | |
| 114 char buffer[1024]; | |
| 115 static char ip[16]; | |
| 116 char *tmp; | |
| 117 struct ifconf ifc; | |
| 118 struct ifreq *ifr; | |
| 119 struct sockaddr_in *sinptr; | |
| 120 guint32 lhost = htonl(127 * 256 * 256 * 256 + 1); | |
| 121 long unsigned int add; | |
| 122 int source = fd; | |
| 123 | |
| 124 if (fd < 0) | |
| 125 source = socket(PF_INET,SOCK_STREAM, 0); | |
| 126 | |
| 127 ifc.ifc_len = sizeof(buffer); | |
| 128 ifc.ifc_req = (struct ifreq *)buffer; | |
| 129 ioctl(source, SIOCGIFCONF, &ifc); | |
| 130 | |
| 131 if (fd < 0) | |
| 132 close(source); | |
| 133 | |
| 134 tmp = buffer; | |
| 135 while (tmp < buffer + ifc.ifc_len) | |
| 136 { | |
| 137 ifr = (struct ifreq *)tmp; | |
| 138 tmp += sizeof(struct ifreq); | |
| 139 | |
| 140 if (ifr->ifr_addr.sa_family == AF_INET) | |
| 141 { | |
| 142 sinptr = (struct sockaddr_in *)&ifr->ifr_addr; | |
| 143 if (sinptr->sin_addr.s_addr != lhost) | |
| 144 { | |
| 145 add = ntohl(sinptr->sin_addr.s_addr); | |
| 146 g_snprintf(ip, 16, "%lu.%lu.%lu.%lu", | |
| 147 ((add >> 24) & 255), | |
| 148 ((add >> 16) & 255), | |
| 149 ((add >> 8) & 255), | |
| 150 add & 255); | |
| 151 | |
| 152 return ip; | |
| 153 } | |
| 154 } | |
| 155 } | |
| 156 | |
| 157 return "0.0.0.0"; | |
| 158 } | |
| 159 | |
| 160 const char * | |
| 161 gaim_network_get_my_ip(int fd) | |
| 162 { | |
| 163 const char *ip = NULL; | |
| 164 GaimStunNatDiscovery *stun; | |
| 165 | |
| 166 /* Check if the user specified an IP manually */ | |
| 167 if (!gaim_prefs_get_bool("/core/network/auto_ip")) { | |
| 168 ip = gaim_network_get_public_ip(); | |
| 15054 | 169 /* Make sure the IP address entered by the user is valid */ |
| 170 if ((ip != NULL) && (gaim_network_ip_atoi(ip) != NULL)) | |
| 14192 | 171 return ip; |
| 172 } | |
| 173 | |
| 174 /* Check if STUN discovery was already done */ | |
| 175 stun = gaim_stun_discover(NULL); | |
| 176 if ((stun != NULL) && (stun->status == GAIM_STUN_STATUS_DISCOVERED)) | |
| 177 return stun->publicip; | |
| 178 | |
| 179 /* Attempt to get the IP from a NAT device using UPnP */ | |
| 180 ip = gaim_upnp_get_public_ip(); | |
| 181 if (ip != NULL) | |
| 182 return ip; | |
| 183 | |
| 184 /* Just fetch the IP of the local system */ | |
| 185 return gaim_network_get_local_system_ip(fd); | |
| 186 } | |
| 187 | |
| 188 | |
| 189 static void | |
| 190 gaim_network_set_upnp_port_mapping_cb(gboolean success, gpointer data) | |
| 191 { | |
| 14267 | 192 GaimNetworkListenData *listen_data; |
| 193 | |
| 194 listen_data = data; | |
| 195 /* TODO: Once we're keeping track of upnp requests... */ | |
| 196 /* listen_data->pnp_data = NULL; */ | |
| 14192 | 197 |
| 198 if (!success) { | |
| 199 gaim_debug_info("network", "Couldn't create UPnP mapping\n"); | |
| 14267 | 200 if (listen_data->retry) { |
| 201 listen_data->retry = FALSE; | |
| 202 listen_data->adding = FALSE; | |
| 203 /* TODO: Need to keep track of this return value! */ | |
| 14192 | 204 gaim_upnp_remove_port_mapping( |
| 14267 | 205 gaim_network_get_port_from_fd(listen_data->listenfd), |
| 206 (listen_data->socket_type == SOCK_STREAM) ? "TCP" : "UDP", | |
| 207 gaim_network_set_upnp_port_mapping_cb, listen_data); | |
| 14192 | 208 return; |
| 209 } | |
| 14267 | 210 } else if (!listen_data->adding) { |
| 14192 | 211 /* We've tried successfully to remove the port mapping. |
| 212 * Try to add it again */ | |
| 14267 | 213 listen_data->adding = TRUE; |
| 214 /* TODO: Need to keep track of this return value! */ | |
| 14192 | 215 gaim_upnp_set_port_mapping( |
| 14267 | 216 gaim_network_get_port_from_fd(listen_data->listenfd), |
| 217 (listen_data->socket_type == SOCK_STREAM) ? "TCP" : "UDP", | |
| 218 gaim_network_set_upnp_port_mapping_cb, listen_data); | |
| 14192 | 219 return; |
| 220 } | |
| 221 | |
| 14267 | 222 if (listen_data->cb) |
| 223 listen_data->cb(listen_data->listenfd, listen_data->cb_data); | |
| 14192 | 224 |
| 14267 | 225 gaim_network_listen_cancel(listen_data); |
| 14192 | 226 } |
| 227 | |
| 228 | |
| 14267 | 229 static GaimNetworkListenData * |
| 14192 | 230 gaim_network_do_listen(unsigned short port, int socket_type, GaimNetworkListenCallback cb, gpointer cb_data) |
| 231 { | |
| 232 int listenfd = -1; | |
| 233 const int on = 1; | |
| 14267 | 234 GaimNetworkListenData *listen_data; |
| 14192 | 235 #ifdef HAVE_GETADDRINFO |
| 236 int errnum; | |
| 237 struct addrinfo hints, *res, *next; | |
| 238 char serv[6]; | |
| 239 | |
| 240 /* | |
| 241 * Get a list of addresses on this machine. | |
| 242 */ | |
| 243 snprintf(serv, sizeof(serv), "%hu", port); | |
| 244 memset(&hints, 0, sizeof(struct addrinfo)); | |
| 245 hints.ai_flags = AI_PASSIVE; | |
| 246 hints.ai_family = AF_UNSPEC; | |
| 247 hints.ai_socktype = socket_type; | |
| 248 errnum = getaddrinfo(NULL /* any IP */, serv, &hints, &res); | |
| 249 if (errnum != 0) { | |
| 250 #ifndef _WIN32 | |
| 251 gaim_debug_warning("network", "getaddrinfo: %s\n", gai_strerror(errnum)); | |
| 252 if (errnum == EAI_SYSTEM) | |
| 253 gaim_debug_warning("network", "getaddrinfo: system error: %s\n", strerror(errno)); | |
| 254 #else | |
| 255 gaim_debug_warning("network", "getaddrinfo: Error Code = %d\n", errnum); | |
| 256 #endif | |
| 14267 | 257 return NULL; |
| 14192 | 258 } |
| 259 | |
| 260 /* | |
| 261 * Go through the list of addresses and attempt to listen on | |
| 262 * one of them. | |
| 263 * XXX - Try IPv6 addresses first? | |
| 264 */ | |
| 265 for (next = res; next != NULL; next = next->ai_next) { | |
| 266 listenfd = socket(next->ai_family, next->ai_socktype, next->ai_protocol); | |
| 267 if (listenfd < 0) | |
| 268 continue; | |
| 269 if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) != 0) | |
| 270 gaim_debug_warning("network", "setsockopt: %s\n", strerror(errno)); | |
| 271 if (bind(listenfd, next->ai_addr, next->ai_addrlen) == 0) | |
| 272 break; /* success */ | |
| 273 /* XXX - It is unclear to me (datallah) whether we need to be | |
| 274 using a new socket each time */ | |
| 275 close(listenfd); | |
| 276 } | |
| 277 | |
| 278 freeaddrinfo(res); | |
| 279 | |
| 280 if (next == NULL) | |
| 14267 | 281 return NULL; |
| 14192 | 282 #else |
| 283 struct sockaddr_in sockin; | |
| 284 | |
| 285 if ((listenfd = socket(AF_INET, socket_type, 0)) < 0) { | |
| 286 gaim_debug_warning("network", "socket: %s\n", strerror(errno)); | |
| 14267 | 287 return NULL; |
| 14192 | 288 } |
| 289 | |
| 290 if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) != 0) | |
| 291 gaim_debug_warning("network", "setsockopt: %s\n", strerror(errno)); | |
| 292 | |
| 293 memset(&sockin, 0, sizeof(struct sockaddr_in)); | |
| 294 sockin.sin_family = PF_INET; | |
| 295 sockin.sin_port = htons(port); | |
| 296 | |
| 297 if (bind(listenfd, (struct sockaddr *)&sockin, sizeof(struct sockaddr_in)) != 0) { | |
| 298 gaim_debug_warning("network", "bind: %s\n", strerror(errno)); | |
| 299 close(listenfd); | |
| 14267 | 300 return NULL; |
| 14192 | 301 } |
| 302 #endif | |
| 303 | |
| 304 if (socket_type == SOCK_STREAM && listen(listenfd, 4) != 0) { | |
| 305 gaim_debug_warning("network", "listen: %s\n", strerror(errno)); | |
| 306 close(listenfd); | |
| 14267 | 307 return NULL; |
| 14192 | 308 } |
| 309 fcntl(listenfd, F_SETFL, O_NONBLOCK); | |
| 310 | |
| 311 gaim_debug_info("network", "Listening on port: %hu\n", gaim_network_get_port_from_fd(listenfd)); | |
| 312 | |
| 14267 | 313 listen_data = g_new0(GaimNetworkListenData, 1); |
| 314 listen_data->listenfd = listenfd; | |
| 315 listen_data->adding = TRUE; | |
| 316 listen_data->retry = TRUE; | |
| 317 listen_data->cb = cb; | |
| 318 listen_data->cb_data = cb_data; | |
| 14192 | 319 |
| 14267 | 320 /* TODO: Need to keep track of this return value! */ |
| 14192 | 321 gaim_upnp_set_port_mapping( |
| 322 gaim_network_get_port_from_fd(listenfd), | |
| 323 (socket_type == SOCK_STREAM) ? "TCP" : "UDP", | |
| 14267 | 324 gaim_network_set_upnp_port_mapping_cb, listen_data); |
| 14192 | 325 |
| 14267 | 326 return listen_data; |
| 14192 | 327 } |
| 328 | |
| 14267 | 329 GaimNetworkListenData * |
| 14192 | 330 gaim_network_listen(unsigned short port, int socket_type, |
| 331 GaimNetworkListenCallback cb, gpointer cb_data) | |
| 332 { | |
| 14267 | 333 g_return_val_if_fail(port != 0, NULL); |
| 14192 | 334 |
| 335 return gaim_network_do_listen(port, socket_type, cb, cb_data); | |
| 336 } | |
| 337 | |
| 14267 | 338 GaimNetworkListenData * |
| 14192 | 339 gaim_network_listen_range(unsigned short start, unsigned short end, |
| 340 int socket_type, GaimNetworkListenCallback cb, gpointer cb_data) | |
| 341 { | |
| 14267 | 342 GaimNetworkListenData *ret = NULL; |
| 14192 | 343 |
| 344 if (gaim_prefs_get_bool("/core/network/ports_range_use")) { | |
| 345 start = gaim_prefs_get_int("/core/network/ports_range_start"); | |
| 346 end = gaim_prefs_get_int("/core/network/ports_range_end"); | |
| 347 } else { | |
| 348 if (end < start) | |
| 349 end = start; | |
| 350 } | |
| 351 | |
| 352 for (; start <= end; start++) { | |
| 353 ret = gaim_network_do_listen(start, socket_type, cb, cb_data); | |
| 14267 | 354 if (ret != NULL) |
| 14192 | 355 break; |
| 356 } | |
| 357 | |
| 358 return ret; | |
| 359 } | |
| 360 | |
| 14267 | 361 void gaim_network_listen_cancel(GaimNetworkListenData *listen_data) |
| 362 { | |
| 363 g_free(listen_data); | |
| 364 } | |
| 365 | |
| 14192 | 366 unsigned short |
| 367 gaim_network_get_port_from_fd(int fd) | |
| 368 { | |
| 369 struct sockaddr_in addr; | |
| 370 socklen_t len; | |
| 371 | |
| 372 g_return_val_if_fail(fd >= 0, 0); | |
| 373 | |
| 374 len = sizeof(addr); | |
| 375 if (getsockname(fd, (struct sockaddr *) &addr, &len) == -1) { | |
| 376 gaim_debug_warning("network", "getsockname: %s\n", strerror(errno)); | |
| 377 return 0; | |
| 378 } | |
| 379 | |
| 380 return ntohs(addr.sin_port); | |
| 381 } | |
| 382 | |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
383 #ifdef _WIN32 |
|
14791
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
384 #ifndef NS_NLA |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
385 #define NS_NLA 15 |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
386 #endif |
|
14780
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
387 static gint |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
388 wgaim_get_connected_network_count(void) |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
389 { |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
390 guint net_cnt = 0; |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
391 |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
392 WSAQUERYSET qs; |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
393 HANDLE h; |
|
14895
717ea4589f8d
[gaim-migrate @ 17667]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14815
diff
changeset
|
394 gint retval; |
|
717ea4589f8d
[gaim-migrate @ 17667]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14815
diff
changeset
|
395 int errorid; |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
396 |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
397 memset(&qs, 0, sizeof(WSAQUERYSET)); |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
398 qs.dwSize = sizeof(WSAQUERYSET); |
|
14791
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
399 qs.dwNameSpace = NS_NLA; |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
400 |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
401 retval = WSALookupServiceBegin(&qs, LUP_RETURN_ALL, &h); |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
402 if (retval != ERROR_SUCCESS) { |
|
14895
717ea4589f8d
[gaim-migrate @ 17667]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14815
diff
changeset
|
403 gchar *msg; |
|
717ea4589f8d
[gaim-migrate @ 17667]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14815
diff
changeset
|
404 errorid = WSAGetLastError(); |
|
717ea4589f8d
[gaim-migrate @ 17667]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14815
diff
changeset
|
405 msg = g_win32_error_message(errorid); |
|
14791
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
406 gaim_debug_warning("network", "Couldn't retrieve NLA SP lookup handle. " |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
407 "NLA service is probably not running. Message: %s (%d).\n", |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
408 msg, errorid); |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
409 g_free(msg); |
|
14776
a87c53e7b1e2
[gaim-migrate @ 17540]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14722
diff
changeset
|
410 |
|
14780
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
411 return -1; |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
412 } else { |
|
14897
e429c4ebbae5
[gaim-migrate @ 17669]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14895
diff
changeset
|
413 char buf[4096]; |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
414 WSAQUERYSET *res = (LPWSAQUERYSET) buf; |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
415 DWORD size = sizeof(buf); |
|
14895
717ea4589f8d
[gaim-migrate @ 17667]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14815
diff
changeset
|
416 while ((retval = WSALookupServiceNext(h, 0, &size, res)) == ERROR_SUCCESS) { |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
417 net_cnt++; |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
418 gaim_debug_info("network", "found network '%s'\n", |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
419 res->lpszServiceInstanceName ? res->lpszServiceInstanceName : "(NULL)"); |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
420 size = sizeof(buf); |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
421 } |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
422 |
|
14895
717ea4589f8d
[gaim-migrate @ 17667]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14815
diff
changeset
|
423 errorid = WSAGetLastError(); |
|
717ea4589f8d
[gaim-migrate @ 17667]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14815
diff
changeset
|
424 if (!(errorid == WSA_E_NO_MORE || errorid == WSAENOMORE)) { |
|
717ea4589f8d
[gaim-migrate @ 17667]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14815
diff
changeset
|
425 gchar *msg = g_win32_error_message(errorid); |
|
717ea4589f8d
[gaim-migrate @ 17667]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14815
diff
changeset
|
426 gaim_debug_error("network", "got unexpected NLA response %s (%d)\n", msg, errorid); |
|
717ea4589f8d
[gaim-migrate @ 17667]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14815
diff
changeset
|
427 g_free(msg); |
|
717ea4589f8d
[gaim-migrate @ 17667]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14815
diff
changeset
|
428 |
|
717ea4589f8d
[gaim-migrate @ 17667]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14815
diff
changeset
|
429 net_cnt = -1; |
|
717ea4589f8d
[gaim-migrate @ 17667]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14815
diff
changeset
|
430 } |
|
717ea4589f8d
[gaim-migrate @ 17667]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14815
diff
changeset
|
431 |
|
717ea4589f8d
[gaim-migrate @ 17667]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14815
diff
changeset
|
432 retval = WSALookupServiceEnd(h); |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
433 } |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
434 |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
435 return net_cnt; |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
436 |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
437 } |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
438 |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
439 static gboolean wgaim_network_change_thread_cb(gpointer data) |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
440 { |
|
14780
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
441 gint new_count; |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
442 GaimConnectionUiOps *ui_ops = gaim_connections_get_ui_ops(); |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
443 |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
444 new_count = wgaim_get_connected_network_count(); |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
445 |
|
14780
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
446 if (new_count < 0) |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
447 return FALSE; |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
448 |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
449 gaim_debug_info("network", "Received Network Change Notification. Current network count is %d, previous count was %d.\n", new_count, current_network_count); |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
450 |
| 14815 | 451 if (new_count > 0 && ui_ops != NULL && ui_ops->network_connected != NULL) { |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
452 ui_ops->network_connected(); |
| 14815 | 453 } else if (new_count == 0 && current_network_count > 0 && |
| 454 ui_ops != NULL && ui_ops->network_disconnected != NULL) { | |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
455 ui_ops->network_disconnected(); |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
456 } |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
457 |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
458 current_network_count = new_count; |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
459 |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
460 return FALSE; |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
461 } |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
462 |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
463 static gpointer wgaim_network_change_thread(gpointer data) |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
464 { |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
465 HANDLE h; |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
466 WSAQUERYSET qs; |
|
14780
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
467 time_t last_trigger = time(NULL); |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
468 |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
469 int WSAAPI (*MyWSANSPIoctl) ( |
|
14791
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
470 HANDLE hLookup, DWORD dwControlCode, LPVOID lpvInBuffer, |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
471 DWORD cbInBuffer, LPVOID lpvOutBuffer, DWORD cbOutBuffer, |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
472 LPDWORD lpcbBytesReturned, LPWSACOMPLETION lpCompletion) = NULL; |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
473 |
|
14791
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
474 if (!(MyWSANSPIoctl = (void*) wgaim_find_and_loadproc("ws2_32.dll", "WSANSPIoctl"))) { |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
475 g_thread_exit(NULL); |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
476 return NULL; |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
477 } |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
478 |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
479 while (TRUE) { |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
480 int retval; |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
481 DWORD retLen = 0; |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
482 |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
483 memset(&qs, 0, sizeof(WSAQUERYSET)); |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
484 qs.dwSize = sizeof(WSAQUERYSET); |
|
14791
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
485 qs.dwNameSpace = NS_NLA; |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
486 if (WSALookupServiceBegin(&qs, 0, &h) == SOCKET_ERROR) { |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
487 int errorid = WSAGetLastError(); |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
488 gchar *msg = g_win32_error_message(errorid); |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
489 gaim_debug_warning("network", "Couldn't retrieve NLA SP lookup handle. " |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
490 "NLA service is probably not running. Message: %s (%d).\n", |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
491 msg, errorid); |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
492 g_free(msg); |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
493 g_thread_exit(NULL); |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
494 return NULL; |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
495 } |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
496 |
|
14780
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
497 /* Make sure at least 30 seconds have elapsed since the last |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
498 * notification so we don't peg the cpu if this keeps changing. */ |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
499 if ((time(NULL) - last_trigger) < 30) |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
500 Sleep(30000); |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
501 |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
502 last_trigger = time(NULL); |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
503 |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
504 /* This will block until there is a network change */ |
|
14791
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
505 if (MyWSANSPIoctl(h, SIO_NSP_NOTIFY_CHANGE, NULL, 0, NULL, 0, &retLen, NULL) == SOCKET_ERROR) { |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
506 int errorid = WSAGetLastError(); |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
507 gchar *msg = g_win32_error_message(errorid); |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
508 gaim_debug_warning("network", "Unable to wait for changes. Message: %s (%d).\n", |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
509 msg, errorid); |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
510 g_free(msg); |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
511 } |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
512 |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
513 retval = WSALookupServiceEnd(h); |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
514 |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
515 g_idle_add(wgaim_network_change_thread_cb, NULL); |
|
14780
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
516 |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
517 } |
|
14791
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
518 |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
519 g_thread_exit(NULL); |
|
2727e465602f
[gaim-migrate @ 17556]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14780
diff
changeset
|
520 return NULL; |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
521 } |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
522 #endif |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
523 |
| 14696 | 524 gboolean |
| 525 gaim_network_is_available(void) | |
| 526 { | |
| 527 #ifdef HAVE_LIBNM | |
| 528 /* Try NetworkManager first, maybe we'll get lucky */ | |
| 529 int libnm_retval = -1; | |
| 530 | |
| 531 if (nm_context) | |
| 532 { | |
| 533 if ((libnm_retval = libnm_glib_get_network_state(nm_context)) == LIBNM_NO_NETWORK_CONNECTION) | |
| 534 { | |
| 535 gaim_debug_warning("network", "NetworkManager not active or reports no connection (retval = %i)\n", libnm_retval); | |
| 536 return FALSE; | |
| 537 } | |
| 538 if (libnm_retval == LIBNM_ACTIVE_NETWORK_CONNECTION) return TRUE; | |
| 539 } | |
|
14777
182f77347680
[gaim-migrate @ 17541]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14776
diff
changeset
|
540 #elif defined _WIN32 |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
541 return (current_network_count > 0); |
| 14696 | 542 #endif |
| 543 return TRUE; | |
| 544 } | |
| 545 | |
| 546 #ifdef HAVE_LIBNM | |
| 547 void | |
| 548 nm_callback_func(libnm_glib_ctx* ctx, gpointer user_data) | |
| 549 { | |
| 550 GList *l; | |
| 551 GaimAccount *account; | |
| 552 static libnm_glib_state prev = LIBNM_NO_DBUS; | |
| 553 libnm_glib_state current; | |
| 554 GaimConnectionUiOps *ui_ops = gaim_connections_get_ui_ops(); | |
| 555 | |
| 556 current = libnm_glib_get_network_state(ctx); | |
| 557 gaim_debug_info("network","Entering nm_callback_func!\n"); | |
| 558 | |
| 559 switch(current) | |
| 560 { | |
| 561 case LIBNM_ACTIVE_NETWORK_CONNECTION: | |
| 14800 | 562 /* Call res_init in case DNS servers have changed */ |
| 563 res_init(); | |
| 14815 | 564 if (ui_ops != NULL && ui_ops->network_connected != NULL) |
| 565 ui_ops->network_connected(); | |
| 14696 | 566 prev = current; |
| 567 break; | |
| 568 case LIBNM_NO_NETWORK_CONNECTION: | |
| 569 if (prev != LIBNM_ACTIVE_NETWORK_CONNECTION) | |
| 570 break; | |
| 14815 | 571 if (ui_ops != NULL && ui_ops->network_disconnected != NULL) |
| 572 ui_ops->network_disconnected(); | |
| 14696 | 573 prev = current; |
| 574 break; | |
| 575 case LIBNM_NO_DBUS: | |
| 576 case LIBNM_NO_NETWORKMANAGER: | |
| 577 case LIBNM_INVALID_CONTEXT: | |
| 578 default: | |
| 579 break; | |
| 580 } | |
| 581 } | |
| 582 #endif | |
| 583 | |
| 14192 | 584 void |
| 585 gaim_network_init(void) | |
| 586 { | |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
587 #ifdef _WIN32 |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
588 GError *err = NULL; |
|
14780
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
589 gint cnt = wgaim_get_connected_network_count(); |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
590 |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
591 if (cnt < 0) /* Assume there is a network */ |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
592 current_network_count = 1; |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
593 /* Don't listen for network changes if we can't tell anyway */ |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
594 else |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
595 { |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
596 current_network_count = cnt; |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
597 if (!g_thread_create(wgaim_network_change_thread, NULL, FALSE, &err)) |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
598 gaim_debug_error("network", "Couldn't create Network Monitor thread: %s\n", err ? err->message : ""); |
|
ec9cc2219e55
[gaim-migrate @ 17544]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14777
diff
changeset
|
599 } |
|
14722
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
600 #endif |
|
51685370de57
[gaim-migrate @ 17476]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
14696
diff
changeset
|
601 |
| 14192 | 602 gaim_prefs_add_none ("/core/network"); |
| 603 gaim_prefs_add_bool ("/core/network/auto_ip", TRUE); | |
| 604 gaim_prefs_add_string("/core/network/public_ip", ""); | |
| 605 gaim_prefs_add_bool ("/core/network/ports_range_use", FALSE); | |
| 606 gaim_prefs_add_int ("/core/network/ports_range_start", 1024); | |
| 607 gaim_prefs_add_int ("/core/network/ports_range_end", 2048); | |
| 608 | |
| 609 gaim_upnp_discover(NULL, NULL); | |
| 14696 | 610 |
| 611 #ifdef HAVE_LIBNM | |
| 612 nm_context = libnm_glib_init(); | |
| 613 if(nm_context) | |
| 614 nm_callback_idx = libnm_glib_register_callback(nm_context, nm_callback_func, NULL, g_main_context_default()); | |
| 615 #endif | |
| 14192 | 616 } |
| 14696 | 617 |
| 618 void | |
| 619 gaim_network_uninit(void) | |
| 620 { | |
| 621 #ifdef HAVE_LIBNM | |
| 622 /* FIXME: If anyone can think of a more clever way to shut down libnm without | |
| 623 * using a global variable + this function, please do. */ | |
| 624 if(nm_context && nm_callback_idx) | |
| 625 libnm_glib_unregister_callback(nm_context, nm_callback_idx); | |
| 626 | |
| 627 if(nm_context) | |
| 628 libnm_glib_shutdown(nm_context); | |
| 629 #endif | |
| 630 } |
