Mercurial > pidgin
comparison libpurple/dnssrv.c @ 27635: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
27634:91333c6c16ef | 27635: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); |