Mercurial > pidgin
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 |
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 */ | |
22 #include <glib.h> | |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
23 #ifndef _WIN32 |
11373 | 24 #include <resolv.h> |
25 #include <stdlib.h> | |
11630 | 26 #include <arpa/nameser.h> |
11373 | 27 #include <arpa/nameser_compat.h> |
28 #ifndef T_SRV | |
29 #define T_SRV 33 | |
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 | 39 |
40 #include "dnssrv.h" | |
41 #include <stdio.h> | |
42 #include <unistd.h> | |
43 #include <string.h> | |
44 #include "eventloop.h" | |
45 #include "debug.h" | |
46 | |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
47 #ifndef _WIN32 |
11373 | 48 typedef union { |
49 HEADER hdr; | |
50 u_char buf[1024]; | |
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 | 60 |
61 struct resdata { | |
62 SRVCallback cb; | |
11382 | 63 gpointer extradata; |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
64 #ifndef _WIN32 |
11373 | 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 | 71 }; |
72 | |
73 static gint responsecompare(gconstpointer ar, gconstpointer br) { | |
74 struct srv_response *a = (struct srv_response*)ar; | |
75 struct srv_response *b = (struct srv_response*)br; | |
76 | |
77 if(a->pref == b->pref) { | |
78 if(a->weight == b->weight) | |
79 return 0; | |
80 if(a->weight < b->weight) | |
81 return -1; | |
82 return 1; | |
83 } | |
84 if(a->pref < b->pref) | |
85 return -1; | |
86 return 1; | |
87 } | |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
88 #ifndef _WIN32 |
11373 | 89 static void resolve(int in, int out) { |
90 GList *ret = NULL; | |
91 struct srv_response *srvres; | |
92 queryans answer; | |
93 int size; | |
94 int qdcount; | |
95 int ancount; | |
11381 | 96 guchar *end; |
97 guchar *cp; | |
11373 | 98 gchar name[256]; |
99 int type, dlen, pref, weight, port; | |
100 gchar query[256]; | |
101 | |
102 if(read(in, query, 256) <= 0) { | |
103 _exit(0); | |
104 } | |
105 size = res_query( query, C_IN, T_SRV, (u_char*)&answer, sizeof( answer)); | |
106 | |
107 qdcount = ntohs(answer.hdr.qdcount); | |
108 ancount = ntohs(answer.hdr.ancount); | |
109 | |
11395
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
110 |
11381 | 111 cp = (guchar*)&answer + sizeof(HEADER); |
112 end = (guchar*)&answer + size; | |
11373 | 113 |
114 /* skip over unwanted stuff */ | |
115 while (qdcount-- > 0 && cp < end) { | |
11381 | 116 size = dn_expand( (unsigned char*)&answer, end, cp, name, 256); |
11373 | 117 if(size < 0) goto end; |
118 cp += size + QFIXEDSZ; | |
119 } | |
120 | |
121 while (ancount-- > 0 && cp < end) { | |
11381 | 122 size = dn_expand((unsigned char*)&answer, end, cp, name, 256); |
11373 | 123 if(size < 0) |
124 goto end; | |
125 | |
126 cp += size; | |
11395
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
127 |
11373 | 128 NS_GET16(type,cp); |
129 cp += 6; /* skip ttl and class since we already know it */ | |
130 | |
131 NS_GET16(dlen,cp); | |
132 | |
133 if (type == T_SRV) { | |
134 NS_GET16(pref,cp); | |
135 | |
136 NS_GET16(weight, cp); | |
137 | |
138 NS_GET16(port, cp); | |
139 | |
11381 | 140 size = dn_expand( (unsigned char*)&answer, end, cp, name, 256); |
11373 | 141 if(size < 0 ) |
142 goto end; | |
143 | |
144 cp += size; | |
145 | |
146 srvres = g_new0(struct srv_response,1); | |
147 strcpy(srvres->hostname, name); | |
148 srvres->pref = pref; | |
149 srvres->port = port; | |
150 srvres->weight = weight; | |
11395
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
151 |
11373 | 152 ret = g_list_insert_sorted(ret, srvres, responsecompare); |
153 } else { | |
154 cp += dlen; | |
155 } | |
156 } | |
157 end: size = g_list_length(ret); | |
11430 | 158 write(out, &size, sizeof(int)); |
11373 | 159 while(g_list_first(ret)) { |
160 write(out, g_list_first(ret)->data, sizeof(struct srv_response)); | |
161 g_free(g_list_first(ret)->data); | |
162 ret = g_list_remove(ret, g_list_first(ret)->data); | |
163 } | |
164 | |
165 /* Should the resolver be reused? | |
166 * There is most likely only 1 SRV queries per prpl... | |
167 */ | |
11395
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
168 _exit(0); |
11373 | 169 } |
170 | |
171 static void resolved(gpointer data, gint source, GaimInputCondition cond) { | |
172 int size; | |
173 struct resdata *rdata = (struct resdata*)data; | |
174 struct srv_response *res; | |
175 struct srv_response *tmp; | |
11426 | 176 int i; |
11373 | 177 SRVCallback cb = rdata->cb; |
178 | |
11430 | 179 read(source, &size, sizeof(int)); |
11373 | 180 gaim_debug_info("srv","found %d SRV entries\n", size); |
181 tmp = res = g_malloc0(sizeof(struct srv_response)*size); | |
11426 | 182 i = size; |
183 while(i) { | |
11373 | 184 read(source, tmp++, sizeof(struct srv_response)); |
11426 | 185 i--; |
11373 | 186 } |
11382 | 187 cb(res, size, rdata->extradata); |
11373 | 188 gaim_input_remove(rdata->handle); |
189 g_free(rdata); | |
190 } | |
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 | 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 | 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 | 280 int in[2], out[2]; |
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 | 283 if(pipe(in) || pipe(out)) { |
284 gaim_debug_error("srv", "Could not create pipe\n"); | |
285 g_free(query); | |
11382 | 286 cb(NULL, 0, extradata); |
11373 | 287 return; |
288 } | |
289 | |
290 pid = fork(); | |
291 | |
292 if(pid == -1) { | |
293 gaim_debug_error("srv","Could not create process!\n"); | |
11382 | 294 cb(NULL, 0, extradata); |
11373 | 295 g_free(query); |
296 return; | |
297 } | |
298 /* Child */ | |
299 if( pid == 0 ) { | |
300 close(out[0]); | |
301 close(in[1]); | |
302 resolve(in[0], out[1]); | |
303 } | |
304 | |
305 close(out[1]); | |
306 close(in[0]); | |
11395
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
307 |
11373 | 308 if(write(in[1], query, strlen(query)+1)<0) { |
309 gaim_debug_error("srv", "Could not write to SRV resolver\n"); | |
310 } | |
311 rdata = g_new0(struct resdata,1); | |
312 rdata->cb = cb; | |
11382 | 313 rdata->extradata = extradata; |
11373 | 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 | 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 | 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 | 349 } |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
350 |