src/stun.c

Fri, 06 Jan 2006 04:46:00 +0000

author
Casey Harkins <charkins@pidgin.im>
date
Fri, 06 Jan 2006 04:46:00 +0000
changeset 12744
45d72d69f399
parent 12700
18c264976a45
child 12756
b8df02e0c6e5
permissions
-rw-r--r--

[gaim-migrate @ 15091]
" Adds an emblem to a buddy if they have a queued message
(hidden conversation). In the large buddy list it is
added in the northwest corner, sliding the existing
northwest emblem (if specified) to the northeast
position and discarding the northeast emblem. In the
small buddy list, the emblem is added to the southeast.

Attached is a patch and an emblem image to be dropped
in pixmaps/status/default/. The emblem image is a
scaled down version of the send-im.png image." -- Casey Harkins

as I asked for this patch, and since there don't seem to be objections to
it (yet), I'm going ahead and applying it.

committer: Luke Schierer <lschiere@pidgin.im>

11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
1 /**
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
2 * @file stun.c STUN (RFC3489) Implementation
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
3 * @ingroup core
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
4 *
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
5 * gaim
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
6 *
11336
d2033b2756e2 [gaim-migrate @ 13549]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11300
diff changeset
7 * STUN implementation inspired by jstun [http://jstun.javawi.de/]
d2033b2756e2 [gaim-migrate @ 13549]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11300
diff changeset
8 *
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
9 * Gaim is the legal property of its developers, whose names are too numerous
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
10 * to list here. Please refer to the COPYRIGHT file distributed with this
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
11 * source distribution.
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
12 *
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
13 * This program is free software; you can redistribute it and/or modify
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
14 * it under the terms of the GNU General Public License as published by
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
15 * the Free Software Foundation; either version 2 of the License, or
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
16 * (at your option) any later version.
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
17 *
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
18 * This program is distributed in the hope that it will be useful,
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
21 * GNU General Public License for more details.
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
22 *
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
23 * You should have received a copy of the GNU General Public License
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
24 * along with this program; if not, write to the Free Software
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
26 *
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
27 */
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
28
11898
a40601f1aed2 [gaim-migrate @ 14189]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11677
diff changeset
29 #include "internal.h"
a40601f1aed2 [gaim-migrate @ 14189]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11677
diff changeset
30
11364
d754cf40ec4b [gaim-migrate @ 13588]
Daniel Atallah <datallah@pidgin.im>
parents: 11354
diff changeset
31 #ifndef _WIN32
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
32 #include <net/if.h>
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
33 #include <sys/ioctl.h>
11364
d754cf40ec4b [gaim-migrate @ 13588]
Daniel Atallah <datallah@pidgin.im>
parents: 11354
diff changeset
34 #endif
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
35
12700
18c264976a45 [gaim-migrate @ 15043]
<lildude@users.sourceforge.net>
parents: 12686
diff changeset
36 /* Solaris */
18c264976a45 [gaim-migrate @ 15043]
<lildude@users.sourceforge.net>
parents: 12686
diff changeset
37 #if defined (__SVR4) && defined (__sun)
18c264976a45 [gaim-migrate @ 15043]
<lildude@users.sourceforge.net>
parents: 12686
diff changeset
38 #include <sys/sockio.h>
18c264976a45 [gaim-migrate @ 15043]
<lildude@users.sourceforge.net>
parents: 12686
diff changeset
39 #endif
18c264976a45 [gaim-migrate @ 15043]
<lildude@users.sourceforge.net>
parents: 12686
diff changeset
40
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
41 #include "debug.h"
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
42 #include "account.h"
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
43 #include "dnssrv.h"
11429
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
44 #include "proxy.h"
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
45 #include "stun.h"
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
46 #include "prefs.h"
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
47
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
48 struct stun_header {
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
49 short type;
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
50 short len;
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
51 int transid[4];
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
52 };
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
53
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
54 struct stun_attrib {
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
55 short type;
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
56 short len;
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
57 };
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
58
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
59 struct stun_change {
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
60 struct stun_header hdr;
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
61 struct stun_attrib attrib;
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
62 char value[4];
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
63 };
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
64
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
65 static GaimStunNatDiscovery nattype = {-1, 0, "\0"};
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
66
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
67 static GSList *callbacks = 0;
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
68 static int fd = -1;
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
69 static gint incb = -1;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
70 static gint timeout = -1;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
71 static struct stun_header *packet;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
72 static int packetsize = 0;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
73 static int test = 0;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
74 static int retry = 0;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
75 static struct sockaddr_in addr;
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
76
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
77 static void do_callbacks() {
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
78 while(callbacks) {
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
79 StunCallback cb = callbacks->data;
11336
d2033b2756e2 [gaim-migrate @ 13549]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11300
diff changeset
80 if(cb)
d2033b2756e2 [gaim-migrate @ 13549]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11300
diff changeset
81 cb(&nattype);
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
82 callbacks = g_slist_remove(callbacks, cb);
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
83 }
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
84 }
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
85
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
86 static gboolean timeoutfunc(void *blah) {
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
87 if(retry > 2) {
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
88 if(test == 2)
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
89 nattype.type = GAIM_STUN_NAT_TYPE_SYMMETRIC;
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
90
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
91 /* remove input */
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
92 gaim_input_remove(incb);
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
93
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
94 /* set unknown */
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
95 nattype.status = GAIM_STUN_STATUS_UNKNOWN;
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
96
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
97 /* callbacks */
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
98 do_callbacks();
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
99
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
100 return FALSE;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
101 }
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
102 retry++;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
103 sendto(fd, packet, packetsize, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
104 return TRUE;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
105 }
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
106
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
107 #ifdef NOTYET
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
108 static void do_test2() {
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
109 struct stun_change data;
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
110 data.hdr.type = htons(0x0001);
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
111 data.hdr.len = 0;
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
112 data.hdr.transid[0] = rand();
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
113 data.hdr.transid[1] = ntohl(((int)'g' << 24) + ((int)'a' << 16) + ((int)'i' << 8) + (int)'m');
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
114 data.hdr.transid[2] = rand();
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
115 data.hdr.transid[3] = rand();
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
116 data.attrib.type = htons(0x003);
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
117 data.attrib.len = htons(4);
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
118 data.value[3] = 6;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
119 packet = (struct stun_header*)&data;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
120 packetsize = sizeof(struct stun_change);
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
121 retry = 0;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
122 test = 2;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
123 sendto(fd, packet, packetsize, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
124 timeout = gaim_timeout_add(500, (GSourceFunc)timeoutfunc, NULL);
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
125 }
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
126 #endif
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
127
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
128 static void reply_cb(gpointer data, gint source, GaimInputCondition cond) {
11336
d2033b2756e2 [gaim-migrate @ 13549]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11300
diff changeset
129 char buffer[1024];
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
130 char *tmp;
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
131 int len;
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
132 struct in_addr in;
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
133 struct stun_attrib *attrib;
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
134 struct stun_header *hdr;
11300
11bc6db394e6 [gaim-migrate @ 13500]
Richard Laager <rlaager@pidgin.im>
parents: 11229
diff changeset
135 struct ifconf ifc;
11bc6db394e6 [gaim-migrate @ 13500]
Richard Laager <rlaager@pidgin.im>
parents: 11229
diff changeset
136 struct ifreq *ifr;
11bc6db394e6 [gaim-migrate @ 13500]
Richard Laager <rlaager@pidgin.im>
parents: 11229
diff changeset
137 struct sockaddr_in *sinptr;
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
138
11336
d2033b2756e2 [gaim-migrate @ 13549]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11300
diff changeset
139 len = recv(source, buffer, 1024, 0);
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
140
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
141 hdr = (struct stun_header*)buffer;
11371
363713bfd3d1 [gaim-migrate @ 13596]
Richard Laager <rlaager@pidgin.im>
parents: 11364
diff changeset
142 if(hdr->transid[0]!=packet->transid[0] || hdr->transid[1]!=packet->transid[1] || hdr->transid[2]!=packet->transid[2] || hdr->transid[3]!=packet->transid[3]) { /* wrong transaction */
363713bfd3d1 [gaim-migrate @ 13596]
Richard Laager <rlaager@pidgin.im>
parents: 11364
diff changeset
143 gaim_debug_info("stun", "got wrong transid\n");
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
144 return;
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
145 }
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
146 if(test==1) {
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
147 tmp = buffer + sizeof(struct stun_header);
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
148 while(buffer+len > tmp) {
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
149
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
150 attrib = (struct stun_attrib*) tmp;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
151 if(attrib->type == htons(0x0001) && attrib->len == htons(8)) {
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
152 memcpy(&in.s_addr, tmp+sizeof(struct stun_attrib)+2+2, 4);
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
153 strcpy(nattype.publicip, inet_ntoa(in));
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
154 }
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
155 tmp += sizeof(struct stun_attrib) + attrib->len;
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
156 }
11371
363713bfd3d1 [gaim-migrate @ 13596]
Richard Laager <rlaager@pidgin.im>
parents: 11364
diff changeset
157 gaim_debug_info("stun", "got public ip %s\n", nattype.publicip);
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
158 nattype.status = GAIM_STUN_STATUS_DISCOVERED;
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
159 nattype.type = GAIM_STUN_NAT_TYPE_UNKNOWN_NAT;
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
160
11371
363713bfd3d1 [gaim-migrate @ 13596]
Richard Laager <rlaager@pidgin.im>
parents: 11364
diff changeset
161 /* is it a NAT? */
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
162
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
163 ifc.ifc_len = sizeof(buffer);
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
164 ifc.ifc_req = (struct ifreq *) buffer;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
165 ioctl(source, SIOCGIFCONF, &ifc);
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
166
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
167 tmp = buffer;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
168 while(tmp < buffer + ifc.ifc_len) {
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
169 ifr = (struct ifreq *) tmp;
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
170
11364
d754cf40ec4b [gaim-migrate @ 13588]
Daniel Atallah <datallah@pidgin.im>
parents: 11354
diff changeset
171 tmp += sizeof(struct ifreq);
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
172
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
173 if(ifr->ifr_addr.sa_family == AF_INET) {
11371
363713bfd3d1 [gaim-migrate @ 13596]
Richard Laager <rlaager@pidgin.im>
parents: 11364
diff changeset
174 /* we only care about ipv4 interfaces */
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
175 sinptr = (struct sockaddr_in *) &ifr->ifr_addr;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
176 if(sinptr->sin_addr.s_addr == in.s_addr) {
11371
363713bfd3d1 [gaim-migrate @ 13596]
Richard Laager <rlaager@pidgin.im>
parents: 11364
diff changeset
177 /* no NAT */
363713bfd3d1 [gaim-migrate @ 13596]
Richard Laager <rlaager@pidgin.im>
parents: 11364
diff changeset
178 gaim_debug_info("stun", "no nat");
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
179 nattype.type = GAIM_STUN_NAT_TYPE_PUBLIC_IP;
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
180 }
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
181 }
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
182 }
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
183 gaim_timeout_remove(timeout);
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
184
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
185 #ifdef NOTYET
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
186 do_test2();
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
187 #endif
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
188 return;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
189 } else if(test == 2) {
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
190 do_callbacks();
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
191 gaim_input_remove(incb);
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
192 gaim_timeout_remove(timeout);
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
193 nattype.type = GAIM_STUN_NAT_TYPE_FULL_CONE;
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
194 }
11336
d2033b2756e2 [gaim-migrate @ 13549]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11300
diff changeset
195 }
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
196
11429
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
197 static void hbn_cb(GSList *hosts, gpointer edata, const char *error_message) {
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
198 static struct stun_header data;
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
199 int ret;
11425
668f93d8c3a2 [gaim-migrate @ 13662]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11424
diff changeset
200
11429
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
201 if(!hosts) return;
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
202 if(!hosts->data) return;
11425
668f93d8c3a2 [gaim-migrate @ 13662]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11424
diff changeset
203
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
204 if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
205 nattype.status = GAIM_STUN_STATUS_UNKNOWN;
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
206 do_callbacks();
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
207 return;
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
208 }
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
209
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
210 addr.sin_family = AF_INET;
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
211 addr.sin_port = htons(12108);
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
212 addr.sin_addr.s_addr = INADDR_ANY;
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
213 while( ((ret = bind(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in))) < 0 ) && ntohs(addr.sin_port) < 12208) {
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
214 addr.sin_port = htons(ntohs(addr.sin_port)+1);
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
215 }
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
216 if( ret < 0 ) {
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
217 nattype.status = GAIM_STUN_STATUS_UNKNOWN;
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
218 do_callbacks();
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
219 return;
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
220 }
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
221 incb = gaim_input_add(fd, GAIM_INPUT_READ, reply_cb, NULL);
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
222
11429
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
223 ret = GPOINTER_TO_INT(hosts->data);
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
224 hosts = g_slist_remove(hosts, hosts->data);
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
225 memcpy(&addr, hosts->data, sizeof(struct sockaddr_in));
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
226 g_free(hosts->data);
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
227 hosts = g_slist_remove(hosts, hosts->data);
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
228 while(hosts) {
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
229 hosts = g_slist_remove(hosts, hosts->data);
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
230 g_free(hosts->data);
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
231 hosts = g_slist_remove(hosts, hosts->data);
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
232 }
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
233
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
234 data.type = htons(0x0001);
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
235 data.len = 0;
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
236 data.transid[0] = rand();
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
237 data.transid[1] = ntohl(((int)'g' << 24) + ((int)'a' << 16) + ((int)'i' << 8) + (int)'m');
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
238 data.transid[2] = rand();
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
239 data.transid[3] = rand();
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
240
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
241 if(sendto(fd, &data, sizeof(struct stun_header), 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < sizeof(struct stun_header)) {
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
242 nattype.status = GAIM_STUN_STATUS_UNKNOWN;
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
243 do_callbacks();
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
244 return;
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
245 }
11354
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
246 test = 1;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
247 packet = &data;
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
248 packetsize = sizeof(struct stun_header);
265f44ed44bc [gaim-migrate @ 13573]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11336
diff changeset
249 timeout = gaim_timeout_add(500, (GSourceFunc)timeoutfunc, NULL);
11429
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
250 }
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
251
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
252 static void do_test1(GaimSrvResponse *resp, int results, gpointer sdata) {
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
253 const char *servername = sdata;
11429
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
254 int port = 3478;
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
255
11429
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
256 if(results) {
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
257 servername = resp[0].hostname;
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
258 port = resp[0].port;
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
259 }
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
260 gaim_debug_info("stun", "got %d SRV responses, server: %s, port: %d\n", results, servername, port);
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
261
3f7f01e88e77 [gaim-migrate @ 13666]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11425
diff changeset
262 gaim_gethostbyname_async(servername, port, hbn_cb, NULL);
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
263 g_free(resp);
11225
e888c207b994 [gaim-migrate @ 13361]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
264 }
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
265
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
266 GaimStunNatDiscovery *gaim_stun_discover(StunCallback cb) {
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
267 const char *servername = gaim_prefs_get_string("/core/network/stun_server");
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
268
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
269 gaim_debug_info("stun", "using server %s\n", servername);
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
270
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
271 if(nattype.status == GAIM_STUN_STATUS_DISCOVERING) {
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
272 if(cb)
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
273 callbacks = g_slist_append(callbacks, cb);
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
274 return NULL;
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
275 }
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
276
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
277 if(nattype.status != GAIM_STUN_STATUS_UNDISCOVERED) {
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
278 if(cb)
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
279 cb(&nattype);
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
280 return &nattype;
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
281 }
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
282
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
283 if(!servername || (strlen(servername) < 2)) {
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
284 nattype.status = GAIM_STUN_STATUS_UNKNOWN;
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
285 if(cb)
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
286 cb(&nattype);
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
287 return &nattype;
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
288 }
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
289 callbacks = g_slist_append(callbacks, cb);
12686
ec3e7c4ff045 [gaim-migrate @ 15029]
Richard Laager <rlaager@pidgin.im>
parents: 11898
diff changeset
290 gaim_srv_resolve("stun", "udp", servername, do_test1,
11431
60971f504319 [gaim-migrate @ 13668]
Daniel Atallah <datallah@pidgin.im>
parents: 11429
diff changeset
291 (gpointer) servername);
11424
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
292 return &nattype;
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
293 }
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
294
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
295 void gaim_stun_init() {
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
296 gaim_prefs_add_string("/core/network/stun_server", "");
b0f8535daa74 [gaim-migrate @ 13661]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11371
diff changeset
297 }

mercurial