src/protocols/simple/srvresolve.c

Tue, 02 Aug 2005 20:24:51 +0000

author
Thomas Butter <tbutter@users.sourceforge.net>
date
Tue, 02 Aug 2005 20:24:51 +0000
changeset 11181
e872a55b9524
child 11189
5ac07336091e
permissions
-rw-r--r--

[gaim-migrate @ 13292]
first import sip/simple prpl files.
still buggy and deactivated by default.

11181
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
1 /**
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
2 * @file simple.c
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
3 *
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
4 * gaim
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
5 *
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
6 * Copyright (C) 2005 Thomas Butter <butter@uni-mannheim.de>
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
7 *
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
11 * (at your option) any later version.
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
12 *
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
16 * GNU General Public License for more details.
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
17 *
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
21 */
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
22
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
23 #include "srvresolve.h"
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
24
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
25 typedef union {
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
26 HEADER hdr;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
27 u_char buf[1024];
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
28 } queryans;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
29
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
30 struct getserver_return *getserver(const char *domain) {
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
31 static struct getserver_return ret;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
32 queryans answer;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
33 int size;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
34 int qdcount;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
35 int ancount;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
36 gchar *end;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
37 gchar *cp;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
38 gchar name[256];
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
39 gchar *bestname = NULL;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
40 int bestport = 5060;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
41 int bestpri=99999;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
42 int type, dlen, pref, weight, port;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
43 gchar *query = g_strdup_printf("_sip._tcp.%s",domain);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
44
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
45 gaim_debug_info("simple","searching for %s\r\n",domain);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
46
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
47 size = res_query( query, C_IN, T_SRV, (u_char*)&answer, sizeof( answer));
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
48
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
49 g_free(query);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
50
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
51 qdcount = ntohs(answer.hdr.qdcount);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
52 ancount = ntohs(answer.hdr.ancount);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
53
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
54 gaim_debug_info("simple","ancount %d\r\n",ancount);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
55
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
56 cp = (char*)&answer + sizeof(HEADER);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
57 end = (char*)&answer + size;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
58
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
59 // skip over unwanted stuff
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
60 while (qdcount-- > 0 && cp < end) {
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
61 size = dn_expand( (char*)&answer, end, cp, name, 256);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
62 if(size < 0) return NULL;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
63 cp += size + QFIXEDSZ;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
64 }
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
65
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
66 while (ancount-- > 0 && cp < end) {
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
67 size = dn_expand((char*)&answer, end, cp, name, 256);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
68 if(size < 0)
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
69 return NULL;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
70
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
71 cp += size;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
72
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
73 NS_GET16(type,cp);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
74 cp += 6; // skip ttl and class
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
75
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
76 NS_GET16(dlen,cp);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
77
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
78 if (type == T_SRV) {
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
79 NS_GET16(pref,cp);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
80
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
81 NS_GET16(weight, cp);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
82
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
83 NS_GET16(port, cp);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
84
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
85 size = dn_expand( (char*)&answer, end, cp, name, 256);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
86 if(size < 0 )
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
87 return NULL;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
88
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
89 cp += size;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
90
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
91 if(pref<bestpri) {
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
92 if( bestname) g_free(bestname);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
93 bestname = g_strdup(name);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
94 bestpri = pref;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
95 bestport = port;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
96 }
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
97 } else {
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
98 cp += dlen;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
99 }
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
100 }
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
101 if(bestpri < 99999) {
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
102 ret.name = bestname;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
103 ret.port = bestport;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
104 } else {
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
105 ret.name = g_strdup(domain);
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
106 ret.port = 5060;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
107 }
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
108 return &ret;
e872a55b9524 [gaim-migrate @ 13292]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
109 }

mercurial