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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
1 /**
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
2 * @file dnssrv.c
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
3 *
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
4 * gaim
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
5 *
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
6 * Copyright (C) 2005 Thomas Butter <butter@uni-mannheim.de>
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
7 *
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
11 * (at your option) any later version.
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
12 *
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
16 * GNU General Public License for more details.
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
17 *
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
21 */
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
22 #include <glib.h>
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
23 #ifndef _WIN32
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
24 #include <resolv.h>
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
25 #include <stdlib.h>
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
26 #include <arpa/nameser_compat.h>
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
27 #ifndef T_SRV
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
28 #define T_SRV 33
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
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
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
38
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
39 #include "dnssrv.h"
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
40 #include <stdio.h>
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
41 #include <unistd.h>
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
42 #include <string.h>
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
43 #include "eventloop.h"
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
44 #include "debug.h"
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
45
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
46 #ifndef _WIN32
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
47 typedef union {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
48 HEADER hdr;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
49 u_char buf[1024];
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
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
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
59
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
60 struct resdata {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
61 SRVCallback cb;
11382
bdeace860555 [gaim-migrate @ 13609]
Thomas Butter <tbutter>
parents: 11381
diff changeset
62 gpointer extradata;
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
63 #ifndef _WIN32
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
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
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
70 };
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
71
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
72 static gint responsecompare(gconstpointer ar, gconstpointer br) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
73 struct srv_response *a = (struct srv_response*)ar;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
74 struct srv_response *b = (struct srv_response*)br;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
75
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
76 if(a->pref == b->pref) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
77 if(a->weight == b->weight)
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
78 return 0;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
79 if(a->weight < b->weight)
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
80 return -1;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
81 return 1;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
82 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
83 if(a->pref < b->pref)
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
84 return -1;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
85 return 1;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
86 }
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
87 #ifndef _WIN32
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
88 static void resolve(int in, int out) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
89 GList *ret = NULL;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
90 struct srv_response *srvres;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
91 queryans answer;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
92 int size;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
93 int qdcount;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
94 int ancount;
11381
e0f42900de12 [gaim-migrate @ 13608]
Mark Doliner <mark@kingant.net>
parents: 11379
diff changeset
95 guchar *end;
e0f42900de12 [gaim-migrate @ 13608]
Mark Doliner <mark@kingant.net>
parents: 11379
diff changeset
96 guchar *cp;
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
97 gchar name[256];
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
98 int type, dlen, pref, weight, port;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
99 gchar query[256];
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
100
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
101 if(read(in, query, 256) <= 0) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
102 _exit(0);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
103 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
104 size = res_query( query, C_IN, T_SRV, (u_char*)&answer, sizeof( answer));
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
105
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
106 qdcount = ntohs(answer.hdr.qdcount);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
107 ancount = ntohs(answer.hdr.ancount);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
108
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
109
11381
e0f42900de12 [gaim-migrate @ 13608]
Mark Doliner <mark@kingant.net>
parents: 11379
diff changeset
110 cp = (guchar*)&answer + sizeof(HEADER);
e0f42900de12 [gaim-migrate @ 13608]
Mark Doliner <mark@kingant.net>
parents: 11379
diff changeset
111 end = (guchar*)&answer + size;
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
112
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
113 /* skip over unwanted stuff */
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
114 while (qdcount-- > 0 && cp < end) {
11381
e0f42900de12 [gaim-migrate @ 13608]
Mark Doliner <mark@kingant.net>
parents: 11379
diff changeset
115 size = dn_expand( (unsigned char*)&answer, end, cp, name, 256);
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
116 if(size < 0) goto end;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
117 cp += size + QFIXEDSZ;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
118 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
119
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
120 while (ancount-- > 0 && cp < end) {
11381
e0f42900de12 [gaim-migrate @ 13608]
Mark Doliner <mark@kingant.net>
parents: 11379
diff changeset
121 size = dn_expand((unsigned char*)&answer, end, cp, name, 256);
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
122 if(size < 0)
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
123 goto end;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
124
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
125 cp += size;
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
126
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
127 NS_GET16(type,cp);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
128 cp += 6; /* skip ttl and class since we already know it */
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
129
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
130 NS_GET16(dlen,cp);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
131
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
132 if (type == T_SRV) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
133 NS_GET16(pref,cp);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
134
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
135 NS_GET16(weight, cp);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
136
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
137 NS_GET16(port, cp);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
138
11381
e0f42900de12 [gaim-migrate @ 13608]
Mark Doliner <mark@kingant.net>
parents: 11379
diff changeset
139 size = dn_expand( (unsigned char*)&answer, end, cp, name, 256);
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
140 if(size < 0 )
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
141 goto end;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
142
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
143 cp += size;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
144
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
145 srvres = g_new0(struct srv_response,1);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
146 strcpy(srvres->hostname, name);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
147 srvres->pref = pref;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
148 srvres->port = port;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
149 srvres->weight = weight;
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
150
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
151 ret = g_list_insert_sorted(ret, srvres, responsecompare);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
152 } else {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
153 cp += dlen;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
154 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
155 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
156 end: size = g_list_length(ret);
11430
4b7087777411 [gaim-migrate @ 13667]
Thomas Butter <tbutter>
parents: 11426
diff changeset
157 write(out, &size, sizeof(int));
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
158 while(g_list_first(ret)) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
159 write(out, g_list_first(ret)->data, sizeof(struct srv_response));
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
160 g_free(g_list_first(ret)->data);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
161 ret = g_list_remove(ret, g_list_first(ret)->data);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
162 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
163
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
164 /* Should the resolver be reused?
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
165 * There is most likely only 1 SRV queries per prpl...
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
166 */
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
167 _exit(0);
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
168 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
169
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
170 static void resolved(gpointer data, gint source, GaimInputCondition cond) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
171 int size;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
172 struct resdata *rdata = (struct resdata*)data;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
173 struct srv_response *res;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
174 struct srv_response *tmp;
11426
d678a37c16d9 [gaim-migrate @ 13663]
Thomas Butter <tbutter>
parents: 11395
diff changeset
175 int i;
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
176 SRVCallback cb = rdata->cb;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
177
11430
4b7087777411 [gaim-migrate @ 13667]
Thomas Butter <tbutter>
parents: 11426
diff changeset
178 read(source, &size, sizeof(int));
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
179 gaim_debug_info("srv","found %d SRV entries\n", size);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
180 tmp = res = g_malloc0(sizeof(struct srv_response)*size);
11426
d678a37c16d9 [gaim-migrate @ 13663]
Thomas Butter <tbutter>
parents: 11395
diff changeset
181 i = size;
d678a37c16d9 [gaim-migrate @ 13663]
Thomas Butter <tbutter>
parents: 11395
diff changeset
182 while(i) {
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
183 read(source, tmp++, sizeof(struct srv_response));
11426
d678a37c16d9 [gaim-migrate @ 13663]
Thomas Butter <tbutter>
parents: 11395
diff changeset
184 i--;
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
185 }
11382
bdeace860555 [gaim-migrate @ 13609]
Thomas Butter <tbutter>
parents: 11381
diff changeset
186 cb(res, size, rdata->extradata);
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
187 gaim_input_remove(rdata->handle);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
188 g_free(rdata);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
189 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
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
bdeace860555 [gaim-migrate @ 13609]
Thomas Butter <tbutter>
parents: 11381
diff changeset
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
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
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
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
279 int in[2], out[2];
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
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
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
282 if(pipe(in) || pipe(out)) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
283 gaim_debug_error("srv", "Could not create pipe\n");
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
284 g_free(query);
11382
bdeace860555 [gaim-migrate @ 13609]
Thomas Butter <tbutter>
parents: 11381
diff changeset
285 cb(NULL, 0, extradata);
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
286 return;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
287 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
288
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
289 pid = fork();
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
290
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
291 if(pid == -1) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
292 gaim_debug_error("srv","Could not create process!\n");
11382
bdeace860555 [gaim-migrate @ 13609]
Thomas Butter <tbutter>
parents: 11381
diff changeset
293 cb(NULL, 0, extradata);
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
294 g_free(query);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
295 return;
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
296 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
297 /* Child */
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
298 if( pid == 0 ) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
299 close(out[0]);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
300 close(in[1]);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
301 resolve(in[0], out[1]);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
302 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
303
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
304 close(out[1]);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
305 close(in[0]);
11395
f0e03a3ca3b5 [gaim-migrate @ 13626]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11382
diff changeset
306
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
307 if(write(in[1], query, strlen(query)+1)<0) {
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
308 gaim_debug_error("srv", "Could not write to SRV resolver\n");
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
309 }
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
310 rdata = g_new0(struct resdata,1);
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
311 rdata->cb = cb;
11382
bdeace860555 [gaim-migrate @ 13609]
Thomas Butter <tbutter>
parents: 11381
diff changeset
312 rdata->extradata = extradata;
11373
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
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
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
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
bdeace860555 [gaim-migrate @ 13609]
Thomas Butter <tbutter>
parents: 11381
diff changeset
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
c84c35ee8202 [gaim-migrate @ 13598]
Thomas Butter <tbutter>
parents:
diff changeset
348 }
11379
51c189755f1d [gaim-migrate @ 13605]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11373
diff changeset
349