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;