src/dnssrv.c

Fri, 18 Nov 2005 16:37:51 +0000

author
Kevin Stange <kstange@pidgin.im>
date
Fri, 18 Nov 2005 16:37:51 +0000
changeset 12136
027b7ebee256
parent 11898
a40601f1aed2
child 12439
50f1e8799480
permissions
-rw-r--r--

[gaim-migrate @ 14436]
SF Patch #1356575 from Kevin Stange (SimGuy)

"This patch moves buddy pounces out of the menu and into
a new dialog, as suggested by Sean. I'm not ready to
say this is finished, but it's a solid starting point
and it does work.

I changed the namespacing a little from gaim_gtkpounce
to gaim_gtk_pounce to be consistent with the rest of Gaim.

I wanted to try to get more information into the pounce
manager, but I wasn't sure how to display it. I
thought perhaps a column containing a row of icons
representing which events are being watched (so the
user can see which of several pounces for the same
buddy are which), however, while I know how to do this,
there aren't icons in Gaim suitable for representing
all the events. Like "returned from away" and
"idle/unidle", as far as I can see. I'm not sure what
else could be shown to make the manager dialog more
"informative."

The dialog updates automatically to show pounces only
for connected accounts and updates when a pounce is
added, changed, or removed in some other way than the
dialog.

I'd like to get feedback on it if anyone has anything
they think I should change or fix, I'll do that and
update this patch. Otherwise, feel free to commit. :)"

As ridingpigs commented in the tracker, this is "far better than the current menu thing."

I made a few small changes to this. I believe most of them were related to adding hooks to disable things if there were no accounts connected. I also sorte
d the Tools menu a bit and updated the docklet to match.

I wish the plugin action code could sort the items it added.

committer: Richard Laager <rlaager@pidgin.im>

