src/dnsquery.c

Thu, 17 Aug 2006 07:44:52 +0000

author
Mark Doliner <markdoliner@pidgin.im>
date
Thu, 17 Aug 2006 07:44:52 +0000
changeset 14225
35fa1f6160b4
permissions
-rw-r--r--

[gaim-migrate @ 16811]
Split the DNS query stuff out into it's own file. Eventually
we should move the dnssrv code into this same file. Maybe
even share some code?

Also the first steps toward cancelable DNS queries.

14225
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1 /**
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
2 * @file dnsquery.c DNS query API
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
3 * @ingroup core
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
4 *
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
5 * gaim
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
6 *
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
7 * Gaim is the legal property of its developers, whose names are too numerous
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
8 * to list here. Please refer to the COPYRIGHT file distributed with this
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
9 * source distribution.
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
10 *
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
11 * This program is free software; you can redistribute it and/or modify
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
12 * it under the terms of the GNU General Public License as published by
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
13 * the Free Software Foundation; either version 2 of the License, or
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
14 * (at your option) any later version.
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
15 *
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
16 * This program is distributed in the hope that it will be useful,
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
19 * GNU General Public License for more details.
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
20 *
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
21 * You should have received a copy of the GNU General Public License
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
22 * along with this program; if not, write to the Free Software
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
24 *
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
25 */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
26
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
27 #include "internal.h"
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
28 #include "debug.h"
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
29 #include "ntlm.h"
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
30 #include "util.h"
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
31
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
32 struct _GaimDnsqueryData {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
33 };
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
34
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
35 /**************************************************************************
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
36 * Global DNS query API
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
37 **************************************************************************/
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
38
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
39 #if defined(__unix__) || defined(__APPLE__)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
40
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
41 /*
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
42 * This structure represents both a pending DNS request and
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
43 * a free child process.
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
44 */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
45 typedef struct _DnsqueryResolverprocess DnsqueryResolverprocess;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
46 struct _DnsqueryResolverprocess {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
47 char *host;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
48 int port;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
49 GaimProxyDnsConnectFunction callback;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
50 gpointer data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
51 guint inpa;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
52 int fd_in, fd_out;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
53 pid_t dns_pid;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
54 };
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
55
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
56 //static GSList *all_dns_children = NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
57 static GSList *free_dns_children = NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
58 static GQueue *queued_requests = NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
59
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
60 static int number_of_dns_children = 0;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
61
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
62 static const int MAX_DNS_CHILDREN = 2;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
63
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
64 typedef struct {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
65 char hostname[512];
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
66 int port;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
67 } dns_params_t;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
68
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
69 typedef struct {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
70 dns_params_t params;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
71 GaimProxyDnsConnectFunction callback;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
72 gpointer data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
73 } queued_dns_request_t;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
74
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
75 /*
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
76 * Begin the DNS resolver child process functions.
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
77 */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
78 #ifdef HAVE_SIGNAL_H
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
79 static void
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
80 trap_gdb_bug()
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
81 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
82 const char *message =
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
83 "Gaim's DNS child got a SIGTRAP signal.\n"
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
84 "This can be caused by trying to run gaim inside gdb.\n"
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
85 "There is a known gdb bug which prevents this. Supposedly gaim\n"
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
86 "should have detected you were using gdb and used an ugly hack,\n"
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
87 "check cope_with_gdb_brokenness() in dnsquery.c.\n\n"
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
88 "For more info about this bug, see http://sources.redhat.com/ml/gdb/2001-07/msg00349.html\n";
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
89 fputs("\n* * *\n",stderr);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
90 fputs(message,stderr);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
91 fputs("* * *\n\n",stderr);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
92 execlp("xmessage","xmessage","-center", message, NULL);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
93 _exit(1);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
94 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
95 #endif
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
96
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
97 static void
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
98 cope_with_gdb_brokenness()
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
99 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
100 #ifdef __linux__
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
101 static gboolean already_done = FALSE;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
102 char s[256], e[512];
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
103 int n;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
104 pid_t ppid;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
105
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
106 if (already_done)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
107 return;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
108
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
109 already_done = TRUE;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
110 ppid = getppid();
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
111 snprintf(s, sizeof(s), "/proc/%d/exe", ppid);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
112 n = readlink(s, e, sizeof(e));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
113 if (n < 0)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
114 return;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
115
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
116 e[MIN(n,sizeof(e)-1)] = '\0';
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
117
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
118 if (strstr(e,"gdb"))
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
119 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
120 gaim_debug_info("dnsquery",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
121 "Debugger detected, performing useless query...\n");
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
122 gethostbyname("x.x.x.x.x");
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
123 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
124 #endif
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
125 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
126
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
127 /**
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
128 * When doing DNS queries on Unix and OS-X, we fork off a separate
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
129 * process and communicate with it using pipes. This function is
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
130 * called shortly after the child is forked, and the function exits
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
131 * the process after it's no longer needed.
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
132 */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
133 static void
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
134 gaim_dns_resolverprocess(int child_out, int child_in, gboolean show_debug)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
135 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
136 dns_params_t dns_params;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
137 const size_t zero = 0;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
138 int rc;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
139 #ifdef HAVE_GETADDRINFO
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
140 struct addrinfo hints, *res, *tmp;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
141 char servname[20];
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
142 #else
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
143 struct sockaddr_in sin;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
144 const size_t addrlen = sizeof(sin);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
145 #endif
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
146
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
147 #ifdef HAVE_SIGNAL_H
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
148 signal(SIGHUP, SIG_DFL);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
149 signal(SIGINT, SIG_DFL);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
150 signal(SIGQUIT, SIG_DFL);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
151 signal(SIGCHLD, SIG_DFL);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
152 signal(SIGTERM, SIG_DFL);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
153 signal(SIGTRAP, trap_gdb_bug);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
154 #endif
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
155
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
156 /*
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
157 * We resolve 1 host name for each iteration of this
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
158 * while loop.
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
159 *
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
160 * The top half of this reads in the hostname and port
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
161 * number from the socket with our parent. The bottom
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
162 * half of this resolves the IP (blocking) and sends
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
163 * the result back to our parent, when finished.
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
164 */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
165 while (1)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
166 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
167 const char ch = 'Y';
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
168 fd_set fds;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
169 struct timeval tv = { .tv_sec = 40 , .tv_usec = 0 };
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
170
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
171 FD_ZERO(&fds);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
172 FD_SET(child_in, &fds);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
173 rc = select(child_in + 1, &fds, NULL, NULL, &tv);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
174 if (rc < 0) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
175 if (show_debug)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
176 printf("dns[%d]: select failed\n", getpid());
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
177 close(child_out);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
178 close(child_in);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
179 _exit(1);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
180 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
181 if (rc == 0) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
182 if (show_debug)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
183 printf("dns[%d]: nobody needs me... =(\n", getpid());
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
184 break;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
185 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
186
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
187 rc = read(child_in, &dns_params, sizeof(dns_params_t));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
188 if (rc < 0) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
189 if (show_debug)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
190 printf("dns[%d]: read failed\n", getpid());
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
191 close(child_out);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
192 close(child_in);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
193 _exit(1);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
194 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
195 if (rc == 0) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
196 if (show_debug)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
197 printf("dns[%d]: Oops, father has gone, wait for me, wait...!\n", getpid());
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
198 break;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
199 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
200 if (dns_params.hostname[0] == '\0') {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
201 printf("dns[%d]: hostname = \"\" (port = %d)!!!\n", getpid(), dns_params.port);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
202 close(child_out);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
203 close(child_in);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
204 _exit(1);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
205 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
206 /* Tell our parent that we read the data successfully */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
207 write(child_out, &ch, sizeof(ch));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
208
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
209 /* We have the hostname and port, now resolve the IP */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
210
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
211 #ifdef HAVE_GETADDRINFO
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
212 g_snprintf(servname, sizeof(servname), "%d", dns_params.port);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
213 memset(&hints, 0, sizeof(hints));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
214
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
215 /*
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
216 * This is only used to convert a service
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
217 * name to a port number. As we know we are
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
218 * passing a number already, we know this
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
219 * value will not be really used by the C
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
220 * library.
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
221 */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
222 hints.ai_socktype = SOCK_STREAM;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
223 rc = getaddrinfo(dns_params.hostname, servname, &hints, &res);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
224 write(child_out, &rc, sizeof(rc));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
225 if (rc != 0) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
226 close(child_out);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
227 if (show_debug)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
228 printf("dns[%d] Error: getaddrinfo returned %d\n",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
229 getpid(), rc);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
230 dns_params.hostname[0] = '\0';
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
231 continue;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
232 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
233 for (tmp = res; tmp != NULL; tmp = tmp->ai_next)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
234 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
235 size_t ai_addrlen = tmp->ai_addrlen;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
236 write(child_out, &ai_addrlen, sizeof(ai_addrlen));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
237 write(child_out, tmp->ai_addr, tmp->ai_addrlen);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
238 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
239 freeaddrinfo(res);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
240 write(child_out, &zero, sizeof(zero));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
241 #else
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
242 if (!inet_aton(dns_params.hostname, &sin.sin_addr))
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
243 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
244 struct hostent *hp;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
245
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
246 hp = gethostbyname(dns_params.hostname);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
247 if (hp == NULL)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
248 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
249 if (show_debug)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
250 printf("DNS Error: %d\n", h_errno);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
251 write(child_out, &h_errno, sizeof(int));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
252 close(child_out);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
253 close(child_in);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
254 _exit(1);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
255 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
256 memset(&sin, 0, sizeof(struct sockaddr_in));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
257 memcpy(&sin.sin_addr.s_addr, hp->h_addr, hp->h_length);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
258 sin.sin_family = hp->h_addrtype;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
259 } else
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
260 sin.sin_family = AF_INET;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
261
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
262 sin.sin_port = htons(dns_params.port);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
263 write(child_out, &addrlen, sizeof(addrlen));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
264 write(child_out, &sin, addrlen);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
265 write(child_out, &zero, sizeof(zero));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
266 #endif
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
267 dns_params.hostname[0] = '\0';
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
268 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
269
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
270 close(child_out);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
271 close(child_in);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
272
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
273 _exit(0);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
274 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
275
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
276 static DnsqueryResolverprocess *
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
277 gaim_dns_new_resolverprocess(gboolean show_debug)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
278 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
279 DnsqueryResolverprocess *req;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
280 int child_out[2], child_in[2];
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
281
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
282 /* Create pipes for communicating with the child process */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
283 if (pipe(child_out) || pipe(child_in)) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
284 gaim_debug_error("dnsquery",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
285 "Could not create pipes: %s\n", strerror(errno));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
286 return NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
287 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
288
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
289 req = g_new(DnsqueryResolverprocess, 1);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
290
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
291 cope_with_gdb_brokenness();
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
292
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
293 /* Fork! */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
294 req->dns_pid = fork();
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
295
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
296 /* If we are the child process... */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
297 if (req->dns_pid == 0) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
298 /* We should not access the parent's side of the pipes, so close them */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
299 close(child_out[0]);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
300 close(child_in[1]);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
301
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
302 gaim_dns_resolverprocess(child_out[1], child_in[0], show_debug);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
303 /* The thread calls _exit() rather than returning, so we never get here */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
304 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
305
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
306 /* We should not access the child's side of the pipes, so close them */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
307 close(child_out[1]);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
308 close(child_in[0]);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
309 if (req->dns_pid == -1) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
310 gaim_debug_error("dnsquery",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
311 "Could not create child process for DNS: %s\n",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
312 strerror(errno));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
313 g_free(req);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
314 return NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
315 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
316
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
317 req->fd_out = child_out[0];
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
318 req->fd_in = child_in[1];
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
319 number_of_dns_children++;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
320 gaim_debug_info("dnsquery",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
321 "Created new DNS child %d, there are now %d children.\n",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
322 req->dns_pid, number_of_dns_children);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
323
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
324 return req;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
325 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
326 /*
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
327 * End the DNS resolver child process functions.
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
328 */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
329
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
330 /*
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
331 * Begin the functions for dealing with the DNS child processes.
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
332 */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
333 static void
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
334 req_free(DnsqueryResolverprocess *req)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
335 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
336 g_return_if_fail(req != NULL);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
337
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
338 close(req->fd_in);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
339 close(req->fd_out);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
340
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
341 g_free(req->host);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
342 g_free(req);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
343
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
344 number_of_dns_children--;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
345 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
346
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
347 static int
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
348 send_dns_request_to_child(DnsqueryResolverprocess *req, dns_params_t *dns_params)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
349 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
350 char ch;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
351 int rc;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
352 pid_t pid;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
353
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
354 /* This waitpid might return the child's PID if it has recently
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
355 * exited, or it might return an error if it exited "long
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
356 * enough" ago that it has already been reaped; in either
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
357 * instance, we can't use it. */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
358 if ((pid = waitpid (req->dns_pid, NULL, WNOHANG)) > 0) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
359 gaim_debug_warning("dnsquery",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
360 "DNS child %d no longer exists\n", req->dns_pid);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
361 return -1;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
362 } else if (pid < 0) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
363 gaim_debug_warning("dnsquery",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
364 "Wait for DNS child %d failed: %s\n",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
365 req->dns_pid, strerror(errno));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
366 return -1;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
367 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
368
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
369 /* Let's contact this lost child! */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
370 rc = write(req->fd_in, dns_params, sizeof(*dns_params));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
371 if (rc < 0) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
372 gaim_debug_error("dnsquery",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
373 "Unable to write to DNS child %d: %d\n",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
374 req->dns_pid, strerror(errno));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
375 close(req->fd_in);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
376 return -1;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
377 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
378
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
379 g_return_val_if_fail(rc == sizeof(*dns_params), -1);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
380
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
381 /* Did you hear me? (This avoids some race conditions) */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
382 rc = read(req->fd_out, &ch, sizeof(ch));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
383 if (rc != 1 || ch != 'Y')
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
384 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
385 gaim_debug_warning("dnsquery",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
386 "DNS child %d not responding. Killing it!\n",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
387 req->dns_pid);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
388 kill(req->dns_pid, SIGKILL);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
389 return -1;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
390 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
391
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
392 gaim_debug_info("dnsquery",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
393 "Successfully sent DNS request to child %d\n", req->dns_pid);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
394
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
395 return 0;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
396 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
397
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
398 static void
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
399 host_resolved(gpointer data, gint source, GaimInputCondition cond);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
400
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
401 static void
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
402 release_dns_child(DnsqueryResolverprocess *req)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
403 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
404 g_free(req->host);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
405 req->host = NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
406
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
407 if (queued_requests && !g_queue_is_empty(queued_requests)) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
408 queued_dns_request_t *r = g_queue_pop_head(queued_requests);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
409 req->host = g_strdup(r->params.hostname);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
410 req->port = r->params.port;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
411 req->callback = r->callback;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
412 req->data = r->data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
413
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
414 gaim_debug_info("dnsquery",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
415 "Processing queued DNS query for '%s' with child %d\n",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
416 req->host, req->dns_pid);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
417
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
418 if (send_dns_request_to_child(req, &(r->params)) != 0) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
419 req_free(req);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
420 req = NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
421
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
422 gaim_debug_warning("dnsquery",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
423 "Intent of process queued query of '%s' failed, "
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
424 "requeueing...\n", r->params.hostname);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
425 g_queue_push_head(queued_requests, r);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
426 } else {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
427 req->inpa = gaim_input_add(req->fd_out, GAIM_INPUT_READ, host_resolved, req);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
428 g_free(r);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
429 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
430
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
431 } else {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
432 req->host = NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
433 req->callback = NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
434 req->data = NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
435 free_dns_children = g_slist_append(free_dns_children, req);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
436 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
437 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
438
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
439 static void
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
440 host_resolved(gpointer data, gint source, GaimInputCondition cond)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
441 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
442 DnsqueryResolverprocess *req = (DnsqueryResolverprocess*)data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
443 int rc, err;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
444 GSList *hosts = NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
445 struct sockaddr *addr = NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
446 size_t addrlen;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
447
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
448 gaim_debug_info("dnsquery", "Got response for '%s'\n", req->host);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
449 gaim_input_remove(req->inpa);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
450
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
451 rc = read(req->fd_out, &err, sizeof(err));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
452 if ((rc == 4) && (err != 0))
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
453 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
454 gchar *message;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
455 #ifdef HAVE_GETADDRINFO
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
456 message = g_strdup_printf("DNS error: %s (pid=%d)",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
457 gai_strerror(err), req->dns_pid);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
458 #else
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
459 message = g_strdup_printf("DNS error: %d (pid=%d)",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
460 err, req->dns_pid);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
461 #endif
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
462 gaim_debug_error("dnsquery", "%s\n", message);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
463 req->callback(NULL, req->data, message);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
464 g_free(message);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
465 release_dns_child(req);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
466 return;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
467 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
468
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
469 if (rc > 0)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
470 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
471 while (rc > 0) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
472 rc = read(req->fd_out, &addrlen, sizeof(addrlen));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
473 if (rc > 0 && addrlen > 0) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
474 addr = g_malloc(addrlen);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
475 rc = read(req->fd_out, addr, addrlen);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
476 hosts = g_slist_append(hosts, GINT_TO_POINTER(addrlen));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
477 hosts = g_slist_append(hosts, addr);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
478 } else {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
479 break;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
480 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
481 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
482 } else if (rc == -1) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
483 gchar *message;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
484 message = g_strdup_printf("Error reading from DNS child: %s", strerror(errno));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
485 gaim_debug_error("dnsquery", "%s\n", message);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
486 req->callback(NULL, req->data, message);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
487 g_free(message);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
488 req_free(req);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
489 return;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
490 } else if (rc == 0) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
491 gchar *message;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
492 close(req->fd_out);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
493 message = g_strdup_printf("EOF reading from DNS child");
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
494 gaim_debug_error("dnsquery", "%s\n", message);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
495 req->callback(NULL, req->data, message);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
496 g_free(message);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
497 req_free(req);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
498 return;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
499 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
500
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
501 /* wait4(req->dns_pid, NULL, WNOHANG, NULL); */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
502
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
503 req->callback(hosts, req->data, NULL);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
504
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
505 release_dns_child(req);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
506 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
507 /*
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
508 * End the functions for dealing with the DNS child processes.
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
509 */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
510
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
511 GaimDnsqueryData *
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
512 gaim_dnsquery_a(const char *hostname, int port, GaimDnsqueryConnectFunction callback, gpointer data)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
513 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
514 GaimDnsqueryData *query_data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
515 DnsqueryResolverprocess *req = NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
516 dns_params_t dns_params;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
517 gchar *host_temp;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
518 gboolean show_debug;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
519
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
520 show_debug = gaim_debug_is_enabled();
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
521
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
522 host_temp = g_strstrip(g_strdup(hostname));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
523 strncpy(dns_params.hostname, host_temp, sizeof(dns_params.hostname) - 1);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
524 g_free(host_temp);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
525 dns_params.hostname[sizeof(dns_params.hostname) - 1] = '\0';
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
526 dns_params.port = port;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
527
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
528 /*
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
529 * If we have any children, attempt to have them perform the DNS
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
530 * query. If we're able to send the query to a child, then req
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
531 * will be set to the DnsqueryResolverprocess. Otherwise, req will
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
532 * be NULL and we'll need to create a new DNS request child.
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
533 */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
534 while (free_dns_children != NULL)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
535 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
536 req = free_dns_children->data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
537 free_dns_children = g_slist_remove(free_dns_children, req);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
538
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
539 if (send_dns_request_to_child(req, &dns_params) == 0)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
540 /* We found an acceptable child, yay */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
541 break;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
542
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
543 req_free(req);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
544 req = NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
545 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
546
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
547 /* We need to create a new DNS request child */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
548 if (req == NULL)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
549 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
550 if (number_of_dns_children >= MAX_DNS_CHILDREN)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
551 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
552 queued_dns_request_t *r = g_new(queued_dns_request_t, 1);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
553 memcpy(&(r->params), &dns_params, sizeof(dns_params));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
554 r->callback = callback;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
555 r->data = data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
556 if (!queued_requests)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
557 queued_requests = g_queue_new();
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
558 g_queue_push_tail(queued_requests, r);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
559
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
560 gaim_debug_info("dnsquery",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
561 "DNS query for '%s' queued\n", dns_params.hostname);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
562
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
563 return query_data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
564 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
565
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
566 req = gaim_dns_new_resolverprocess(show_debug);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
567 if (req == NULL)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
568 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
569 gaim_debug_error("dnsquery", "oh dear, this is going to explode, I give up\n");
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
570 return NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
571 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
572 send_dns_request_to_child(req, &dns_params);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
573 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
574
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
575 req->host = g_strdup(hostname);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
576 req->port = port;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
577 req->callback = callback;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
578 req->data = data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
579 req->inpa = gaim_input_add(req->fd_out, GAIM_INPUT_READ, host_resolved, req);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
580
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
581 return query_data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
582 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
583
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
584 #elif defined _WIN32 /* end __unix__ || __APPLE__ */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
585
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
586 typedef struct _dns_tdata {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
587 char *hostname;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
588 int port;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
589 GaimProxyDnsConnectFunction callback;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
590 gpointer data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
591 GSList *hosts;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
592 char *errmsg;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
593 } dns_tdata;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
594
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
595 static gboolean dns_main_thread_cb(gpointer data)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
596 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
597 dns_tdata *td = (dns_tdata*)data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
598 if (td->errmsg != NULL) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
599 gaim_debug_info("dnsquery", "%s\n", td->errmsg);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
600 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
601 td->callback(td->hosts, td->data, td->errmsg);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
602 g_free(td->hostname);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
603 g_free(td->errmsg);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
604 g_free(td);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
605 return FALSE;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
606 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
607
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
608 static gpointer
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
609 dns_thread(gpointer data)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
610 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
611
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
612 #ifdef HAVE_GETADDRINFO
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
613 int rc;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
614 struct addrinfo hints, *res, *tmp;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
615 char servname[20];
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
616 #else
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
617 struct sockaddr_in sin;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
618 struct hostent *hp;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
619 #endif
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
620 dns_tdata *td = (dns_tdata*)data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
621
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
622 #ifdef HAVE_GETADDRINFO
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
623 g_snprintf(servname, sizeof(servname), "%d", td->port);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
624 memset(&hints, 0, sizeof(hints));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
625
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
626 /* This is only used to convert a service
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
627 * name to a port number. As we know we are
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
628 * passing a number already, we know this
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
629 * value will not be really used by the C
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
630 * library.
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
631 */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
632 hints.ai_socktype = SOCK_STREAM;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
633 rc = getaddrinfo(td->hostname, servname, &hints, &res);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
634 if (rc == 0)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
635 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
636 tmp = res;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
637 while(res) {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
638 td->hosts = g_slist_append(td->hosts,
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
639 GSIZE_TO_POINTER(res->ai_addrlen));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
640 td->hosts = g_slist_append(td->hosts,
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
641 g_memdup(res->ai_addr, res->ai_addrlen));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
642 res = res->ai_next;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
643 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
644 freeaddrinfo(tmp);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
645 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
646 else
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
647 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
648 td->errmsg = g_strdup_printf("DNS getaddrinfo(\"%s\", \"%s\") error: %d", td->hostname, servname, rc);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
649 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
650 #else
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
651 hp = gethostbyname(td->hostname);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
652 if (hp != NULL)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
653 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
654 memset(&sin, 0, sizeof(struct sockaddr_in));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
655 memcpy(&sin.sin_addr.s_addr, hp->h_addr, hp->h_length);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
656 sin.sin_family = hp->h_addrtype;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
657 sin.sin_port = htons(td->port);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
658
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
659 td->hosts = g_slist_append(td->hosts,
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
660 GSIZE_TO_POINTER(sizeof(sin)));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
661 td->hosts = g_slist_append(td->hosts,
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
662 g_memdup(&sin, sizeof(sin)));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
663 } else {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
664 td->errmsg = g_strdup_printf("DNS gethostbyname(\"%s\") error: %d", td->hostname, h_errno);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
665 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
666 #endif
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
667 /* back to main thread */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
668 g_idle_add(dns_main_thread_cb, td);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
669
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
670 return 0;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
671 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
672
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
673 GaimDnsqueryData *
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
674 gaim_dnsquery_a(const char *hostname, int port,
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
675 GaimProxyDnsConnectFunction callback, gpointer data)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
676 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
677 GaimDnsqueryData *query_data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
678 dns_tdata *td;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
679 struct sockaddr_in sin;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
680 GError* err = NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
681
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
682 if (inet_aton(hostname, &sin.sin_addr))
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
683 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
684 GSList *hosts = NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
685 sin.sin_family = AF_INET;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
686 sin.sin_port = htons(port);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
687 hosts = g_slist_append(hosts, GINT_TO_POINTER(sizeof(sin)));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
688 hosts = g_slist_append(hosts, g_memdup(&sin, sizeof(sin)));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
689 callback(hosts, data, NULL);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
690 return query_data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
691 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
692
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
693 gaim_debug_info("dnsquery", "DNS Lookup for: %s\n", hostname);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
694 td = g_new0(dns_tdata, 1);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
695 td->hostname = g_strdup(hostname);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
696 td->port = port;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
697 td->callback = callback;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
698 td->data = data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
699
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
700 if (!g_thread_create(dns_thread, td, FALSE, &err))
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
701 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
702 gaim_debug_error("dnsquery", "DNS thread create failure: %s\n", err?err->message:"");
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
703 g_error_free(err);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
704 g_free(td->hostname);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
705 g_free(td);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
706 return NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
707 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
708
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
709 return query_data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
710 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
711
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
712 #else /* not __unix__ or __APPLE__ or _WIN32 */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
713
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
714 typedef struct {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
715 gpointer data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
716 size_t addrlen;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
717 struct sockaddr *addr;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
718 GaimProxyDnsConnectFunction callback;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
719 } DnsqueryResolverprocess;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
720
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
721 static gboolean host_resolved(gpointer data)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
722 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
723 DnsqueryResolverprocess *req = (DnsqueryResolverprocess*)data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
724 GSList *hosts = NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
725 hosts = g_slist_append(hosts, GINT_TO_POINTER(req->addrlen));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
726 hosts = g_slist_append(hosts, req->addr);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
727 req->callback(hosts, req->data, NULL);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
728 g_free(req);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
729 return FALSE;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
730 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
731
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
732 GaimDnsqueryData *
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
733 gaim_dnsquery_a(const char *hostname, int port,
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
734 GaimProxyDnsConnectFunction callback, gpointer data)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
735 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
736 GaimDnsqueryData *query_data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
737 struct sockaddr_in sin;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
738 DnsqueryResolverprocess *req;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
739
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
740 if (!inet_aton(hostname, &sin.sin_addr))
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
741 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
742 struct hostent *hp;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
743 hp = gethostbyname(hostname);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
744 if (hp == NULL)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
745 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
746 gaim_debug_error("dnsquery",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
747 "gaim_gethostbyname(\"%s\", %d) failed: %d\n",
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
748 hostname, port, h_errno);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
749 return NULL;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
750 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
751 memset(&sin, 0, sizeof(struct sockaddr_in));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
752 memcpy(&sin.sin_addr.s_addr, hp->h_addr, hp->h_length);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
753 sin.sin_family = hp->h_addrtype;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
754 } else
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
755 sin.sin_family = AF_INET;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
756 sin.sin_port = htons(port);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
757
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
758 req = g_new(DnsqueryResolverprocess, 1);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
759 req->addr = (struct sockaddr*) g_memdup(&sin, sizeof(sin));
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
760 req->addrlen = sizeof(sin);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
761 req->data = data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
762 req->callback = callback;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
763 gaim_timeout_add(10, host_resolved, req);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
764
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
765 return query_data;
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
766 }
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
767
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
768 #endif /* not __unix__ or __APPLE__ or _WIN32 */
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
769
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
770 void
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
771 gaim_dnsquery_destroy(GaimDnsqueryData *query_data)
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
772 {
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
773 g_free(query_data);
35fa1f6160b4 [gaim-migrate @ 16811]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
774 }

mercurial