Mercurial > pidgin
comparison libpurple/network.c @ 15872:045f2e2b2de2
merge of '2ece6994d58f95af39f4e36b5e5b58116198188a'
and 'de1d579f1efd330d7acfb5a1a8e8e8957ca3ba54'
| author | Evan Schoenberg <evan.s@dreskin.net> |
|---|---|
| date | Thu, 22 Mar 2007 12:52:25 +0000 |
| parents | 9b875f0ecb86 |
| children | efdd557ed187 |
comparison
equal
deleted
inserted
replaced
| 15871:7e59202b16c1 | 15872:045f2e2b2de2 |
|---|---|
| 45 #include "network.h" | 45 #include "network.h" |
| 46 #include "prefs.h" | 46 #include "prefs.h" |
| 47 #include "stun.h" | 47 #include "stun.h" |
| 48 #include "upnp.h" | 48 #include "upnp.h" |
| 49 | 49 |
| 50 /* #define ENABLE_NAT_PMP */ | |
| 51 | |
| 50 #ifdef ENABLE_NAT_PMP | 52 #ifdef ENABLE_NAT_PMP |
| 51 #include "nat-pmp.h" | 53 #include "nat-pmp.h" |
| 52 #endif | 54 #endif |
| 53 | 55 |
| 54 /* | 56 /* |
| 77 gboolean retry; | 79 gboolean retry; |
| 78 gboolean adding; | 80 gboolean adding; |
| 79 PurpleNetworkListenCallback cb; | 81 PurpleNetworkListenCallback cb; |
| 80 gpointer cb_data; | 82 gpointer cb_data; |
| 81 UPnPMappingAddRemove *mapping_data; | 83 UPnPMappingAddRemove *mapping_data; |
| 82 #ifdef ENABLE_NAT_PMP | |
| 83 gboolean has_pmp_mapping; | |
| 84 #endif | |
| 85 }; | 84 }; |
| 86 | 85 |
| 87 #ifdef HAVE_LIBNM | 86 #ifdef HAVE_LIBNM |
| 88 void nm_callback_func(libnm_glib_ctx* ctx, gpointer user_data); | 87 void nm_callback_func(libnm_glib_ctx* ctx, gpointer user_data); |
| 89 #endif | 88 #endif |
| 249 * it otherwise. */ | 248 * it otherwise. */ |
| 250 listen_data->mapping_data = NULL; | 249 listen_data->mapping_data = NULL; |
| 251 purple_network_listen_cancel(listen_data); | 250 purple_network_listen_cancel(listen_data); |
| 252 } | 251 } |
| 253 | 252 |
| 253 static gboolean | |
| 254 purple_network_finish_pmp_map_cb(gpointer data) | |
| 255 { | |
| 256 PurpleNetworkListenData *listen_data; | |
| 257 | |
| 258 listen_data = data; | |
| 259 | |
| 260 if (listen_data->cb) | |
| 261 listen_data->cb(listen_data->listenfd, listen_data->cb_data); | |
| 262 | |
| 263 purple_network_listen_cancel(listen_data); | |
| 264 | |
| 265 return FALSE; | |
| 266 } | |
| 254 | 267 |
| 255 static PurpleNetworkListenData * | 268 static PurpleNetworkListenData * |
| 256 purple_network_do_listen(unsigned short port, int socket_type, PurpleNetworkListenCallback cb, gpointer cb_data) | 269 purple_network_do_listen(unsigned short port, int socket_type, PurpleNetworkListenCallback cb, gpointer cb_data) |
| 257 { | 270 { |
| 258 int listenfd = -1; | 271 int listenfd = -1; |
| 346 listen_data->cb = cb; | 359 listen_data->cb = cb; |
| 347 listen_data->cb_data = cb_data; | 360 listen_data->cb_data = cb_data; |
| 348 | 361 |
| 349 #ifdef ENABLE_NAT_PMP | 362 #ifdef ENABLE_NAT_PMP |
| 350 /* Attempt a NAT-PMP Mapping, which will return immediately */ | 363 /* Attempt a NAT-PMP Mapping, which will return immediately */ |
| 351 listen_data->has_pmp_mapping = (purple_pmp_create_map(((socket_type == SOCK_STREAM) ? PURPLE_PMP_TYPE_TCP : PURPLE_PMP_TYPE_UDP), | 364 if (purple_pmp_create_map(((socket_type == SOCK_STREAM) ? PURPLE_PMP_TYPE_TCP : PURPLE_PMP_TYPE_UDP), |
| 352 actual_port, actual_port, PURPLE_PMP_LIFETIME) != NULL); | 365 actual_port, actual_port, PURPLE_PMP_LIFETIME) != NULL) |
| 353 #endif | 366 { |
| 354 | 367 purple_debug_info("network", "Created NAT-PMP mapping on port %i",actual_port); |
| 355 /* Attempt a UPnP Mapping */ | 368 /* We want to return listen_data now, and on the next run loop trigger the cb and destroy listen_data */ |
| 356 listen_data->mapping_data = purple_upnp_set_port_mapping( | 369 purple_timeout_add(0, purple_network_finish_pmp_map_cb, listen_data); |
| 357 actual_port, | 370 } |
| 358 (socket_type == SOCK_STREAM) ? "TCP" : "UDP", | 371 else |
| 359 purple_network_set_upnp_port_mapping_cb, listen_data); | 372 #endif |
| 373 { | |
| 374 /* Attempt a UPnP Mapping */ | |
| 375 listen_data->mapping_data = purple_upnp_set_port_mapping( | |
| 376 actual_port, | |
| 377 (socket_type == SOCK_STREAM) ? "TCP" : "UDP", | |
| 378 purple_network_set_upnp_port_mapping_cb, listen_data); | |
| 379 } | |
| 360 | 380 |
| 361 return listen_data; | 381 return listen_data; |
| 362 } | 382 } |
| 363 | 383 |
| 364 PurpleNetworkListenData * | 384 PurpleNetworkListenData * |
| 395 | 415 |
| 396 void purple_network_listen_cancel(PurpleNetworkListenData *listen_data) | 416 void purple_network_listen_cancel(PurpleNetworkListenData *listen_data) |
| 397 { | 417 { |
| 398 if (listen_data->mapping_data != NULL) | 418 if (listen_data->mapping_data != NULL) |
| 399 purple_upnp_cancel_port_mapping(listen_data->mapping_data); | 419 purple_upnp_cancel_port_mapping(listen_data->mapping_data); |
| 400 | |
| 401 #ifdef ENABLE_NAT_PMP | |
| 402 if (listen_data->has_pmp_mapping) | |
| 403 purple_pmp_destroy_map(((listen_data->socket_type == SOCK_STREAM) ? PURPLE_PMP_TYPE_TCP : PURPLE_PMP_TYPE_UDP), | |
| 404 purple_network_get_port_from_fd(listen_data->listenfd)); | |
| 405 #endif | |
| 406 | 420 |
| 407 g_free(listen_data); | 421 g_free(listen_data); |
| 408 } | 422 } |
| 409 | 423 |
| 410 unsigned short | 424 unsigned short |
