comparison libpurple/network.c @ 32819:2c6510167895 default tip

propagate from branch 'im.pidgin.pidgin.2.x.y' (head 3315c5dfbd0ad16511bdcf865e5b07c02d07df24) to branch 'im.pidgin.pidgin' (head cbd1eda6bcbf0565ae7766396bb8f6f419cb6a9a)
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Sat, 02 Jun 2012 02:30:49 +0000
parents 0c2efa69492b
children
comparison
equal deleted inserted replaced
32818:01ff09d4a463 32819:2c6510167895
389 purple_network_listen_cancel(listen_data); 389 purple_network_listen_cancel(listen_data);
390 390
391 return FALSE; 391 return FALSE;
392 } 392 }
393 393
394 static gboolean listen_map_external = TRUE;
395 void purple_network_listen_map_external(gboolean map_external)
396 {
397 listen_map_external = map_external;
398 }
399
400 static PurpleNetworkListenData * 394 static PurpleNetworkListenData *
401 purple_network_do_listen(unsigned short port, int socket_family, int socket_type, PurpleNetworkListenCallback cb, gpointer cb_data) 395 purple_network_do_listen(unsigned short port, int socket_family, int socket_type, gboolean map_external,
396 PurpleNetworkListenCallback cb, gpointer cb_data)
402 { 397 {
403 int listenfd = -1; 398 int listenfd = -1;
404 int flags; 399 int flags;
405 const int on = 1; 400 const int on = 1;
406 PurpleNetworkListenData *listen_data; 401 PurpleNetworkListenData *listen_data;
501 listen_data->retry = TRUE; 496 listen_data->retry = TRUE;
502 listen_data->cb = cb; 497 listen_data->cb = cb;
503 listen_data->cb_data = cb_data; 498 listen_data->cb_data = cb_data;
504 listen_data->socket_type = socket_type; 499 listen_data->socket_type = socket_type;
505 500
506 if (!purple_socket_speaks_ipv4(listenfd) || !listen_map_external || 501 if (!purple_socket_speaks_ipv4(listenfd) || !map_external ||
507 !purple_prefs_get_bool("/purple/network/map_ports")) 502 !purple_prefs_get_bool("/purple/network/map_ports"))
508 { 503 {
509 purple_debug_info("network", "Skipping external port mapping.\n"); 504 purple_debug_info("network", "Skipping external port mapping.\n");
510 /* The pmp_map_cb does what we want to do */ 505 /* The pmp_map_cb does what we want to do */
511 listen_data->timer = purple_timeout_add(0, purple_network_finish_pmp_map_cb, listen_data); 506 listen_data->timer = purple_timeout_add(0, purple_network_finish_pmp_map_cb, listen_data);
529 524
530 return listen_data; 525 return listen_data;
531 } 526 }
532 527
533 PurpleNetworkListenData * 528 PurpleNetworkListenData *
534 purple_network_listen_family(unsigned short port, int socket_family, 529 purple_network_listen(unsigned short port, int socket_family, int socket_type,
535 int socket_type, PurpleNetworkListenCallback cb, 530 gboolean map_external, PurpleNetworkListenCallback cb,
536 gpointer cb_data) 531 gpointer cb_data)
537 { 532 {
538 g_return_val_if_fail(port != 0, NULL); 533 g_return_val_if_fail(port != 0, NULL);
539 534
540 return purple_network_do_listen(port, socket_family, socket_type, 535 return purple_network_do_listen(port, socket_family, socket_type, map_external,
541 cb, cb_data); 536 cb, cb_data);
542 } 537 }
543 538
544 PurpleNetworkListenData * 539 PurpleNetworkListenData *
545 purple_network_listen(unsigned short port, int socket_type, 540 purple_network_listen_range(unsigned short start, unsigned short end,
546 PurpleNetworkListenCallback cb, gpointer cb_data) 541 int socket_family, int socket_type, gboolean map_external,
547 {
548 return purple_network_listen_family(port, AF_UNSPEC, socket_type,
549 cb, cb_data);
550 }
551
552 PurpleNetworkListenData *
553 purple_network_listen_range_family(unsigned short start, unsigned short end,
554 int socket_family, int socket_type,
555 PurpleNetworkListenCallback cb, 542 PurpleNetworkListenCallback cb,
556 gpointer cb_data) 543 gpointer cb_data)
557 { 544 {
558 PurpleNetworkListenData *ret = NULL; 545 PurpleNetworkListenData *ret = NULL;
559 546
564 if (end < start) 551 if (end < start)
565 end = start; 552 end = start;
566 } 553 }
567 554
568 for (; start <= end; start++) { 555 for (; start <= end; start++) {
569 ret = purple_network_do_listen(start, AF_UNSPEC, socket_type, cb, cb_data); 556 ret = purple_network_do_listen(start, AF_UNSPEC, socket_type, map_external, cb, cb_data);
570 if (ret != NULL) 557 if (ret != NULL)
571 break; 558 break;
572 } 559 }
573 560
574 return ret; 561 return ret;
575 }
576
577 PurpleNetworkListenData *
578 purple_network_listen_range(unsigned short start, unsigned short end,
579 int socket_type, PurpleNetworkListenCallback cb,
580 gpointer cb_data)
581 {
582 return purple_network_listen_range_family(start, end, AF_UNSPEC,
583 socket_type, cb, cb_data);
584 } 562 }
585 563
586 void purple_network_listen_cancel(PurpleNetworkListenData *listen_data) 564 void purple_network_listen_cancel(PurpleNetworkListenData *listen_data)
587 { 565 {
588 if (listen_data->mapping_data != NULL) 566 if (listen_data->mapping_data != NULL)
1001 purple_network_set_stun_server(const gchar *stun_server) 979 purple_network_set_stun_server(const gchar *stun_server)
1002 { 980 {
1003 if (stun_server && stun_server[0] != '\0') { 981 if (stun_server && stun_server[0] != '\0') {
1004 if (purple_network_is_available()) { 982 if (purple_network_is_available()) {
1005 purple_debug_info("network", "running DNS query for STUN server\n"); 983 purple_debug_info("network", "running DNS query for STUN server\n");
1006 purple_dnsquery_a_account(NULL, stun_server, 3478, purple_network_ip_lookup_cb, 984 purple_dnsquery_a(NULL, stun_server, 3478, purple_network_ip_lookup_cb,
1007 &stun_ip); 985 &stun_ip);
1008 } else { 986 } else {
1009 purple_debug_info("network", 987 purple_debug_info("network",
1010 "network is unavailable, don't try to update STUN IP"); 988 "network is unavailable, don't try to update STUN IP");
1011 } 989 }
1019 purple_network_set_turn_server(const gchar *turn_server) 997 purple_network_set_turn_server(const gchar *turn_server)
1020 { 998 {
1021 if (turn_server && turn_server[0] != '\0') { 999 if (turn_server && turn_server[0] != '\0') {
1022 if (purple_network_is_available()) { 1000 if (purple_network_is_available()) {
1023 purple_debug_info("network", "running DNS query for TURN server\n"); 1001 purple_debug_info("network", "running DNS query for TURN server\n");
1024 purple_dnsquery_a_account(NULL, turn_server, 1002 purple_dnsquery_a(NULL, turn_server,
1025 purple_prefs_get_int("/purple/network/turn_port"), 1003 purple_prefs_get_int("/purple/network/turn_port"),
1026 purple_network_ip_lookup_cb, &turn_ip); 1004 purple_network_ip_lookup_cb, &turn_ip);
1027 } else { 1005 } else {
1028 purple_debug_info("network", 1006 purple_debug_info("network",
1029 "network is unavailable, don't try to update TURN IP"); 1007 "network is unavailable, don't try to update TURN IP");