Mercurial > pidgin
annotate src/dnssrv.c @ 11562:9f521a61ef58
[gaim-migrate @ 13828]
More tiny changes. Forward port my saving password through failed connections change, and attach to the Message Send signal of the statusbox imhtml, so that hitting Enter sets the message immediately. I like the timeout; but this will probably make more sense to most people.
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Wed, 21 Sep 2005 22:57:10 +0000 |
parents | d3b870be8759 |
children | 33cdc34b3a63 |
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> | |
26 #include <arpa/nameser_compat.h> | |
27 #ifndef T_SRV | |
28 #define T_SRV 33 | |
29 #endif | |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
30 #else |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
31 #include "win32dep.h" |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
32 #include <windns.h> |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
33 /* Missing from the mingw headers */ |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
34 #ifndef DNS_TYPE_SRV |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
35 # define DNS_TYPE_SRV 33 |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
36 #endif |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
37 #endif |
11373 | 38 |
39 #include "dnssrv.h" | |
40 #include <stdio.h> | |
41 #include <unistd.h> | |
42 #include <string.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 |
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
52 static DNS_STATUS (*MyDnsQuery_UTF8) ( |
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; |
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
56 static void (*MyDnsRecordListFree) (PDNS_RECORD pRecordList, |
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 { | |
61 SRVCallback 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) { | |
73 struct srv_response *a = (struct srv_response*)ar; | |
74 struct srv_response *b = (struct srv_response*)br; | |
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; | |
90 struct srv_response *srvres; | |
91 queryans answer; | |
92 int size; | |
93 int qdcount; | |
94 int ancount; | |
11381 | 95 guchar *end; |
96 guchar *cp; | |
11373 | 97 gchar name[256]; |
98 int type, dlen, pref, weight, port; | |
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 |
11373 | 127 NS_GET16(type,cp); |
128 cp += 6; /* skip ttl and class since we already know it */ | |
129 | |
130 NS_GET16(dlen,cp); | |
131 | |
132 if (type == T_SRV) { | |
133 NS_GET16(pref,cp); | |
134 | |
135 NS_GET16(weight, cp); | |
136 | |
137 NS_GET16(port, cp); | |
138 | |
11381 | 139 size = dn_expand( (unsigned char*)&answer, end, cp, name, 256); |
11373 | 140 if(size < 0 ) |
141 goto end; | |
142 | |
143 cp += size; | |
144 | |
145 srvres = g_new0(struct srv_response,1); | |
146 strcpy(srvres->hostname, name); | |
147 srvres->pref = pref; | |
148 srvres->port = port; | |
149 srvres->weight = weight; | |
11395
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
150 |
11373 | 151 ret = g_list_insert_sorted(ret, srvres, responsecompare); |
152 } else { | |
153 cp += dlen; | |
154 } | |
155 } | |
156 end: size = g_list_length(ret); | |
11430 | 157 write(out, &size, sizeof(int)); |
11373 | 158 while(g_list_first(ret)) { |
159 write(out, g_list_first(ret)->data, sizeof(struct srv_response)); | |
160 g_free(g_list_first(ret)->data); | |
161 ret = g_list_remove(ret, g_list_first(ret)->data); | |
162 } | |
163 | |
164 /* Should the resolver be reused? | |
165 * There is most likely only 1 SRV queries per prpl... | |
166 */ | |
11395
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
167 _exit(0); |
11373 | 168 } |
169 | |
170 static void resolved(gpointer data, gint source, GaimInputCondition cond) { | |
171 int size; | |
172 struct resdata *rdata = (struct resdata*)data; | |
173 struct srv_response *res; | |
174 struct srv_response *tmp; | |
11426 | 175 int i; |
11373 | 176 SRVCallback cb = rdata->cb; |
177 | |
11430 | 178 read(source, &size, sizeof(int)); |
11373 | 179 gaim_debug_info("srv","found %d SRV entries\n", size); |
180 tmp = res = g_malloc0(sizeof(struct srv_response)*size); | |
11426 | 181 i = size; |
182 while(i) { | |
11373 | 183 read(source, tmp++, sizeof(struct srv_response)); |
11426 | 184 i--; |
11373 | 185 } |
11382 | 186 cb(res, size, rdata->extradata); |
11373 | 187 gaim_input_remove(rdata->handle); |
188 g_free(rdata); | |
189 } | |
190 | |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
191 #else /* _WIN32 */ |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
192 |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
193 /** The Jabber Server code was inspiration for parts of this. */ |
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 static gboolean res_main_thread_cb(gpointer data) { |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
196 struct srv_response *srvres = NULL; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
197 int size = 0; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
198 struct resdata *rdata = data; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
199 |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
200 if (rdata->errmsg != NULL) { |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
201 gaim_debug_error("srv", rdata->errmsg); |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
202 g_free(rdata->errmsg); |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
203 } else { |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
204 struct srv_response *srvres_tmp; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
205 GSList *lst = rdata->results; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
206 |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
207 size = g_slist_length(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 srvres_tmp = srvres = g_malloc0(sizeof(struct srv_response) * size); |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
210 while (lst) { |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
211 memcpy(srvres_tmp++, lst->data, sizeof(struct srv_response)); |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
212 g_free(lst->data); |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
213 lst = g_slist_remove(lst, lst->data); |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
214 } |
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 rdata->results = lst; |
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 |
11395
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
219 gaim_debug_info("srv", "found %d SRV entries\n", size); |
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
220 |
11382 | 221 rdata->cb(srvres, size, rdata->extradata); |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
222 |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
223 g_free(rdata->query); |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
224 g_free(rdata); |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
225 |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
226 return FALSE; |
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 |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
229 static gpointer res_thread(gpointer data) { |
11395
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
230 DNS_RECORD *dr = NULL; |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
231 GSList *lst = NULL; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
232 struct srv_response *srvres; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
233 DNS_SRV_DATA *srv_data; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
234 int type = DNS_TYPE_SRV; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
235 DNS_STATUS ds; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
236 struct resdata *rdata = data; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
237 |
11395
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
238 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
|
239 if (ds != ERROR_SUCCESS) { |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
240 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
|
241 } else { |
11395
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
242 DNS_RECORD *dr_tmp = dr; |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
243 while (dr_tmp != NULL) { |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
244 /* 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
|
245 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
|
246 dr_tmp = dr_tmp->pNext; |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
247 continue; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
248 } |
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 srv_data = &dr_tmp->Data.SRV; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
251 srvres = g_new0(struct srv_response, 1); |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
252 strncpy(srvres->hostname, srv_data->pNameTarget, 255); |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
253 srvres->hostname[255] = '\0'; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
254 srvres->pref = srv_data->wPriority; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
255 srvres->port = srv_data->wPort; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
256 srvres->weight = srv_data->wWeight; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
257 |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
258 lst = g_slist_insert_sorted(lst, srvres, responsecompare); |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
259 |
11395
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
260 dr_tmp = dr_tmp->pNext; |
11379
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 |
11395
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
263 MyDnsRecordListFree(dr, DnsFreeRecordList); |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
264 rdata->results = lst; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
265 } |
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 /* back to main thread */ |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
268 g_idle_add(res_main_thread_cb, rdata); |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
269 |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
270 return 0; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
271 } |
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 #endif |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
274 |
11444
d3b870be8759
[gaim-migrate @ 13683]
Richard Laager <rlaager@wiktel.com>
parents:
11430
diff
changeset
|
275 void gaim_srv_resolve(const char *protocol, const char *transport, const char *domain, SRVCallback cb, gpointer extradata) { |
11373 | 276 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
|
277 struct resdata *rdata; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
278 #ifndef _WIN32 |
11373 | 279 int in[2], out[2]; |
280 int pid; | |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
281 gaim_debug_info("srv","querying SRV record for %s\n", query); |
11373 | 282 if(pipe(in) || pipe(out)) { |
283 gaim_debug_error("srv", "Could not create pipe\n"); | |
284 g_free(query); | |
11382 | 285 cb(NULL, 0, extradata); |
11373 | 286 return; |
287 } | |
288 | |
289 pid = fork(); | |
290 | |
291 if(pid == -1) { | |
292 gaim_debug_error("srv","Could not create process!\n"); | |
11382 | 293 cb(NULL, 0, extradata); |
11373 | 294 g_free(query); |
295 return; | |
296 } | |
297 /* Child */ | |
298 if( pid == 0 ) { | |
299 close(out[0]); | |
300 close(in[1]); | |
301 resolve(in[0], out[1]); | |
302 } | |
303 | |
304 close(out[1]); | |
305 close(in[0]); | |
11395
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
306 |
11373 | 307 if(write(in[1], query, strlen(query)+1)<0) { |
308 gaim_debug_error("srv", "Could not write to SRV resolver\n"); | |
309 } | |
310 rdata = g_new0(struct resdata,1); | |
311 rdata->cb = cb; | |
11382 | 312 rdata->extradata = extradata; |
11373 | 313 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
|
314 |
11373 | 315 g_free(query); |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
316 #else |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
317 GError* err = NULL; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
318 |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
319 static gboolean initialized = FALSE; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
320 |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
321 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
|
322 |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
323 if (!initialized) { |
11395
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
324 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
|
325 MyDnsRecordListFree = (void*) wgaim_find_and_loadproc( |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
326 "dnsapi.dll", "DnsRecordListFree"); |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
327 initialized = TRUE; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
328 } |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
329 |
11395
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
330 if (!MyDnsQuery_UTF8 || !MyDnsRecordListFree) { |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
331 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
|
332 g_free(query); |
11382 | 333 cb(NULL, 0, extradata); |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
334 return; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
335 } |
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 rdata = g_new0(struct resdata, 1); |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
338 rdata->cb = cb; |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
339 rdata->query = query; |
11395
f0e03a3ca3b5
[gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11382
diff
changeset
|
340 rdata->extradata = extradata; |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
341 |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
342 if (!g_thread_create(res_thread, rdata, FALSE, &err)) { |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
343 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
|
344 g_error_free(err); |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
345 res_main_thread_cb(rdata); |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
346 } |
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
347 #endif |
11373 | 348 } |
11379
51c189755f1d
[gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11373
diff
changeset
|
349 |