11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
1 /**
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
2 * @file dnssrv.c
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
3 *
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
4 * gaim
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
5 *
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
6 * Copyright (C) 2005 Thomas Butter <butter@uni-mannheim.de>
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
7 *
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
11 * (at your option) any later version.
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
12 *
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
16 * GNU General Public License for more details.
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
17 *
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
21 */
11898
a40601f1aed2 [gaim-migrate @ 14189]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11630
diff changeset
22
a40601f1aed2 [gaim-migrate @ 14189]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11630
diff changeset
23 #include "internal.h"
a40601f1aed2 [gaim-migrate @ 14189]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11630
diff changeset
24
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
25 #ifndef _WIN32
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
26 #include <resolv.h>
11630
a6eaa6f5cbd2 [gaim-migrate @ 13905]
Mark Doliner <markdoliner@pidgin.im>
parents: 11444
diff changeset
27 #include <arpa/nameser.h>
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
28 #include <arpa/nameser_compat.h>
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
29 #ifndef T_SRV
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
30 #define T_SRV 33
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
31 #endif
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
32 #else
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
33 #include <windns.h>
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
34 /* Missing from the mingw headers */
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
35 #ifndef DNS_TYPE_SRV
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
36 # define DNS_TYPE_SRV 33
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
37 #endif
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
38 #endif
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
39
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
40 #include "dnssrv.h"
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
41 #include "eventloop.h"
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
42 #include "debug.h"
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
43
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
44 #ifndef _WIN32
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
45 typedef union {
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
46 HEADER hdr;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
47 u_char buf[1024];
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
48 } queryans;
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
49 #else
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
50 static DNS_STATUS (*MyDnsQuery_UTF8) (
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
51 PCSTR lpstrName, WORD wType, DWORD fOptions,
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
52 PIP4_ARRAY aipServers, PDNS_RECORD* ppQueryResultsSet,
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
53 PVOID* pReserved) = NULL;
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
54 static void (*MyDnsRecordListFree) (PDNS_RECORD pRecordList,
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
55 DNS_FREE_TYPE FreeType) = NULL;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
56 #endif
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
57
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
58 struct resdata {
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
59 SRVCallback cb;
11382
4458ab177b10 [gaim-migrate @ 13609]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11381
diff changeset
60 gpointer extradata;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
61 #ifndef _WIN32
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
62 guint handle;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
63 #else
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
64 char *query;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
65 char *errmsg;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
66 GSList *results;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
67 #endif
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
68 };
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
69
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
70 static gint responsecompare(gconstpointer ar, gconstpointer br) {
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
71 struct srv_response *a = (struct srv_response*)ar;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
72 struct srv_response *b = (struct srv_response*)br;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
73
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
74 if(a->pref == b->pref) {
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
75 if(a->weight == b->weight)
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
76 return 0;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
77 if(a->weight < b->weight)
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
78 return -1;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
79 return 1;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
80 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
81 if(a->pref < b->pref)
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
82 return -1;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
83 return 1;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
84 }
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
85 #ifndef _WIN32
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
86 static void resolve(int in, int out) {
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
87 GList *ret = NULL;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
88 struct srv_response *srvres;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
89 queryans answer;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
90 int size;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
91 int qdcount;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
92 int ancount;
11381
d3d53604fe0f [gaim-migrate @ 13608]
Mark Doliner <markdoliner@pidgin.im>
parents: 11379
diff changeset
93 guchar *end;
d3d53604fe0f [gaim-migrate @ 13608]
Mark Doliner <markdoliner@pidgin.im>
parents: 11379
diff changeset
94 guchar *cp;
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
95 gchar name[256];
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
96 int type, dlen, pref, weight, port;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
97 gchar query[256];
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
98
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
99 if(read(in, query, 256) <= 0) {
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
100 _exit(0);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
101 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
102 size = res_query( query, C_IN, T_SRV, (u_char*)&answer, sizeof( answer));
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
103
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
104 qdcount = ntohs(answer.hdr.qdcount);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
105 ancount = ntohs(answer.hdr.ancount);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
106
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
107
11381
d3d53604fe0f [gaim-migrate @ 13608]
Mark Doliner <markdoliner@pidgin.im>
parents: 11379
diff changeset
108 cp = (guchar*)&answer + sizeof(HEADER);
d3d53604fe0f [gaim-migrate @ 13608]
Mark Doliner <markdoliner@pidgin.im>
parents: 11379
diff changeset
109 end = (guchar*)&answer + size;
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
110
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
111 /* skip over unwanted stuff */
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
112 while (qdcount-- > 0 && cp < end) {
11381
d3d53604fe0f [gaim-migrate @ 13608]
Mark Doliner <markdoliner@pidgin.im>
parents: 11379
diff changeset
113 size = dn_expand( (unsigned char*)&answer, end, cp, name, 256);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
114 if(size < 0) goto end;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
115 cp += size + QFIXEDSZ;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
116 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
117
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
118 while (ancount-- > 0 && cp < end) {
11381
d3d53604fe0f [gaim-migrate @ 13608]
Mark Doliner <markdoliner@pidgin.im>
parents: 11379
diff changeset
119 size = dn_expand((unsigned char*)&answer, end, cp, name, 256);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
120 if(size < 0)
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
121 goto end;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
122
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
123 cp += size;
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
124
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
125 NS_GET16(type,cp);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
126 cp += 6; /* skip ttl and class since we already know it */
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
127
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
128 NS_GET16(dlen,cp);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
129
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
130 if (type == T_SRV) {
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
131 NS_GET16(pref,cp);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
132
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
133 NS_GET16(weight, cp);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
134
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
135 NS_GET16(port, cp);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
136
11381
d3d53604fe0f [gaim-migrate @ 13608]
Mark Doliner <markdoliner@pidgin.im>
parents: 11379
diff changeset
137 size = dn_expand( (unsigned char*)&answer, end, cp, name, 256);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
138 if(size < 0 )
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
139 goto end;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
140
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
141 cp += size;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
142
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
143 srvres = g_new0(struct srv_response,1);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
144 strcpy(srvres->hostname, name);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
145 srvres->pref = pref;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
146 srvres->port = port;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
147 srvres->weight = weight;
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
148
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
149 ret = g_list_insert_sorted(ret, srvres, responsecompare);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
150 } else {
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
151 cp += dlen;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
152 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
153 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
154 end: size = g_list_length(ret);
11430
a532570de9d6 [gaim-migrate @ 13667]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11426
diff changeset
155 write(out, &size, sizeof(int));
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
156 while(g_list_first(ret)) {
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
157 write(out, g_list_first(ret)->data, sizeof(struct srv_response));
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
158 g_free(g_list_first(ret)->data);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
159 ret = g_list_remove(ret, g_list_first(ret)->data);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
160 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
161
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
162 /* Should the resolver be reused?
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
163 * There is most likely only 1 SRV queries per prpl...
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
164 */
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
165 _exit(0);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
166 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
167
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
168 static void resolved(gpointer data, gint source, GaimInputCondition cond) {
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
169 int size;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
170 struct resdata *rdata = (struct resdata*)data;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
171 struct srv_response *res;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
172 struct srv_response *tmp;
11426
46f761f5c7ad [gaim-migrate @ 13663]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11395
diff changeset
173 int i;
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
174 SRVCallback cb = rdata->cb;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
175
11430
a532570de9d6 [gaim-migrate @ 13667]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11426
diff changeset
176 read(source, &size, sizeof(int));
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
177 gaim_debug_info("srv","found %d SRV entries\n", size);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
178 tmp = res = g_malloc0(sizeof(struct srv_response)*size);
11426
46f761f5c7ad [gaim-migrate @ 13663]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11395
diff changeset
179 i = size;
46f761f5c7ad [gaim-migrate @ 13663]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11395
diff changeset
180 while(i) {
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
181 read(source, tmp++, sizeof(struct srv_response));
11426
46f761f5c7ad [gaim-migrate @ 13663]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11395
diff changeset
182 i--;
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
183 }
11382
4458ab177b10 [gaim-migrate @ 13609]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11381
diff changeset
184 cb(res, size, rdata->extradata);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
185 gaim_input_remove(rdata->handle);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
186 g_free(rdata);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
187 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
188
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
189 #else /* _WIN32 */
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
190
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
191 /** The Jabber Server code was inspiration for parts of this. */
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
192
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
193 static gboolean res_main_thread_cb(gpointer data) {
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
194 struct srv_response *srvres = NULL;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
195 int size = 0;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
196 struct resdata *rdata = data;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
197
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
198 if (rdata->errmsg != NULL) {
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
199 gaim_debug_error("srv", rdata->errmsg);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
200 g_free(rdata->errmsg);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
201 } else {
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
202 struct srv_response *srvres_tmp;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
203 GSList *lst = rdata->results;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
204
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
205 size = g_slist_length(rdata->results);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
206
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
207 srvres_tmp = srvres = g_malloc0(sizeof(struct srv_response) * size);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
208 while (lst) {
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
209 memcpy(srvres_tmp++, lst->data, sizeof(struct srv_response));
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
210 g_free(lst->data);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
211 lst = g_slist_remove(lst, lst->data);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
212 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
213
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
214 rdata->results = lst;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
215 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
216
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
217 gaim_debug_info("srv", "found %d SRV entries\n", size);
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
218
11382
4458ab177b10 [gaim-migrate @ 13609]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11381
diff changeset
219 rdata->cb(srvres, size, rdata->extradata);
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
220
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
221 g_free(rdata->query);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
222 g_free(rdata);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
223
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
224 return FALSE;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
225 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
226
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
227 static gpointer res_thread(gpointer data) {
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
228 DNS_RECORD *dr = NULL;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
229 GSList *lst = NULL;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
230 struct srv_response *srvres;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
231 DNS_SRV_DATA *srv_data;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
232 int type = DNS_TYPE_SRV;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
233 DNS_STATUS ds;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
234 struct resdata *rdata = data;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
235
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
236 ds = MyDnsQuery_UTF8(rdata->query, type, DNS_QUERY_STANDARD, NULL, &dr, NULL);
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
237 if (ds != ERROR_SUCCESS) {
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
238 rdata->errmsg = g_strdup_printf("Couldn't look up SRV record. Error = %d\n", (int) ds);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
239 } else {
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
240 DNS_RECORD *dr_tmp = dr;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
241 while (dr_tmp != NULL) {
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
242 /* Discard any incorrect entries. I'm not sure if this is necessary */
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
243 if (dr_tmp->wType != type || strcmp(dr_tmp->pName, rdata->query) != 0) {
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
244 dr_tmp = dr_tmp->pNext;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
245 continue;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
246 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
247
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
248 srv_data = &dr_tmp->Data.SRV;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
249 srvres = g_new0(struct srv_response, 1);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
250 strncpy(srvres->hostname, srv_data->pNameTarget, 255);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
251 srvres->hostname[255] = '\0';
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
252 srvres->pref = srv_data->wPriority;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
253 srvres->port = srv_data->wPort;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
254 srvres->weight = srv_data->wWeight;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
255
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
256 lst = g_slist_insert_sorted(lst, srvres, responsecompare);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
257
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
258 dr_tmp = dr_tmp->pNext;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
259 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
260
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
261 MyDnsRecordListFree(dr, DnsFreeRecordList);
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
262 rdata->results = lst;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
263 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
264
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
265 /* back to main thread */
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
266 g_idle_add(res_main_thread_cb, rdata);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
267
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
268 return 0;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
269 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
270
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
271 #endif
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
272
11444
78ac61f1faeb [gaim-migrate @ 13683]
Richard Laager <rlaager@pidgin.im>
parents: 11430
diff changeset
273 void gaim_srv_resolve(const char *protocol, const char *transport, const char *domain, SRVCallback cb, gpointer extradata) {
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
274 char *query = g_strdup_printf("_%s._%s.%s",protocol, transport, domain);
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
275 struct resdata *rdata;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
276 #ifndef _WIN32
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
277 int in[2], out[2];
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
278 int pid;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
279 gaim_debug_info("srv","querying SRV record for %s\n", query);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
280 if(pipe(in) || pipe(out)) {
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
281 gaim_debug_error("srv", "Could not create pipe\n");
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
282 g_free(query);
11382
4458ab177b10 [gaim-migrate @ 13609]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11381
diff changeset
283 cb(NULL, 0, extradata);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
284 return;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
285 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
286
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
287 pid = fork();
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
288
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
289 if(pid == -1) {
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
290 gaim_debug_error("srv","Could not create process!\n");
11382
4458ab177b10 [gaim-migrate @ 13609]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11381
diff changeset
291 cb(NULL, 0, extradata);
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
292 g_free(query);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
293 return;
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
294 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
295 /* Child */
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
296 if( pid == 0 ) {
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
297 close(out[0]);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
298 close(in[1]);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
299 resolve(in[0], out[1]);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
300 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
301
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
302 close(out[1]);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
303 close(in[0]);
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
304
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
305 if(write(in[1], query, strlen(query)+1)<0) {
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
306 gaim_debug_error("srv", "Could not write to SRV resolver\n");
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
307 }
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
308 rdata = g_new0(struct resdata,1);
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
309 rdata->cb = cb;
11382
4458ab177b10 [gaim-migrate @ 13609]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11381
diff changeset
310 rdata->extradata = extradata;
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
311 rdata->handle = gaim_input_add(out[0], GAIM_INPUT_READ, resolved, rdata);
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
312
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
313 g_free(query);
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
314 #else
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
315 GError* err = NULL;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
316
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
317 static gboolean initialized = FALSE;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
318
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
319 gaim_debug_info("srv","querying SRV record for %s\n", query);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
320
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
321 if (!initialized) {
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
322 MyDnsQuery_UTF8 = (void*) wgaim_find_and_loadproc("dnsapi.dll", "DnsQuery_UTF8");
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
323 MyDnsRecordListFree = (void*) wgaim_find_and_loadproc(
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
324 "dnsapi.dll", "DnsRecordListFree");
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
325 initialized = TRUE;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
326 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
327
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
328 if (!MyDnsQuery_UTF8 || !MyDnsRecordListFree) {
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
329 gaim_debug_error("srv", "System missing DNS API (Requires W2K+)\n");
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
330 g_free(query);
11382
4458ab177b10 [gaim-migrate @ 13609]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11381
diff changeset
331 cb(NULL, 0, extradata);
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
332 return;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
333 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
334
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
335 rdata = g_new0(struct resdata, 1);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
336 rdata->cb = cb;
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
337 rdata->query = query;
11395
1b19bd77adf6 [gaim-migrate @ 13626]
Daniel Atallah <datallah@pidgin.im>
parents: 11382
diff changeset
338 rdata->extradata = extradata;
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
339
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
340 if (!g_thread_create(res_thread, rdata, FALSE, &err)) {
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
341 rdata->errmsg = g_strdup_printf("SRV thread create failure: %s\n", err ? err->message : "");
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
342 g_error_free(err);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
343 res_main_thread_cb(rdata);
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
344 }
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
345 #endif
11373
80fd6df6fbe0 [gaim-migrate @ 13598]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
346 }
11379
a5a66b0e8b6e [gaim-migrate @ 13605]
Daniel Atallah <datallah@pidgin.im>
parents: 11373
diff changeset
347

mercurial