annotate src/dnssrv.c @ 11849:dc51cdcb648e

[gaim-migrate @ 14140] sf patch #1339135, from Sadrul Habib Chowdhury Hi. Bleeter found this bug: (1) open up some conversation window (2) open the smiley dialog (3) close the conversation window. the smiley dialog remains open (4) select some smiley (5) Gaim crashes This patch fixes this crash. It shouldn't cause any probs with regards to gtk-version-checking. The other code handling the smiley-dialog doesn't do the version-checking, so this shouldn't be necessary either. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Thu, 27 Oct 2005 12:00:17 +0000
parents 33cdc34b3a63
children 8d019c4bf454
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
1 /**
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
2 * @file dnssrv.c
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
3 *
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
4 * gaim
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
5 *
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
6 * Copyright (C) 2005 Thomas Butter <butter@uni-mannheim.de>
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
7 *
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
11 * (at your option) any later version.
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
12 *
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
16 * GNU General Public License for more details.
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
17 *
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
21 */
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
22 #include <glib.h>
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
23 #ifndef _WIN32
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
24 #include <resolv.h>
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
25 #include <stdlib.h>
11630
33cdc34b3a63 [gaim-migrate @ 13905]
Mark Doliner <mark@kingant.net>
parents: 11444
diff changeset
26 #include <arpa/nameser.h>
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
27 #include <arpa/nameser_compat.h>
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
28 #ifndef T_SRV
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
29 #define T_SRV 33
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
30 #endif
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
31 #else
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
32 #include "win32dep.h"
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
33 #include <windns.h>
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
34 /* Missing from the mingw headers */
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
35 #ifndef DNS_TYPE_SRV
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
36 # define DNS_TYPE_SRV 33
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
37 #endif
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
38 #endif
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
39
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
40 #include "dnssrv.h"
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
41 #include <stdio.h>
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
42 #include <unistd.h>
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
43 #include <string.h>
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
44 #include "eventloop.h"
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
45 #include "debug.h"
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
46
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
47 #ifndef _WIN32
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
48 typedef union {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
49 HEADER hdr;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
50 u_char buf[1024];
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
51 } queryans;
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
52 #else
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
53 static DNS_STATUS (*MyDnsQuery_UTF8) (
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
54 PCSTR lpstrName, WORD wType, DWORD fOptions,
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
55 PIP4_ARRAY aipServers, PDNS_RECORD* ppQueryResultsSet,
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
56 PVOID* pReserved) = NULL;
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
57 static void (*MyDnsRecordListFree) (PDNS_RECORD pRecordList,
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
58 DNS_FREE_TYPE FreeType) = NULL;
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
59 #endif
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
60
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
61 struct resdata {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
62 SRVCallback cb;
11382
bdeace860555 [gaim-migrate @ 13609]
Thomas Butter <tbutter>
parents: 11381
diff changeset
63 gpointer extradata;
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
64 #ifndef _WIN32
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
65 guint handle;
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
66 #else
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
67 char *query;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
68 char *errmsg;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
69 GSList *results;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
70 #endif
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
71 };
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
72
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
73 static gint responsecompare(gconstpointer ar, gconstpointer br) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
74 struct srv_response *a = (struct srv_response*)ar;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
75 struct srv_response *b = (struct srv_response*)br;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
76
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
77 if(a->pref == b->pref) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
78 if(a->weight == b->weight)
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
79 return 0;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
80 if(a->weight < b->weight)
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
81 return -1;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
82 return 1;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
83 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
84 if(a->pref < b->pref)
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
85 return -1;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
86 return 1;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
87 }
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
88 #ifndef _WIN32
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
89 static void resolve(int in, int out) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
90 GList *ret = NULL;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
91 struct srv_response *srvres;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
92 queryans answer;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
93 int size;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
94 int qdcount;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
95 int ancount;
11381
e0f42900de12 [gaim-migrate @ 13608]
Mark Doliner <mark@kingant.net>
parents: 11379
diff changeset
96 guchar *end;
e0f42900de12 [gaim-migrate @ 13608]
Mark Doliner <mark@kingant.net>
parents: 11379
diff changeset
97 guchar *cp;
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
98 gchar name[256];
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
99 int type, dlen, pref, weight, port;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
100 gchar query[256];
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
101
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
102 if(read(in, query, 256) <= 0) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
103 _exit(0);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
104 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
105 size = res_query( query, C_IN, T_SRV, (u_char*)&answer, sizeof( answer));
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
106
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
107 qdcount = ntohs(answer.hdr.qdcount);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
108 ancount = ntohs(answer.hdr.ancount);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
109
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
110
11381
e0f42900de12 [gaim-migrate @ 13608]
Mark Doliner <mark@kingant.net>
parents: 11379
diff changeset
111 cp = (guchar*)&answer + sizeof(HEADER);
e0f42900de12 [gaim-migrate @ 13608]
Mark Doliner <mark@kingant.net>
parents: 11379
diff changeset
112 end = (guchar*)&answer + size;
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
113
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
114 /* skip over unwanted stuff */
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
115 while (qdcount-- > 0 && cp < end) {
11381
e0f42900de12 [gaim-migrate @ 13608]
Mark Doliner <mark@kingant.net>
parents: 11379
diff changeset
116 size = dn_expand( (unsigned char*)&answer, end, cp, name, 256);
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
117 if(size < 0) goto end;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
118 cp += size + QFIXEDSZ;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
119 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
120
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
121 while (ancount-- > 0 && cp < end) {
11381
e0f42900de12 [gaim-migrate @ 13608]
Mark Doliner <mark@kingant.net>
parents: 11379
diff changeset
122 size = dn_expand((unsigned char*)&answer, end, cp, name, 256);
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
123 if(size < 0)
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
124 goto end;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
125
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
126 cp += size;
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
127
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
128 NS_GET16(type,cp);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
129 cp += 6; /* skip ttl and class since we already know it */
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
130
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
131 NS_GET16(dlen,cp);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
132
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
133 if (type == T_SRV) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
134 NS_GET16(pref,cp);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
135
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
136 NS_GET16(weight, cp);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
137
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
138 NS_GET16(port, cp);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
139
11381
e0f42900de12 [gaim-migrate @ 13608]
Mark Doliner <mark@kingant.net>
parents: 11379
diff changeset
140 size = dn_expand( (unsigned char*)&answer, end, cp, name, 256);
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
141 if(size < 0 )
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
142 goto end;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
143
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
144 cp += size;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
145
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
146 srvres = g_new0(struct srv_response,1);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
147 strcpy(srvres->hostname, name);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
148 srvres->pref = pref;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
149 srvres->port = port;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
150 srvres->weight = weight;
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
151
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
152 ret = g_list_insert_sorted(ret, srvres, responsecompare);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
153 } else {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
154 cp += dlen;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
155 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
156 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
157 end: size = g_list_length(ret);
11430
4b7087777411 [gaim-migrate @ 13667]
Thomas Butter <tbutter>
parents: 11426
diff changeset
158 write(out, &size, sizeof(int));
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
159 while(g_list_first(ret)) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
160 write(out, g_list_first(ret)->data, sizeof(struct srv_response));
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
161 g_free(g_list_first(ret)->data);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
162 ret = g_list_remove(ret, g_list_first(ret)->data);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
163 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
164
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
165 /* Should the resolver be reused?
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
166 * There is most likely only 1 SRV queries per prpl...
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
167 */
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
168 _exit(0);
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
169 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
170
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
171 static void resolved(gpointer data, gint source, GaimInputCondition cond) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
172 int size;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
173 struct resdata *rdata = (struct resdata*)data;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
174 struct srv_response *res;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
175 struct srv_response *tmp;
11426
d678a37c16d9 [gaim-migrate @ 13663]
Thomas Butter <tbutter>
parents: 11395
diff changeset
176 int i;
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
177 SRVCallback cb = rdata->cb;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
178
11430
4b7087777411 [gaim-migrate @ 13667]
Thomas Butter <tbutter>
parents: 11426
diff changeset
179 read(source, &size, sizeof(int));
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
180 gaim_debug_info("srv","found %d SRV entries\n", size);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
181 tmp = res = g_malloc0(sizeof(struct srv_response)*size);
11426
d678a37c16d9 [gaim-migrate @ 13663]
Thomas Butter <tbutter>
parents: 11395
diff changeset
182 i = size;
d678a37c16d9 [gaim-migrate @ 13663]
Thomas Butter <tbutter>
parents: 11395
diff changeset
183 while(i) {
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
184 read(source, tmp++, sizeof(struct srv_response));
11426
d678a37c16d9 [gaim-migrate @ 13663]
Thomas Butter <tbutter>
parents: 11395
diff changeset
185 i--;
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
186 }
11382
bdeace860555 [gaim-migrate @ 13609]
Thomas Butter <tbutter>
parents: 11381
diff changeset
187 cb(res, size, rdata->extradata);
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
188 gaim_input_remove(rdata->handle);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
189 g_free(rdata);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
190 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
191
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
192 #else /* _WIN32 */
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
193
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
194 /** The Jabber Server code was inspiration for parts of this. */
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
195
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
196 static gboolean res_main_thread_cb(gpointer data) {
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
197 struct srv_response *srvres = NULL;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
198 int size = 0;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
199 struct resdata *rdata = data;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
200
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
201 if (rdata->errmsg != NULL) {
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
202 gaim_debug_error("srv", rdata->errmsg);
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
203 g_free(rdata->errmsg);
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
204 } else {
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
205 struct srv_response *srvres_tmp;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
206 GSList *lst = rdata->results;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
207
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
208 size = g_slist_length(rdata->results);
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
209
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
210 srvres_tmp = srvres = g_malloc0(sizeof(struct srv_response) * size);
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
211 while (lst) {
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
212 memcpy(srvres_tmp++, lst->data, sizeof(struct srv_response));
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
213 g_free(lst->data);
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
214 lst = g_slist_remove(lst, lst->data);
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
215 }
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
216
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
217 rdata->results = lst;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
218 }
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
219
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
220 gaim_debug_info("srv", "found %d SRV entries\n", size);
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
221
11382
bdeace860555 [gaim-migrate @ 13609]
Thomas Butter <tbutter>
parents: 11381
diff changeset
222 rdata->cb(srvres, size, rdata->extradata);
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
223
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
224 g_free(rdata->query);
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
225 g_free(rdata);
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
226
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
227 return FALSE;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
228 }
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
229
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
230 static gpointer res_thread(gpointer data) {
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
231 DNS_RECORD *dr = NULL;
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
232 GSList *lst = NULL;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
233 struct srv_response *srvres;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
234 DNS_SRV_DATA *srv_data;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
235 int type = DNS_TYPE_SRV;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
236 DNS_STATUS ds;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
237 struct resdata *rdata = data;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
238
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
239 ds = MyDnsQuery_UTF8(rdata->query, type, DNS_QUERY_STANDARD, NULL, &dr, NULL);
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
240 if (ds != ERROR_SUCCESS) {
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
241 rdata->errmsg = g_strdup_printf("Couldn't look up SRV record. Error = %d\n", (int) ds);
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
242 } else {
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
243 DNS_RECORD *dr_tmp = dr;
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
244 while (dr_tmp != NULL) {
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
245 /* Discard any incorrect entries. I'm not sure if this is necessary */
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
246 if (dr_tmp->wType != type || strcmp(dr_tmp->pName, rdata->query) != 0) {
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
247 dr_tmp = dr_tmp->pNext;
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
248 continue;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
249 }
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
250
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
251 srv_data = &dr_tmp->Data.SRV;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
252 srvres = g_new0(struct srv_response, 1);
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
253 strncpy(srvres->hostname, srv_data->pNameTarget, 255);
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
254 srvres->hostname[255] = '\0';
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
255 srvres->pref = srv_data->wPriority;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
256 srvres->port = srv_data->wPort;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
257 srvres->weight = srv_data->wWeight;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
258
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
259 lst = g_slist_insert_sorted(lst, srvres, responsecompare);
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
260
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
261 dr_tmp = dr_tmp->pNext;
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
262 }
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
263
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
264 MyDnsRecordListFree(dr, DnsFreeRecordList);
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
265 rdata->results = lst;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
266 }
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
267
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
268 /* back to main thread */
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
269 g_idle_add(res_main_thread_cb, rdata);
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
270
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
271 return 0;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
272 }
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
273
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
274 #endif
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
275
11444
d3b870be8759 [gaim-migrate @ 13683]
Richard Laager <rlaager@wiktel.com>
parents: 11430
diff changeset
276 void gaim_srv_resolve(const char *protocol, const char *transport, const char *domain, SRVCallback cb, gpointer extradata) {
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
277 char *query = g_strdup_printf("_%s._%s.%s",protocol, transport, domain);
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
278 struct resdata *rdata;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
279 #ifndef _WIN32
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
280 int in[2], out[2];
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
281 int pid;
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
282 gaim_debug_info("srv","querying SRV record for %s\n", query);
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
283 if(pipe(in) || pipe(out)) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
284 gaim_debug_error("srv", "Could not create pipe\n");
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
285 g_free(query);
11382
bdeace860555 [gaim-migrate @ 13609]
Thomas Butter <tbutter>
parents: 11381
diff changeset
286 cb(NULL, 0, extradata);
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
287 return;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
288 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
289
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
290 pid = fork();
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
291
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
292 if(pid == -1) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
293 gaim_debug_error("srv","Could not create process!\n");
11382
bdeace860555 [gaim-migrate @ 13609]
Thomas Butter <tbutter>
parents: 11381
diff changeset
294 cb(NULL, 0, extradata);
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
295 g_free(query);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
296 return;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
297 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
298 /* Child */
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
299 if( pid == 0 ) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
300 close(out[0]);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
301 close(in[1]);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
302 resolve(in[0], out[1]);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
303 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
304
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
305 close(out[1]);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
306 close(in[0]);
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
307
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
308 if(write(in[1], query, strlen(query)+1)<0) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
309 gaim_debug_error("srv", "Could not write to SRV resolver\n");
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
310 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
311 rdata = g_new0(struct resdata,1);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
312 rdata->cb = cb;
11382
bdeace860555 [gaim-migrate @ 13609]
Thomas Butter <tbutter>
parents: 11381
diff changeset
313 rdata->extradata = extradata;
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
314 rdata->handle = gaim_input_add(out[0], GAIM_INPUT_READ, resolved, rdata);
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
315
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
316 g_free(query);
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
317 #else
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
318 GError* err = NULL;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
319
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
320 static gboolean initialized = FALSE;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
321
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
322 gaim_debug_info("srv","querying SRV record for %s\n", query);
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
323
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
324 if (!initialized) {
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
325 MyDnsQuery_UTF8 = (void*) wgaim_find_and_loadproc("dnsapi.dll", "DnsQuery_UTF8");
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
326 MyDnsRecordListFree = (void*) wgaim_find_and_loadproc(
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
327 "dnsapi.dll", "DnsRecordListFree");
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
328 initialized = TRUE;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
329 }
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
330
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
331 if (!MyDnsQuery_UTF8 || !MyDnsRecordListFree) {
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
332 gaim_debug_error("srv", "System missing DNS API (Requires W2K+)\n");
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
333 g_free(query);
11382
bdeace860555 [gaim-migrate @ 13609]
Thomas Butter <tbutter>
parents: 11381
diff changeset
334 cb(NULL, 0, extradata);
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
335 return;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
336 }
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
337
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
338 rdata = g_new0(struct resdata, 1);
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
339 rdata->cb = cb;
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
340 rdata->query = query;
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
341 rdata->extradata = extradata;
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
342
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
343 if (!g_thread_create(res_thread, rdata, FALSE, &err)) {
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
344 rdata->errmsg = g_strdup_printf("SRV thread create failure: %s\n", err ? err->message : "");
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
345 g_error_free(err);
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
346 res_main_thread_cb(rdata);
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
347 }
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
348 #endif
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
349 }
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
350