comparison libpurple/dnssrv.c @ 27711:7fbf964c6c6c

Move the IDN support into the DNS routines. This turned out to be cleaner than I first thought, so here we go. All libpurple DNS routines support IDN when built against GNU libidn.
author Paul Aurich <paul@darkrain42.org>
date Sun, 19 Jul 2009 23:45:13 +0000
parents e400cd35542b
children bbb9e0ea67fe
comparison
equal deleted inserted replaced
27710:91333c6c16ef 27711:7fbf964c6c6c
45 #ifndef DNS_TYPE_TXT 45 #ifndef DNS_TYPE_TXT
46 # define DNS_TYPE_TXT 16 46 # define DNS_TYPE_TXT 16
47 #endif 47 #endif
48 #endif 48 #endif
49 49
50 #include "debug.h"
50 #include "dnssrv.h" 51 #include "dnssrv.h"
51 #include "eventloop.h" 52 #include "eventloop.h"
52 #include "debug.h" 53 #include "network.h"
53 54
54 #ifndef _WIN32 55 #ifndef _WIN32
55 typedef union { 56 typedef union {
56 HEADER hdr; 57 HEADER hdr;
57 u_char buf[1024]; 58 u_char buf[1024];
243 count++; 244 count++;
244 cur = cur->next; 245 cur = cur->next;
245 } 246 }
246 247
247 return list; 248 return list;
249 }
250
251 static gboolean
252 dns_str_is_ascii(const char *name)
253 {
254 guchar *c;
255 for (c = (guchar *)name; c && *c; ++c) {
256 if (*c > 0x7f)
257 return FALSE;
258 }
259
260 return TRUE;
248 } 261 }
249 262
250 #ifndef _WIN32 263 #ifndef _WIN32
251 264
252 G_GNUC_NORETURN static void 265 G_GNUC_NORETURN static void
586 599
587 PurpleSrvQueryData * 600 PurpleSrvQueryData *
588 purple_srv_resolve(const char *protocol, const char *transport, const char *domain, PurpleSrvCallback cb, gpointer extradata) 601 purple_srv_resolve(const char *protocol, const char *transport, const char *domain, PurpleSrvCallback cb, gpointer extradata)
589 { 602 {
590 char *query; 603 char *query;
604 char *hostname;
591 PurpleSrvQueryData *query_data; 605 PurpleSrvQueryData *query_data;
592 #ifndef _WIN32 606 #ifndef _WIN32
593 PurpleSrvInternalQuery internal_query; 607 PurpleSrvInternalQuery internal_query;
594 int in[2], out[2]; 608 int in[2], out[2];
595 int pid; 609 int pid;
602 purple_debug_error("dnssrv", "Wrong arguments\n"); 616 purple_debug_error("dnssrv", "Wrong arguments\n");
603 cb(NULL, 0, extradata); 617 cb(NULL, 0, extradata);
604 g_return_val_if_reached(NULL); 618 g_return_val_if_reached(NULL);
605 } 619 }
606 620
607 query = g_strdup_printf("_%s._%s.%s", protocol, transport, domain); 621 #ifdef USE_IDN
608 purple_debug_info("dnssrv","querying SRV record for %s\n", query); 622 if (!dns_str_is_ascii(domain)) {
623 int ret = purple_network_convert_idn_to_ascii(domain, &hostname);
624 if (ret != 0) {
625 purple_debug_error("dnssrv", "IDNA ToASCII failed\n");
626 cb(NULL, 0, extradata);
627 return NULL;
628 }
629 } else /* Fallthru is intentional */
630 #endif
631 hostname = g_strdup(domain);
632
633 query = g_strdup_printf("_%s._%s.%s", protocol, transport, hostname);
634 purple_debug_info("dnssrv","querying SRV record for %s: %s\n", domain,
635 query);
636 g_free(hostname);
609 637
610 #ifndef _WIN32 638 #ifndef _WIN32
611 if(pipe(in) || pipe(out)) { 639 if(pipe(in) || pipe(out)) {
612 purple_debug_error("dnssrv", "Could not create pipe\n"); 640 purple_debug_error("dnssrv", "Could not create pipe\n");
613 g_free(query); 641 g_free(query);
690 } 718 }
691 719
692 PurpleSrvQueryData *purple_txt_resolve(const char *owner, const char *domain, PurpleTxtCallback cb, gpointer extradata) 720 PurpleSrvQueryData *purple_txt_resolve(const char *owner, const char *domain, PurpleTxtCallback cb, gpointer extradata)
693 { 721 {
694 char *query; 722 char *query;
723 char *hostname;
695 PurpleSrvQueryData *query_data; 724 PurpleSrvQueryData *query_data;
696 #ifndef _WIN32 725 #ifndef _WIN32
697 PurpleSrvInternalQuery internal_query; 726 PurpleSrvInternalQuery internal_query;
698 int in[2], out[2]; 727 int in[2], out[2];
699 int pid; 728 int pid;
700 #else 729 #else
701 GError* err = NULL; 730 GError* err = NULL;
702 static gboolean initialized = FALSE; 731 static gboolean initialized = FALSE;
703 #endif 732 #endif
704 733
705 query = g_strdup_printf("%s.%s", owner, domain); 734 #ifdef USE_IDN
706 purple_debug_info("dnssrv","querying TXT record for %s\n", query); 735 if (!dns_str_is_ascii(domain)) {
736 int ret = purple_network_convert_idn_to_ascii(domain, &hostname);
737 if (ret != 0) {
738 purple_debug_error("dnssrv", "IDNA ToASCII failed\n");
739 cb(NULL, extradata);
740 return NULL;
741 }
742 } else /* fallthru is intentional */
743 #endif
744 hostname = g_strdup(domain);
745
746 query = g_strdup_printf("%s.%s", owner, hostname);
747 purple_debug_info("dnssrv","querying TXT record for %s: %s\n", domain,
748 query);
749 g_free(hostname);
707 750
708 #ifndef _WIN32 751 #ifndef _WIN32
709 if(pipe(in) || pipe(out)) { 752 if(pipe(in) || pipe(out)) {
710 purple_debug_error("dnssrv", "Could not create pipe\n"); 753 purple_debug_error("dnssrv", "Could not create pipe\n");
711 g_free(query); 754 g_free(query);