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