| 371 PurpleNetworkListenData *listen_data; |
372 PurpleNetworkListenData *listen_data; |
| 372 gint *key = g_new(gint, 1); |
373 gint *key = g_new(gint, 1); |
| 373 gint *value = g_new(gint, 1); |
374 gint *value = g_new(gint, 1); |
| 374 |
375 |
| 375 listen_data = data; |
376 listen_data = data; |
| |
377 listen_data->timer = 0; |
| 376 |
378 |
| 377 /* add port mapping to hash table */ |
379 /* add port mapping to hash table */ |
| 378 *key = purple_network_get_port_from_fd(listen_data->listenfd); |
380 *key = purple_network_get_port_from_fd(listen_data->listenfd); |
| 379 *value = listen_data->socket_type; |
381 *value = listen_data->socket_type; |
| 380 g_hash_table_insert(nat_pmp_port_mappings, key, value); |
382 g_hash_table_insert(nat_pmp_port_mappings, key, value); |
| 502 if (!purple_socket_speaks_ipv4(listenfd) || !listen_map_external || |
504 if (!purple_socket_speaks_ipv4(listenfd) || !listen_map_external || |
| 503 !purple_prefs_get_bool("/purple/network/map_ports")) |
505 !purple_prefs_get_bool("/purple/network/map_ports")) |
| 504 { |
506 { |
| 505 purple_debug_info("network", "Skipping external port mapping.\n"); |
507 purple_debug_info("network", "Skipping external port mapping.\n"); |
| 506 /* The pmp_map_cb does what we want to do */ |
508 /* The pmp_map_cb does what we want to do */ |
| 507 purple_timeout_add(0, purple_network_finish_pmp_map_cb, listen_data); |
509 listen_data->timer = purple_timeout_add(0, purple_network_finish_pmp_map_cb, listen_data); |
| 508 } |
510 } |
| 509 /* Attempt a NAT-PMP Mapping, which will return immediately */ |
511 /* Attempt a NAT-PMP Mapping, which will return immediately */ |
| 510 else if (purple_pmp_create_map(((socket_type == SOCK_STREAM) ? PURPLE_PMP_TYPE_TCP : PURPLE_PMP_TYPE_UDP), |
512 else if (purple_pmp_create_map(((socket_type == SOCK_STREAM) ? PURPLE_PMP_TYPE_TCP : PURPLE_PMP_TYPE_UDP), |
| 511 actual_port, actual_port, PURPLE_PMP_LIFETIME)) |
513 actual_port, actual_port, PURPLE_PMP_LIFETIME)) |
| 512 { |
514 { |
| 513 purple_debug_info("network", "Created NAT-PMP mapping on port %i\n", actual_port); |
515 purple_debug_info("network", "Created NAT-PMP mapping on port %i\n", actual_port); |
| 514 /* We want to return listen_data now, and on the next run loop trigger the cb and destroy listen_data */ |
516 /* We want to return listen_data now, and on the next run loop trigger the cb and destroy listen_data */ |
| 515 purple_timeout_add(0, purple_network_finish_pmp_map_cb, listen_data); |
517 listen_data->timer = purple_timeout_add(0, purple_network_finish_pmp_map_cb, listen_data); |
| 516 } |
518 } |
| 517 else |
519 else |
| 518 { |
520 { |
| 519 /* Attempt a UPnP Mapping */ |
521 /* Attempt a UPnP Mapping */ |
| 520 listen_data->mapping_data = purple_upnp_set_port_mapping( |
522 listen_data->mapping_data = purple_upnp_set_port_mapping( |