libpurple/dnssrv.c

Fri, 28 Sep 2007 15:52:48 +0000

author
Richard Laager <rlaager@pidgin.im>
date
Fri, 28 Sep 2007 15:52:48 +0000
branch
release-2.2.1
changeset 20128
272326eb883e
parent 19859
71d37b57eff2
child 20129
426d928138b0
permissions
-rw-r--r--

applied changes from 31d62e1a78974a0239e86bfeb42b29ab75216114
through c32aee6deb5c7a5e5749d6e0598f588947b8d45c

11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
1 /**
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
2 * @file dnssrv.c
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
3 *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
4 * purple
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
5 *
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
6 * Copyright (C) 2005 Thomas Butter <butter@uni-mannheim.de>
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
7 *
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
11 * (at your option) any later version.
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
12 *
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
16 * GNU General Public License for more details.
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
17 *
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
19859
71d37b57eff2 The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents: 18555
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
21 */
11898
a40601f1aed2 [gaim-migrate @ 14189]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11630
diff changeset
22
a40601f1aed2 [gaim-migrate @ 14189]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11630
diff changeset
23 #include "internal.h"
15718
216ce4a9db5b Include util.h to fix a warning I introduced
Evan Schoenberg <evands@pidgin.im>
parents: 15707
diff changeset
24 #include "util.h"
11898
a40601f1aed2 [gaim-migrate @ 14189]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11630
diff changeset
25
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
26 #ifndef _WIN32
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
27 #include <resolv.h>
11630
a6eaa6f5cbd2 [gaim-migrate @ 13905]
Mark Doliner <markdoliner@pidgin.im>
parents: 11444
diff changeset
28 #include <arpa/nameser.h>
12568
717c7d5cbb77 [gaim-migrate @ 14887]
Richard Laager <rlaager@pidgin.im>
parents: 12451
diff changeset
29 #ifdef HAVE_ARPA_NAMESER_COMPAT_H
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
30 #include <arpa/nameser_compat.h>
12568
717c7d5cbb77 [gaim-migrate @ 14887]
Richard Laager <rlaager@pidgin.im>
parents: 12451
diff changeset
31 #endif
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
32 #ifndef T_SRV
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
33 #define T_SRV 33
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
34 #endif
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
35 #else
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
36 #include <windns.h>
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
37 /* Missing from the mingw headers */
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
38 #ifndef DNS_TYPE_SRV
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
39 # define DNS_TYPE_SRV 33
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
40 #endif
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
41 #endif
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
42
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
43 #include "dnssrv.h"
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
44 #include "eventloop.h"
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
45 #include "debug.h"
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
46
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
47 #ifndef _WIN32
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
48 typedef union {
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
49 HEADER hdr;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
50 u_char buf[1024];
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
51 } queryans;
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
52 #else
18555
ececd1bd99e3 Fix up some linkage to compile on Visual Studio. He claims this doesn't
Nick Hebner <hebnern@gmail.com>
parents: 16957
diff changeset
53 static DNS_STATUS (WINAPI *MyDnsQuery_UTF8) (
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
54 PCSTR lpstrName, WORD wType, DWORD fOptions,
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
55 PIP4_ARRAY aipServers, PDNS_RECORD* ppQueryResultsSet,
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
56 PVOID* pReserved) = NULL;
18555
ececd1bd99e3 Fix up some linkage to compile on Visual Studio. He claims this doesn't
Nick Hebner <hebnern@gmail.com>
parents: 16957
diff changeset
57 static void (WINAPI *MyDnsRecordListFree) (PDNS_RECORD pRecordList,
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
58 DNS_FREE_TYPE FreeType) = NULL;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
59 #endif
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
60
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
61 struct _PurpleSrvQueryData {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
62 PurpleSrvCallback cb;
11382
4458ab177b10 [gaim-migrate @ 13609]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11381
diff changeset
63 gpointer extradata;
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
64 guint handle;
14374
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
65 #ifdef _WIN32
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
66 GThread *resolver;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
67 char *query;
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
68 char *error_message;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
69 GSList *results;
15776
cba54f9d2e51 Patch from Graham Booker which ensures that a process forked by dnsserv cleans up afterwards, calling waitpid() to make sure no zombies are left over.
Evan Schoenberg <evands@pidgin.im>
parents: 15718
diff changeset
70 #else
20128
272326eb883e applied changes from 31d62e1a78974a0239e86bfeb42b29ab75216114
Richard Laager <rlaager@pidgin.im>
parents: 19859
diff changeset
71 int fd_in, fd_out;
15776
cba54f9d2e51 Patch from Graham Booker which ensures that a process forked by dnsserv cleans up afterwards, calling waitpid() to make sure no zombies are left over.
Evan Schoenberg <evands@pidgin.im>
parents: 15718
diff changeset
72 pid_t pid;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
73 #endif
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
74 };
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
75
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
76 static gint
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
77 responsecompare(gconstpointer ar, gconstpointer br)
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
78 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
79 PurpleSrvResponse *a = (PurpleSrvResponse*)ar;
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
80 PurpleSrvResponse *b = (PurpleSrvResponse*)br;
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
81
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
82 if(a->pref == b->pref) {
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
83 if(a->weight == b->weight)
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
84 return 0;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
85 if(a->weight < b->weight)
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
86 return -1;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
87 return 1;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
88 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
89 if(a->pref < b->pref)
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
90 return -1;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
91 return 1;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
92 }
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
93
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
94 #ifndef _WIN32
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
95
16701
0b41f23396cc Mark two functions as "noreturn"
Mark Doliner <markdoliner@pidgin.im>
parents: 15890
diff changeset
96 G_GNUC_NORETURN static void
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
97 resolve(int in, int out)
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
98 {
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
99 GList *ret = NULL;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
100 PurpleSrvResponse *srvres;
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
101 queryans answer;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
102 int size;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
103 int qdcount;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
104 int ancount;
11381
d3d53604fe0f [gaim-migrate @ 13608]
Mark Doliner <markdoliner@pidgin.im>
parents: 11379
diff changeset
105 guchar *end;
d3d53604fe0f [gaim-migrate @ 13608]
Mark Doliner <markdoliner@pidgin.im>
parents: 11379
diff changeset
106 guchar *cp;
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
107 gchar name[256];
13127
0adfbecc67ac [gaim-migrate @ 15488]
Mark Doliner <markdoliner@pidgin.im>
parents: 12847
diff changeset
108 guint16 type, dlen, pref, weight, port;
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
109 gchar query[256];
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
110
15707
e9d3280caf69 Restore default signal handlers in fork()'d children. This adds a gaim_restore_default_signal_handlers() utility function since children are made in multiple places.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
111 #ifdef HAVE_SIGNAL_H
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
112 purple_restore_default_signal_handlers();
15707
e9d3280caf69 Restore default signal handlers in fork()'d children. This adds a gaim_restore_default_signal_handlers() utility function since children are made in multiple places.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
113 #endif
15859
98b7f9bf8e28 Minor cleanup.
Daniel Atallah <datallah@pidgin.im>
parents: 15776
diff changeset
114
20128
272326eb883e applied changes from 31d62e1a78974a0239e86bfeb42b29ab75216114
Richard Laager <rlaager@pidgin.im>
parents: 19859
diff changeset
115 if (read(in, query, 256) <= 0) {
272326eb883e applied changes from 31d62e1a78974a0239e86bfeb42b29ab75216114
Richard Laager <rlaager@pidgin.im>
parents: 19859
diff changeset
116 close(out);
272326eb883e applied changes from 31d62e1a78974a0239e86bfeb42b29ab75216114
Richard Laager <rlaager@pidgin.im>
parents: 19859
diff changeset
117 close(in);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
118 _exit(0);
20128
272326eb883e applied changes from 31d62e1a78974a0239e86bfeb42b29ab75216114
Richard Laager <rlaager@pidgin.im>
parents: 19859
diff changeset
119 }
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
120
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
121 size = res_query( query, C_IN, T_SRV, (u_char*)&answer, sizeof( answer));
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
122
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
123 qdcount = ntohs(answer.hdr.qdcount);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
124 ancount = ntohs(answer.hdr.ancount);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
125
11381
d3d53604fe0f [gaim-migrate @ 13608]
Mark Doliner <markdoliner@pidgin.im>
parents: 11379
diff changeset
126 cp = (guchar*)&answer + sizeof(HEADER);
d3d53604fe0f [gaim-migrate @ 13608]
Mark Doliner <markdoliner@pidgin.im>
parents: 11379
diff changeset
127 end = (guchar*)&answer + size;
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
128
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
129 /* skip over unwanted stuff */
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
130 while (qdcount-- > 0 && cp < end) {
11381
d3d53604fe0f [gaim-migrate @ 13608]
Mark Doliner <markdoliner@pidgin.im>
parents: 11379
diff changeset
131 size = dn_expand( (unsigned char*)&answer, end, cp, name, 256);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
132 if(size < 0) goto end;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
133 cp += size + QFIXEDSZ;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
134 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
135
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
136 while (ancount-- > 0 && cp < end) {
11381
d3d53604fe0f [gaim-migrate @ 13608]
Mark Doliner <markdoliner@pidgin.im>
parents: 11379
diff changeset
137 size = dn_expand((unsigned char*)&answer, end, cp, name, 256);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
138 if(size < 0)
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
139 goto end;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
140
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
141 cp += size;
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
142
13143
d0a29ff182c8 [gaim-migrate @ 15505]
Mark Doliner <markdoliner@pidgin.im>
parents: 13127
diff changeset
143 GETSHORT(type,cp);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
144
13127
0adfbecc67ac [gaim-migrate @ 15488]
Mark Doliner <markdoliner@pidgin.im>
parents: 12847
diff changeset
145 /* skip ttl and class since we already know it */
0adfbecc67ac [gaim-migrate @ 15488]
Mark Doliner <markdoliner@pidgin.im>
parents: 12847
diff changeset
146 cp += 6;
0adfbecc67ac [gaim-migrate @ 15488]
Mark Doliner <markdoliner@pidgin.im>
parents: 12847
diff changeset
147
13143
d0a29ff182c8 [gaim-migrate @ 15505]
Mark Doliner <markdoliner@pidgin.im>
parents: 13127
diff changeset
148 GETSHORT(dlen,cp);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
149
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
150 if (type == T_SRV) {
13143
d0a29ff182c8 [gaim-migrate @ 15505]
Mark Doliner <markdoliner@pidgin.im>
parents: 13127
diff changeset
151 GETSHORT(pref,cp);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
152
13143
d0a29ff182c8 [gaim-migrate @ 15505]
Mark Doliner <markdoliner@pidgin.im>
parents: 13127
diff changeset
153 GETSHORT(weight,cp);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
154
13143
d0a29ff182c8 [gaim-migrate @ 15505]
Mark Doliner <markdoliner@pidgin.im>
parents: 13127
diff changeset
155 GETSHORT(port,cp);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
156
11381
d3d53604fe0f [gaim-migrate @ 13608]
Mark Doliner <markdoliner@pidgin.im>
parents: 11379
diff changeset
157 size = dn_expand( (unsigned char*)&answer, end, cp, name, 256);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
158 if(size < 0 )
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
159 goto end;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
160
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
161 cp += size;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
162
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
163 srvres = g_new0(PurpleSrvResponse, 1);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
164 strcpy(srvres->hostname, name);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
165 srvres->pref = pref;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
166 srvres->port = port;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
167 srvres->weight = weight;
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
168
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
169 ret = g_list_insert_sorted(ret, srvres, responsecompare);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
170 } else {
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
171 cp += dlen;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
172 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
173 }
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
174
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
175 end:
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
176 size = g_list_length(ret);
11430
a532570de9d6 [gaim-migrate @ 13667]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11426
diff changeset
177 write(out, &size, sizeof(int));
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
178 while (ret != NULL)
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
179 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
180 write(out, ret->data, sizeof(PurpleSrvResponse));
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
181 g_free(ret->data);
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
182 ret = g_list_remove(ret, ret->data);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
183 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
184
20128
272326eb883e applied changes from 31d62e1a78974a0239e86bfeb42b29ab75216114
Richard Laager <rlaager@pidgin.im>
parents: 19859
diff changeset
185 close(out);
272326eb883e applied changes from 31d62e1a78974a0239e86bfeb42b29ab75216114
Richard Laager <rlaager@pidgin.im>
parents: 19859
diff changeset
186 close(in);
272326eb883e applied changes from 31d62e1a78974a0239e86bfeb42b29ab75216114
Richard Laager <rlaager@pidgin.im>
parents: 19859
diff changeset
187
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
188 _exit(0);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
189 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
190
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
191 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
192 resolved(gpointer data, gint source, PurpleInputCondition cond)
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
193 {
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
194 int size;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
195 PurpleSrvQueryData *query_data = (PurpleSrvQueryData*)data;
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
196 PurpleSrvResponse *res;
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
197 PurpleSrvResponse *tmp;
11426
46f761f5c7ad [gaim-migrate @ 13663]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11395
diff changeset
198 int i;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
199 PurpleSrvCallback cb = query_data->cb;
15776
cba54f9d2e51 Patch from Graham Booker which ensures that a process forked by dnsserv cleans up afterwards, calling waitpid() to make sure no zombies are left over.
Evan Schoenberg <evands@pidgin.im>
parents: 15718
diff changeset
200 int status;
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
201
16957
b74ce411bea8 If the read() in resolved() fails, we should detect the failure and set size (which it would otherwise set, since it is passed by reference) to 0 and res to NULL. This ''may'' fix a rather odd crash described in Adium Trac #6623 (http://trac.adiumx.com/ticket/6623), and it is certainly good sanity checking.
Evan Schoenberg <evands@pidgin.im>
parents: 16701
diff changeset
202 if (read(source, &size, sizeof(int)) > 0)
b74ce411bea8 If the read() in resolved() fails, we should detect the failure and set size (which it would otherwise set, since it is passed by reference) to 0 and res to NULL. This ''may'' fix a rather odd crash described in Adium Trac #6623 (http://trac.adiumx.com/ticket/6623), and it is certainly good sanity checking.
Evan Schoenberg <evands@pidgin.im>
parents: 16701
diff changeset
203 {
b74ce411bea8 If the read() in resolved() fails, we should detect the failure and set size (which it would otherwise set, since it is passed by reference) to 0 and res to NULL. This ''may'' fix a rather odd crash described in Adium Trac #6623 (http://trac.adiumx.com/ticket/6623), and it is certainly good sanity checking.
Evan Schoenberg <evands@pidgin.im>
parents: 16701
diff changeset
204 purple_debug_info("dnssrv","found %d SRV entries\n", size);
b74ce411bea8 If the read() in resolved() fails, we should detect the failure and set size (which it would otherwise set, since it is passed by reference) to 0 and res to NULL. This ''may'' fix a rather odd crash described in Adium Trac #6623 (http://trac.adiumx.com/ticket/6623), and it is certainly good sanity checking.
Evan Schoenberg <evands@pidgin.im>
parents: 16701
diff changeset
205 tmp = res = g_new0(PurpleSrvResponse, size);
b74ce411bea8 If the read() in resolved() fails, we should detect the failure and set size (which it would otherwise set, since it is passed by reference) to 0 and res to NULL. This ''may'' fix a rather odd crash described in Adium Trac #6623 (http://trac.adiumx.com/ticket/6623), and it is certainly good sanity checking.
Evan Schoenberg <evands@pidgin.im>
parents: 16701
diff changeset
206 for (i = 0; i < size; i++) {
b74ce411bea8 If the read() in resolved() fails, we should detect the failure and set size (which it would otherwise set, since it is passed by reference) to 0 and res to NULL. This ''may'' fix a rather odd crash described in Adium Trac #6623 (http://trac.adiumx.com/ticket/6623), and it is certainly good sanity checking.
Evan Schoenberg <evands@pidgin.im>
parents: 16701
diff changeset
207 read(source, tmp++, sizeof(PurpleSrvResponse));
b74ce411bea8 If the read() in resolved() fails, we should detect the failure and set size (which it would otherwise set, since it is passed by reference) to 0 and res to NULL. This ''may'' fix a rather odd crash described in Adium Trac #6623 (http://trac.adiumx.com/ticket/6623), and it is certainly good sanity checking.
Evan Schoenberg <evands@pidgin.im>
parents: 16701
diff changeset
208 }
b74ce411bea8 If the read() in resolved() fails, we should detect the failure and set size (which it would otherwise set, since it is passed by reference) to 0 and res to NULL. This ''may'' fix a rather odd crash described in Adium Trac #6623 (http://trac.adiumx.com/ticket/6623), and it is certainly good sanity checking.
Evan Schoenberg <evands@pidgin.im>
parents: 16701
diff changeset
209 }
b74ce411bea8 If the read() in resolved() fails, we should detect the failure and set size (which it would otherwise set, since it is passed by reference) to 0 and res to NULL. This ''may'' fix a rather odd crash described in Adium Trac #6623 (http://trac.adiumx.com/ticket/6623), and it is certainly good sanity checking.
Evan Schoenberg <evands@pidgin.im>
parents: 16701
diff changeset
210 else
b74ce411bea8 If the read() in resolved() fails, we should detect the failure and set size (which it would otherwise set, since it is passed by reference) to 0 and res to NULL. This ''may'' fix a rather odd crash described in Adium Trac #6623 (http://trac.adiumx.com/ticket/6623), and it is certainly good sanity checking.
Evan Schoenberg <evands@pidgin.im>
parents: 16701
diff changeset
211 {
b74ce411bea8 If the read() in resolved() fails, we should detect the failure and set size (which it would otherwise set, since it is passed by reference) to 0 and res to NULL. This ''may'' fix a rather odd crash described in Adium Trac #6623 (http://trac.adiumx.com/ticket/6623), and it is certainly good sanity checking.
Evan Schoenberg <evands@pidgin.im>
parents: 16701
diff changeset
212 purple_debug_info("dnssrv","found 0 SRV entries; errno is %i\n", errno);
b74ce411bea8 If the read() in resolved() fails, we should detect the failure and set size (which it would otherwise set, since it is passed by reference) to 0 and res to NULL. This ''may'' fix a rather odd crash described in Adium Trac #6623 (http://trac.adiumx.com/ticket/6623), and it is certainly good sanity checking.
Evan Schoenberg <evands@pidgin.im>
parents: 16701
diff changeset
213 size = 0;
b74ce411bea8 If the read() in resolved() fails, we should detect the failure and set size (which it would otherwise set, since it is passed by reference) to 0 and res to NULL. This ''may'' fix a rather odd crash described in Adium Trac #6623 (http://trac.adiumx.com/ticket/6623), and it is certainly good sanity checking.
Evan Schoenberg <evands@pidgin.im>
parents: 16701
diff changeset
214 res = NULL;
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
215 }
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
216
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
217 cb(res, size, query_data->extradata);
15776
cba54f9d2e51 Patch from Graham Booker which ensures that a process forked by dnsserv cleans up afterwards, calling waitpid() to make sure no zombies are left over.
Evan Schoenberg <evands@pidgin.im>
parents: 15718
diff changeset
218 waitpid(query_data->pid, &status, 0);
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
219
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
220 purple_srv_cancel(query_data);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
221 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
222
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
223 #else /* _WIN32 */
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
224
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
225 /** The Jabber Server code was inspiration for parts of this. */
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
226
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
227 static gboolean
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
228 res_main_thread_cb(gpointer data)
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
229 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
230 PurpleSrvResponse *srvres = NULL;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
231 int size = 0;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
232 PurpleSrvQueryData *query_data = data;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
233
14374
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
234 if(query_data->error_message != NULL)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
235 purple_debug_error("dnssrv", query_data->error_message);
14374
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
236 else {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
237 PurpleSrvResponse *srvres_tmp = NULL;
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
238 GSList *lst = query_data->results;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
239
15859
98b7f9bf8e28 Minor cleanup.
Daniel Atallah <datallah@pidgin.im>
parents: 15776
diff changeset
240 size = g_slist_length(lst);
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
241
15859
98b7f9bf8e28 Minor cleanup.
Daniel Atallah <datallah@pidgin.im>
parents: 15776
diff changeset
242 if(query_data->cb && size > 0)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
243 srvres_tmp = srvres = g_new0(PurpleSrvResponse, size);
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
244 while (lst) {
14374
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
245 if(query_data->cb)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
246 memcpy(srvres_tmp++, lst->data, sizeof(PurpleSrvResponse));
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
247 g_free(lst->data);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
248 lst = g_slist_remove(lst, lst->data);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
249 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
250
14374
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
251 query_data->results = NULL;
15859
98b7f9bf8e28 Minor cleanup.
Daniel Atallah <datallah@pidgin.im>
parents: 15776
diff changeset
252
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
253 purple_debug_info("dnssrv", "found %d SRV entries\n", size);
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
254 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
255
14374
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
256 if(query_data->cb)
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
257 query_data->cb(srvres, size, query_data->extradata);
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
258
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
259 query_data->resolver = NULL;
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
260 query_data->handle = 0;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
261
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
262 purple_srv_cancel(query_data);
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
263
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
264 return FALSE;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
265 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
266
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
267 static gpointer
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
268 res_thread(gpointer data)
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
269 {
12451
d9feea46dac4 [gaim-migrate @ 14760]
Daniel Atallah <datallah@pidgin.im>
parents: 12439
diff changeset
270 PDNS_RECORD dr = NULL;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
271 int type = DNS_TYPE_SRV;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
272 DNS_STATUS ds;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
273 PurpleSrvQueryData *query_data = data;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
274
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
275 ds = MyDnsQuery_UTF8(query_data->query, type, DNS_QUERY_STANDARD, NULL, &dr, NULL);
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
276 if (ds != ERROR_SUCCESS) {
12691
4c178bccdba7 [gaim-migrate @ 15034]
Daniel Atallah <datallah@pidgin.im>
parents: 12686
diff changeset
277 gchar *msg = g_win32_error_message(ds);
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
278 query_data->error_message = g_strdup_printf("Couldn't look up SRV record. %s (%lu).\n", msg, ds);
12691
4c178bccdba7 [gaim-migrate @ 15034]
Daniel Atallah <datallah@pidgin.im>
parents: 12686
diff changeset
279 g_free(msg);
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
280 } else {
12451
d9feea46dac4 [gaim-migrate @ 14760]
Daniel Atallah <datallah@pidgin.im>
parents: 12439
diff changeset
281 PDNS_RECORD dr_tmp;
d9feea46dac4 [gaim-migrate @ 14760]
Daniel Atallah <datallah@pidgin.im>
parents: 12439
diff changeset
282 GSList *lst = NULL;
d9feea46dac4 [gaim-migrate @ 14760]
Daniel Atallah <datallah@pidgin.im>
parents: 12439
diff changeset
283 DNS_SRV_DATA *srv_data;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
284 PurpleSrvResponse *srvres;
12451
d9feea46dac4 [gaim-migrate @ 14760]
Daniel Atallah <datallah@pidgin.im>
parents: 12439
diff changeset
285
d9feea46dac4 [gaim-migrate @ 14760]
Daniel Atallah <datallah@pidgin.im>
parents: 12439
diff changeset
286 for (dr_tmp = dr; dr_tmp != NULL; dr_tmp = dr_tmp->pNext) {
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
287 /* Discard any incorrect entries. I'm not sure if this is necessary */
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
288 if (dr_tmp->wType != type || strcmp(dr_tmp->pName, query_data->query) != 0) {
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
289 continue;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
290 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
291
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
292 srv_data = &dr_tmp->Data.SRV;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
293 srvres = g_new0(PurpleSrvResponse, 1);
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
294 strncpy(srvres->hostname, srv_data->pNameTarget, 255);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
295 srvres->hostname[255] = '\0';
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
296 srvres->pref = srv_data->wPriority;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
297 srvres->port = srv_data->wPort;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
298 srvres->weight = srv_data->wWeight;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
299
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
300 lst = g_slist_insert_sorted(lst, srvres, responsecompare);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
301 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
302
12451
d9feea46dac4 [gaim-migrate @ 14760]
Daniel Atallah <datallah@pidgin.im>
parents: 12439
diff changeset
303 MyDnsRecordListFree(dr, DnsFreeRecordList);
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
304 query_data->results = lst;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
305 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
306
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
307 /* back to main thread */
14374
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
308 /* Note: this should *not* be attached to query_data->handle - it will cause leakage */
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
309 g_idle_add(res_main_thread_cb, query_data);
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
310
12691
4c178bccdba7 [gaim-migrate @ 15034]
Daniel Atallah <datallah@pidgin.im>
parents: 12686
diff changeset
311 g_thread_exit(NULL);
4c178bccdba7 [gaim-migrate @ 15034]
Daniel Atallah <datallah@pidgin.im>
parents: 12686
diff changeset
312 return NULL;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
313 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
314
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
315 #endif
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
316
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
317 PurpleSrvQueryData *
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
318 purple_srv_resolve(const char *protocol, const char *transport, const char *domain, PurpleSrvCallback cb, gpointer extradata)
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
319 {
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
320 char *query;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
321 PurpleSrvQueryData *query_data;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
322 #ifndef _WIN32
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
323 int in[2], out[2];
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
324 int pid;
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
325 #else
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
326 GError* err = NULL;
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
327 static gboolean initialized = FALSE;
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
328 #endif
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
329
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
330 query = g_strdup_printf("_%s._%s.%s", protocol, transport, domain);
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
331 purple_debug_info("dnssrv","querying SRV record for %s\n", query);
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
332
14374
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
333 #ifndef _WIN32
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
334 if(pipe(in) || pipe(out)) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
335 purple_debug_error("dnssrv", "Could not create pipe\n");
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
336 g_free(query);
11382
4458ab177b10 [gaim-migrate @ 13609]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11381
diff changeset
337 cb(NULL, 0, extradata);
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
338 return NULL;
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
339 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
340
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
341 pid = fork();
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
342 if (pid == -1) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
343 purple_debug_error("dnssrv", "Could not create process!\n");
11382
4458ab177b10 [gaim-migrate @ 13609]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11381
diff changeset
344 cb(NULL, 0, extradata);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
345 g_free(query);
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
346 return NULL;
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
347 }
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
348
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
349 /* Child */
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
350 if (pid == 0)
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
351 {
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
352 close(out[0]);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
353 close(in[1]);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
354 resolve(in[0], out[1]);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
355 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
356
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
357 close(out[1]);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
358 close(in[0]);
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
359
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
360 if (write(in[1], query, strlen(query)+1) < 0)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
361 purple_debug_error("dnssrv", "Could not write to SRV resolver\n");
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
362
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
363 query_data = g_new0(PurpleSrvQueryData, 1);
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
364 query_data->cb = cb;
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
365 query_data->extradata = extradata;
15776
cba54f9d2e51 Patch from Graham Booker which ensures that a process forked by dnsserv cleans up afterwards, calling waitpid() to make sure no zombies are left over.
Evan Schoenberg <evands@pidgin.im>
parents: 15718
diff changeset
366 query_data->pid = pid;
20128
272326eb883e applied changes from 31d62e1a78974a0239e86bfeb42b29ab75216114
Richard Laager <rlaager@pidgin.im>
parents: 19859
diff changeset
367 query_data->fd_out = out[0];
272326eb883e applied changes from 31d62e1a78974a0239e86bfeb42b29ab75216114
Richard Laager <rlaager@pidgin.im>
parents: 19859
diff changeset
368 query_data->fd_in = in[1];
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
369 query_data->handle = purple_input_add(out[0], PURPLE_INPUT_READ, resolved, query_data);
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
370
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
371 g_free(query);
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
372
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
373 return query_data;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
374 #else
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
375 if (!initialized) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
376 MyDnsQuery_UTF8 = (void*) wpurple_find_and_loadproc("dnsapi.dll", "DnsQuery_UTF8");
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
377 MyDnsRecordListFree = (void*) wpurple_find_and_loadproc(
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
378 "dnsapi.dll", "DnsRecordListFree");
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
379 initialized = TRUE;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
380 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
381
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
382 query_data = g_new0(PurpleSrvQueryData, 1);
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
383 query_data->cb = cb;
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
384 query_data->query = query;
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
385 query_data->extradata = extradata;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
386
15859
98b7f9bf8e28 Minor cleanup.
Daniel Atallah <datallah@pidgin.im>
parents: 15776
diff changeset
387 if (!MyDnsQuery_UTF8 || !MyDnsRecordListFree)
98b7f9bf8e28 Minor cleanup.
Daniel Atallah <datallah@pidgin.im>
parents: 15776
diff changeset
388 query_data->error_message = g_strdup("System missing DNS API (Requires W2K+)\n");
98b7f9bf8e28 Minor cleanup.
Daniel Atallah <datallah@pidgin.im>
parents: 15776
diff changeset
389 else {
98b7f9bf8e28 Minor cleanup.
Daniel Atallah <datallah@pidgin.im>
parents: 15776
diff changeset
390 query_data->resolver = g_thread_create(res_thread, query_data, FALSE, &err);
98b7f9bf8e28 Minor cleanup.
Daniel Atallah <datallah@pidgin.im>
parents: 15776
diff changeset
391 if (query_data->resolver == NULL) {
98b7f9bf8e28 Minor cleanup.
Daniel Atallah <datallah@pidgin.im>
parents: 15776
diff changeset
392 query_data->error_message = g_strdup_printf("SRV thread create failure: %s\n", (err && err->message) ? err->message : "");
98b7f9bf8e28 Minor cleanup.
Daniel Atallah <datallah@pidgin.im>
parents: 15776
diff changeset
393 g_error_free(err);
98b7f9bf8e28 Minor cleanup.
Daniel Atallah <datallah@pidgin.im>
parents: 15776
diff changeset
394 }
14374
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
395 }
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
396
15859
98b7f9bf8e28 Minor cleanup.
Daniel Atallah <datallah@pidgin.im>
parents: 15776
diff changeset
397 /* The query isn't going to happen, so finish the SRV lookup now.
98b7f9bf8e28 Minor cleanup.
Daniel Atallah <datallah@pidgin.im>
parents: 15776
diff changeset
398 * Asynchronously call the callback since stuff may not expect
98b7f9bf8e28 Minor cleanup.
Daniel Atallah <datallah@pidgin.im>
parents: 15776
diff changeset
399 * the callback to be called before this returns */
98b7f9bf8e28 Minor cleanup.
Daniel Atallah <datallah@pidgin.im>
parents: 15776
diff changeset
400 if (query_data->error_message != NULL)
14374
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
401 query_data->handle = g_idle_add(res_main_thread_cb, query_data);
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
402
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
403 return query_data;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
404 #endif
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
405 }
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
406
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
407 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
408 purple_srv_cancel(PurpleSrvQueryData *query_data)
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
409 {
20128
272326eb883e applied changes from 31d62e1a78974a0239e86bfeb42b29ab75216114
Richard Laager <rlaager@pidgin.im>
parents: 19859
diff changeset
410 printf("purple_srv_cancel(%p)\n", query_data);
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
411 if (query_data->handle > 0)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15776
diff changeset
412 purple_input_remove(query_data->handle);
14374
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
413 #ifdef _WIN32
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
414 if (query_data->resolver != NULL)
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
415 {
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
416 /*
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
417 * It's not really possible to kill a thread. So instead we
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
418 * just set the callback to NULL and let the DNS lookup
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
419 * finish.
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
420 */
14374
a93eedc7aa6b [gaim-migrate @ 17002]
Daniel Atallah <datallah@pidgin.im>
parents: 14370
diff changeset
421 query_data->cb = NULL;
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
422 return;
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
423 }
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
424 g_free(query_data->query);
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
425 g_free(query_data->error_message);
20128
272326eb883e applied changes from 31d62e1a78974a0239e86bfeb42b29ab75216114
Richard Laager <rlaager@pidgin.im>
parents: 19859
diff changeset
426 #else
272326eb883e applied changes from 31d62e1a78974a0239e86bfeb42b29ab75216114
Richard Laager <rlaager@pidgin.im>
parents: 19859
diff changeset
427 close(query_data->fd_out);
272326eb883e applied changes from 31d62e1a78974a0239e86bfeb42b29ab75216114
Richard Laager <rlaager@pidgin.im>
parents: 19859
diff changeset
428 close(query_data->fd_in);
14370
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
429 #endif
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
430 g_free(query_data);
12ef3d4096ee [gaim-migrate @ 16998]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
431 }

mercurial