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