Mercurial > pidgin
comparison src/dnssrv.c @ 11382:bdeace860555
[gaim-migrate @ 13609]
make SRV lookup useful for real life usage
committer: Tailor Script <tailor@pidgin.im>
author | Thomas Butter <tbutter> |
---|---|
date | Wed, 31 Aug 2005 09:14:11 +0000 |
parents | e0f42900de12 |
children | f0e03a3ca3b5 |
comparison
equal
deleted
inserted
replaced
11381:e0f42900de12 | 11382:bdeace860555 |
---|---|
50 } queryans; | 50 } queryans; |
51 #endif | 51 #endif |
52 | 52 |
53 struct resdata { | 53 struct resdata { |
54 SRVCallback cb; | 54 SRVCallback cb; |
55 gpointer extradata; | |
55 #ifndef _WIN32 | 56 #ifndef _WIN32 |
56 guint handle; | 57 guint handle; |
57 #else | 58 #else |
58 DNS_STATUS (*DnsQuery) (PCSTR lpstrName, WORD wType, DWORD fOptions, | 59 DNS_STATUS (*DnsQuery) (PCSTR lpstrName, WORD wType, DWORD fOptions, |
59 PIP4_ARRAY aipServers, PDNS_RECORD* ppQueryResultsSet, PVOID* pReserved); | 60 PIP4_ARRAY aipServers, PDNS_RECORD* ppQueryResultsSet, PVOID* pReserved); |
174 tmp = res = g_malloc0(sizeof(struct srv_response)*size); | 175 tmp = res = g_malloc0(sizeof(struct srv_response)*size); |
175 while(size) { | 176 while(size) { |
176 read(source, tmp++, sizeof(struct srv_response)); | 177 read(source, tmp++, sizeof(struct srv_response)); |
177 size--; | 178 size--; |
178 } | 179 } |
179 cb(res, size); | 180 cb(res, size, rdata->extradata); |
180 gaim_input_remove(rdata->handle); | 181 gaim_input_remove(rdata->handle); |
181 g_free(rdata); | 182 g_free(rdata); |
182 } | 183 } |
183 | 184 |
184 #else /* _WIN32 */ | 185 #else /* _WIN32 */ |
209 } | 210 } |
210 | 211 |
211 rdata->results = lst; | 212 rdata->results = lst; |
212 } | 213 } |
213 | 214 |
214 rdata->cb(srvres, size); | 215 rdata->cb(srvres, size, rdata->extradata); |
215 | 216 |
216 g_free(rdata->query); | 217 g_free(rdata->query); |
217 g_free(rdata); | 218 g_free(rdata); |
218 | 219 |
219 return FALSE; | 220 return FALSE; |
263 return 0; | 264 return 0; |
264 } | 265 } |
265 | 266 |
266 #endif | 267 #endif |
267 | 268 |
268 void gaim_srv_resolve(char *protocol, char *transport, char *domain, SRVCallback cb) { | 269 void gaim_srv_resolve(char *protocol, char *transport, char *domain, SRVCallback cb, gpointer extradata) { |
269 char *query = g_strdup_printf("_%s._%s.%s",protocol, transport, domain); | 270 char *query = g_strdup_printf("_%s._%s.%s",protocol, transport, domain); |
270 struct resdata *rdata; | 271 struct resdata *rdata; |
271 #ifndef _WIN32 | 272 #ifndef _WIN32 |
272 int in[2], out[2]; | 273 int in[2], out[2]; |
273 int pid; | 274 int pid; |
274 gaim_debug_info("srv","querying SRV record for %s\n", query); | 275 gaim_debug_info("srv","querying SRV record for %s\n", query); |
275 if(pipe(in) || pipe(out)) { | 276 if(pipe(in) || pipe(out)) { |
276 gaim_debug_error("srv", "Could not create pipe\n"); | 277 gaim_debug_error("srv", "Could not create pipe\n"); |
277 g_free(query); | 278 g_free(query); |
278 cb(NULL, 0); | 279 cb(NULL, 0, extradata); |
279 return; | 280 return; |
280 } | 281 } |
281 | 282 |
282 pid = fork(); | 283 pid = fork(); |
283 | 284 |
284 if(pid == -1) { | 285 if(pid == -1) { |
285 gaim_debug_error("srv","Could not create process!\n"); | 286 gaim_debug_error("srv","Could not create process!\n"); |
286 cb(NULL, 0); | 287 cb(NULL, 0, extradata); |
287 g_free(query); | 288 g_free(query); |
288 return; | 289 return; |
289 } | 290 } |
290 /* Child */ | 291 /* Child */ |
291 if( pid == 0 ) { | 292 if( pid == 0 ) { |
300 if(write(in[1], query, strlen(query)+1)<0) { | 301 if(write(in[1], query, strlen(query)+1)<0) { |
301 gaim_debug_error("srv", "Could not write to SRV resolver\n"); | 302 gaim_debug_error("srv", "Could not write to SRV resolver\n"); |
302 } | 303 } |
303 rdata = g_new0(struct resdata,1); | 304 rdata = g_new0(struct resdata,1); |
304 rdata->cb = cb; | 305 rdata->cb = cb; |
306 rdata->extradata = extradata; | |
305 rdata->handle = gaim_input_add(out[0], GAIM_INPUT_READ, resolved, rdata); | 307 rdata->handle = gaim_input_add(out[0], GAIM_INPUT_READ, resolved, rdata); |
306 | 308 |
307 g_free(query); | 309 g_free(query); |
308 #else | 310 #else |
309 GError* err = NULL; | 311 GError* err = NULL; |
326 | 328 |
327 | 329 |
328 if (!MyDnsQuery_UTF || !MyDnsRecordListFree) { | 330 if (!MyDnsQuery_UTF || !MyDnsRecordListFree) { |
329 gaim_debug_error("srv", "System missing DNS API (Requires W2K+)\n"); | 331 gaim_debug_error("srv", "System missing DNS API (Requires W2K+)\n"); |
330 g_free(query); | 332 g_free(query); |
331 cb(NULL, 0); | 333 cb(NULL, 0, extradata); |
332 return; | 334 return; |
333 } | 335 } |
334 | 336 |
335 rdata = g_new0(struct resdata, 1); | 337 rdata = g_new0(struct resdata, 1); |
336 rdata->DnsQuery = MyDnsQuery_UTF; | 338 rdata->DnsQuery = MyDnsQuery_UTF; |