libpurple/upnp.c

Tue, 04 Aug 2009 04:03:41 +0000

author
Paul Aurich <darkrain42@pidgin.im>
date
Tue, 04 Aug 2009 04:03:41 +0000
changeset 28090
e14f8adfbb99
parent 27497
2dc5a0e0c4c2
child 29810
8cb17c0c8fe5
permissions
-rw-r--r--

merge of '5cc8bb002fd80dded75fbe9e34ae56a95033d295'
and 'afcf938f83caa730df0ff19a8bb92f14f88c9d0e'

11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1 /**
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
2 * @file upnp.c UPnP Implementation
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
3 * @ingroup core
20330
650a7af9c238 remove gpl boilerplate from doxygen docs
Sean Egan <seanegan@pidgin.im>
parents: 19859
diff changeset
4 */
650a7af9c238 remove gpl boilerplate from doxygen docs
Sean Egan <seanegan@pidgin.im>
parents: 19859
diff changeset
5
650a7af9c238 remove gpl boilerplate from doxygen docs
Sean Egan <seanegan@pidgin.im>
parents: 19859
diff changeset
6 /* purple
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
7 *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
8 * Purple is the legal property of its developers, whose names are too numerous
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
9 * to list here. Please refer to the COPYRIGHT file distributed with this
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
10 * source distribution.
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
11 *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
12 * This program is free software; you can redistribute it and/or modify
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
13 * it under the terms of the GNU General Public License as published by
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
14 * the Free Software Foundation; either version 2 of the License, or
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
15 * (at your option) any later version.
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
16 *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
17 * This program is distributed in the hope that it will be useful,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
20 * GNU General Public License for more details.
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
21 *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
22 * You should have received a copy of the GNU General Public License
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
23 * along with this program; if not, write to the Free Software
19859
71d37b57eff2 The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents: 16035
diff changeset
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
25 */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
26 #include "internal.h"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
27
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
28 #include "upnp.h"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
29
16035
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
30 #include "debug.h"
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
31 #include "eventloop.h"
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
32 #include "network.h"
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
33 #include "proxy.h"
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
34 #include "signals.h"
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
35 #include "util.h"
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
36 #include "xmlnode.h"
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
37
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
38 /***************************************************************
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
39 ** General Defines *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
40 ****************************************************************/
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
41 #define HTTP_OK "200 OK"
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
42 #define DEFAULT_HTTP_PORT 80
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
43 #define DISCOVERY_TIMEOUT 1000
24011
0cff24bf7dba Add temporary purple_util_fetch_url_request_len and purple_util_fetch_url_len
Daniel Atallah <datallah@pidgin.im>
parents: 22104
diff changeset
44 /* limit UPnP-triggered http downloads to 128k */
0cff24bf7dba Add temporary purple_util_fetch_url_request_len and purple_util_fetch_url_len
Daniel Atallah <datallah@pidgin.im>
parents: 22104
diff changeset
45 #define MAX_UPNP_DOWNLOAD (128 * 1024)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
46
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
47 /***************************************************************
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
48 ** Discovery/Description Defines *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
49 ****************************************************************/
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
50 #define NUM_UDP_ATTEMPTS 2
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
51
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
52 /* Address and port of an SSDP request used for discovery */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
53 #define HTTPMU_HOST_ADDRESS "239.255.255.250"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
54 #define HTTPMU_HOST_PORT 1900
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
55
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
56 #define SEARCH_REQUEST_DEVICE "urn:schemas-upnp-org:service:%s"
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
57
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
58 #define SEARCH_REQUEST_STRING \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
59 "M-SEARCH * HTTP/1.1\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
60 "MX: 2\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
61 "HOST: 239.255.255.250:1900\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
62 "MAN: \"ssdp:discover\"\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
63 "ST: urn:schemas-upnp-org:service:%s\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
64 "\r\n"
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
65
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
66 #define WAN_IP_CONN_SERVICE "WANIPConnection:1"
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
67 #define WAN_PPP_CONN_SERVICE "WANPPPConnection:1"
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
68
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
69 /******************************************************************
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
70 ** Action Defines *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
71 *******************************************************************/
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
72 #define HTTP_HEADER_ACTION \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
73 "POST /%s HTTP/1.1\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
74 "HOST: %s:%d\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
75 "SOAPACTION: \"urn:schemas-upnp-org:service:%s#%s\"\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
76 "CONTENT-TYPE: text/xml ; charset=\"utf-8\"\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
77 "CONTENT-LENGTH: %" G_GSIZE_FORMAT "\r\n\r\n"
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
78
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
79 #define SOAP_ACTION \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
80 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
81 "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" " \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
82 "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
83 "<s:Body>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
84 "<u:%s xmlns:u=\"urn:schemas-upnp-org:service:%s\">\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
85 "%s" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
86 "</u:%s>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
87 "</s:Body>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
88 "</s:Envelope>"
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
89
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
90 #define PORT_MAPPING_LEASE_TIME "0"
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
91 #define PORT_MAPPING_DESCRIPTION "PURPLE_UPNP_PORT_FORWARD"
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
92
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
93 #define ADD_PORT_MAPPING_PARAMS \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
94 "<NewRemoteHost></NewRemoteHost>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
95 "<NewExternalPort>%i</NewExternalPort>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
96 "<NewProtocol>%s</NewProtocol>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
97 "<NewInternalPort>%i</NewInternalPort>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
98 "<NewInternalClient>%s</NewInternalClient>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
99 "<NewEnabled>1</NewEnabled>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
100 "<NewPortMappingDescription>" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
101 PORT_MAPPING_DESCRIPTION \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
102 "</NewPortMappingDescription>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
103 "<NewLeaseDuration>" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
104 PORT_MAPPING_LEASE_TIME \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
105 "</NewLeaseDuration>\r\n"
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
106
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
107 #define DELETE_PORT_MAPPING_PARAMS \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
108 "<NewRemoteHost></NewRemoteHost>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
109 "<NewExternalPort>%i</NewExternalPort>\r\n" \
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
110 "<NewProtocol>%s</NewProtocol>\r\n"
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
111
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
112 typedef enum {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
113 PURPLE_UPNP_STATUS_UNDISCOVERED = -1,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
114 PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
115 PURPLE_UPNP_STATUS_DISCOVERING,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
116 PURPLE_UPNP_STATUS_DISCOVERED
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
117 } PurpleUPnPStatus;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
118
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
119 typedef struct {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
120 PurpleUPnPStatus status;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
121 gchar* control_url;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
122 gchar service_type[20];
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
123 char publicip[16];
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
124 char internalip[16];
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
125 time_t lookup_time;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
126 } PurpleUPnPControlInfo;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
127
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
128 typedef struct {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
129 guint inpa; /* purple_input_add handle */
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
130 guint tima; /* purple_timeout_add handle */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
131 int fd;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
132 struct sockaddr_in server;
27000
668af87393da Use matching buffer lengths to avoid confusion.
Daniel Atallah <datallah@pidgin.im>
parents: 25911
diff changeset
133 gchar service_type[20];
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
134 int retry_count;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
135 gchar *full_url;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
136 } UPnPDiscoveryData;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
137
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
138 struct _UPnPMappingAddRemove
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
139 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
140 unsigned short portmap;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
141 gchar protocol[4];
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
142 gboolean add;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
143 PurpleUPnPCallback cb;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
144 gpointer cb_data;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
145 guint tima; /* purple_timeout_add handle */
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
146 PurpleUtilFetchUrlData *gfud;
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
147 };
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
148
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
149 static PurpleUPnPControlInfo control_info = {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
150 PURPLE_UPNP_STATUS_UNDISCOVERED,
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
151 NULL, "\0", "\0", "\0", 0};
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
152
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
153 static GSList *discovery_callbacks = NULL;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
154
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
155 static void purple_upnp_discover_send_broadcast(UPnPDiscoveryData *dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
156 static void lookup_public_ip(void);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
157 static void lookup_internal_ip(void);
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
158
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
159 static void
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
160 fire_discovery_callbacks(gboolean success)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
161 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
162 while(discovery_callbacks) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
163 gpointer data;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
164 PurpleUPnPCallback cb = discovery_callbacks->data;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
165 discovery_callbacks = g_slist_remove(discovery_callbacks, cb);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
166 data = discovery_callbacks->data;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
167 discovery_callbacks = g_slist_remove(discovery_callbacks, data);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
168 cb(success, data);
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
169 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
170 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
171
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
172 static gboolean
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
173 purple_upnp_compare_device(const xmlnode* device, const gchar* deviceType)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
174 {
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
175 xmlnode* deviceTypeNode = xmlnode_get_child(device, "deviceType");
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
176 char *tmp;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
177 gboolean ret;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
178
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
179 if(deviceTypeNode == NULL) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
180 return FALSE;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
181 }
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
182
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
183 tmp = xmlnode_get_data(deviceTypeNode);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
184 ret = !g_ascii_strcasecmp(tmp, deviceType);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
185 g_free(tmp);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
186
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
187 return ret;
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
188 }
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
189
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
190 static gboolean
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
191 purple_upnp_compare_service(const xmlnode* service, const gchar* serviceType)
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
192 {
13793
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
193 xmlnode* serviceTypeNode;
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
194 char *tmp;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
195 gboolean ret;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
196
13793
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
197 if(service == NULL) {
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
198 return FALSE;
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
199 }
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
200
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
201 serviceTypeNode = xmlnode_get_child(service, "serviceType");
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
202
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
203 if(serviceTypeNode == NULL) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
204 return FALSE;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
205 }
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
206
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
207 tmp = xmlnode_get_data(serviceTypeNode);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
208 ret = !g_ascii_strcasecmp(tmp, serviceType);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
209 g_free(tmp);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
210
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
211 return ret;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
212 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
213
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
214 static gchar*
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
215 purple_upnp_parse_description_response(const gchar* httpResponse, gsize len,
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
216 const gchar* httpURL, const gchar* serviceType)
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
217 {
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
218 gchar *xmlRoot, *baseURL, *controlURL, *service;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
219 xmlnode *xmlRootNode, *serviceTypeNode, *controlURLNode, *baseURLNode;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
220 char *tmp;
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
221
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
222 /* make sure we have a valid http response */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
223 if(g_strstr_len(httpResponse, len, HTTP_OK) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
224 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
225 "parse_description_response(): Failed In HTTP_OK\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
226 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
227 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
228
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
229 /* find the root of the xml document */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
230 if((xmlRoot = g_strstr_len(httpResponse, len, "<root")) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
231 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
232 "parse_description_response(): Failed finding root\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
233 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
234 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
235
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
236 /* create the xml root node */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
237 if((xmlRootNode = xmlnode_from_str(xmlRoot,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
238 len - (xmlRoot - httpResponse))) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
239 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
240 "parse_description_response(): Could not parse xml root node\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
241 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
242 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
243
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
244 /* get the baseURL of the device */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
245 if((baseURLNode = xmlnode_get_child(xmlRootNode, "URLBase")) != NULL) {
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
246 baseURL = xmlnode_get_data(baseURLNode);
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
247 } else {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
248 baseURL = g_strdup(httpURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
249 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
250
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
251 /* get the serviceType child that has the service type as its data */
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
252
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
253 /* get urn:schemas-upnp-org:device:InternetGatewayDevice:1 and its devicelist */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
254 serviceTypeNode = xmlnode_get_child(xmlRootNode, "device");
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
255 while(!purple_upnp_compare_device(serviceTypeNode,
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
256 "urn:schemas-upnp-org:device:InternetGatewayDevice:1") &&
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
257 serviceTypeNode != NULL) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
258 serviceTypeNode = xmlnode_get_next_twin(serviceTypeNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
259 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
260 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
261 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
262 "parse_description_response(): could not get serviceTypeNode 1\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
263 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
264 xmlnode_free(xmlRootNode);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
265 return NULL;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
266 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
267 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "deviceList");
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
268 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
269 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
270 "parse_description_response(): could not get serviceTypeNode 2\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
271 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
272 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
273 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
274 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
275
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
276 /* get urn:schemas-upnp-org:device:WANDevice:1 and its devicelist */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
277 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "device");
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
278 while(!purple_upnp_compare_device(serviceTypeNode,
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
279 "urn:schemas-upnp-org:device:WANDevice:1") &&
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
280 serviceTypeNode != NULL) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
281 serviceTypeNode = xmlnode_get_next_twin(serviceTypeNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
282 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
283 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
284 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
285 "parse_description_response(): could not get serviceTypeNode 3\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
286 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
287 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
288 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
289 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
290 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "deviceList");
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
291 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
292 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
293 "parse_description_response(): could not get serviceTypeNode 4\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
294 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
295 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
296 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
297 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
298
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
299 /* get urn:schemas-upnp-org:device:WANConnectionDevice:1 and its servicelist */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
300 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "device");
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
301 while(serviceTypeNode && !purple_upnp_compare_device(serviceTypeNode,
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
302 "urn:schemas-upnp-org:device:WANConnectionDevice:1")) {
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
303 serviceTypeNode = xmlnode_get_next_twin(serviceTypeNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
304 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
305 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
306 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
307 "parse_description_response(): could not get serviceTypeNode 5\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
308 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
309 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
310 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
311 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
312 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "serviceList");
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
313 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
314 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
315 "parse_description_response(): could not get serviceTypeNode 6\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
316 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
317 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
318 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
319 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
320
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
321 /* get the serviceType variable passed to this function */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
322 service = g_strdup_printf(SEARCH_REQUEST_DEVICE, serviceType);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
323 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "service");
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
324 while(!purple_upnp_compare_service(serviceTypeNode, service) &&
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
325 serviceTypeNode != NULL) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
326 serviceTypeNode = xmlnode_get_next_twin(serviceTypeNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
327 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
328
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
329 g_free(service);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
330 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
331 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
332 "parse_description_response(): could not get serviceTypeNode 7\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
333 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
334 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
335 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
336 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
337
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
338 /* get the controlURL of the service */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
339 if((controlURLNode = xmlnode_get_child(serviceTypeNode,
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
340 "controlURL")) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
341 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
342 "parse_description_response(): Could not find controlURL\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
343 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
344 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
345 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
346 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
347
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
348 tmp = xmlnode_get_data(controlURLNode);
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
349 if(baseURL && !purple_str_has_prefix(tmp, "http://") &&
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
350 !purple_str_has_prefix(tmp, "HTTP://")) {
15348
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
351 /* Handle absolute paths in a relative URL. This probably
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
352 * belongs in util.c. */
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
353 if (tmp[0] == '/') {
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
354 size_t length;
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
355 const char *path, *start = strstr(baseURL, "://");
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
356 start = start ? start + 3 : baseURL;
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
357 path = strchr(start, '/');
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
358 length = path ? path - baseURL : strlen(baseURL);
15683
9421e229cb97 Minor warning fix
Mark Doliner <markdoliner@pidgin.im>
parents: 15502
diff changeset
359 controlURL = g_strdup_printf("%.*s%s", (int)length, baseURL, tmp);
15348
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
360 } else {
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
361 controlURL = g_strdup_printf("%s%s", baseURL, tmp);
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
362 }
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
363 g_free(tmp);
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
364 }else{
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
365 controlURL = tmp;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
366 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
367 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
368 xmlnode_free(xmlRootNode);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
369
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
370 return controlURL;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
371 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
372
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
373 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
374 upnp_parse_description_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data,
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
375 const gchar *httpResponse, gsize len, const gchar *error_message)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
376 {
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
377 UPnPDiscoveryData *dd = user_data;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
378 gchar *control_url = NULL;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
379
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
380 if (len > 0)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
381 control_url = purple_upnp_parse_description_response(
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
382 httpResponse, len, dd->full_url, dd->service_type);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
383
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
384 g_free(dd->full_url);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
385
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
386 if(control_url == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
387 purple_debug_error("upnp",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
388 "purple_upnp_parse_description(): control URL is NULL\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
389 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
390
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
391 control_info.status = control_url ? PURPLE_UPNP_STATUS_DISCOVERED
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
392 : PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
393 control_info.lookup_time = time(NULL);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
394 control_info.control_url = control_url;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
395 strncpy(control_info.service_type, dd->service_type,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
396 sizeof(control_info.service_type));
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
397
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
398 fire_discovery_callbacks(control_url != NULL);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
399
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
400 /* Look up the public and internal IPs */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
401 if(control_url != NULL) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
402 lookup_public_ip();
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
403 lookup_internal_ip();
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
404 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
405
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
406 g_free(dd);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
407 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
408
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
409 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
410 purple_upnp_parse_description(const gchar* descriptionURL, UPnPDiscoveryData *dd)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
411 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
412 gchar* httpRequest;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
413 gchar* descriptionXMLAddress;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
414 gchar* descriptionAddress;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
415 int port = 0;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
416
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
417 /* parse the 4 above variables out of the descriptionURL
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
418 example description URL: http://192.168.1.1:5678/rootDesc.xml */
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
419
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
420 /* parse the url into address, port, path variables */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
421 if(!purple_url_parse(descriptionURL, &descriptionAddress,
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
422 &port, &descriptionXMLAddress, NULL, NULL)) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
423 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
424 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
425 if(port == 0 || port == -1) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
426 port = DEFAULT_HTTP_PORT;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
427 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
428
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
429 /* for example...
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
430 GET /rootDesc.xml HTTP/1.1\r\nHost: 192.168.1.1:5678\r\n\r\n */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
431 httpRequest = g_strdup_printf(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
432 "GET /%s HTTP/1.1\r\n"
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
433 "Connection: close\r\n"
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
434 "Host: %s:%d\r\n\r\n",
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
435 descriptionXMLAddress, descriptionAddress, port);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
436
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
437 g_free(descriptionXMLAddress);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
438
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
439 dd->full_url = g_strdup_printf("http://%s:%d",
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
440 descriptionAddress, port);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13097
diff changeset
441 g_free(descriptionAddress);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
442
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
443 /* Remove the timeout because everything it is waiting for has
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
444 * successfully completed */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
445 purple_timeout_remove(dd->tima);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
446 dd->tima = 0;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
447
24011
0cff24bf7dba Add temporary purple_util_fetch_url_request_len and purple_util_fetch_url_len
Daniel Atallah <datallah@pidgin.im>
parents: 22104
diff changeset
448 purple_util_fetch_url_request_len(descriptionURL, TRUE, NULL, TRUE, httpRequest,
0cff24bf7dba Add temporary purple_util_fetch_url_request_len and purple_util_fetch_url_len
Daniel Atallah <datallah@pidgin.im>
parents: 22104
diff changeset
449 TRUE, MAX_UPNP_DOWNLOAD, upnp_parse_description_cb, dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
450
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
451 g_free(httpRequest);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
452
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
453 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
454
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
455 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
456 purple_upnp_parse_discover_response(const gchar* buf, unsigned int buf_len,
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
457 UPnPDiscoveryData *dd)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
458 {
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
459 gchar* startDescURL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
460 gchar* endDescURL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
461 gchar* descURL;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
462
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
463 if(g_strstr_len(buf, buf_len, HTTP_OK) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
464 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
465 "parse_discover_response(): Failed In HTTP_OK\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
466 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
467 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
468
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
469 if((startDescURL = g_strstr_len(buf, buf_len, "http://")) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
470 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
471 "parse_discover_response(): Failed In finding http://\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
472 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
473 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
474
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
475 endDescURL = g_strstr_len(startDescURL, buf_len - (startDescURL - buf),
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
476 "\r");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
477 if(endDescURL == NULL) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
478 endDescURL = g_strstr_len(startDescURL,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
479 buf_len - (startDescURL - buf), "\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
480 if(endDescURL == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
481 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
482 "parse_discover_response(): Failed In endDescURL\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
483 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
484 }
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
485 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
486
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
487 /* XXX: I'm not sure how this could ever happen */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
488 if(endDescURL == startDescURL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
489 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
490 "parse_discover_response(): endDescURL == startDescURL\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
491 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
492 }
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
493
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
494 descURL = g_strndup(startDescURL, endDescURL - startDescURL);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
495
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
496 purple_upnp_parse_description(descURL, dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
497
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
498 g_free(descURL);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
499
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
500 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
501
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
502 static gboolean
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
503 purple_upnp_discover_timeout(gpointer data)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
504 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
505 UPnPDiscoveryData* dd = data;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
506
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
507 if (dd->inpa)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
508 purple_input_remove(dd->inpa);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
509 dd->inpa = 0;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
510 dd->tima = 0;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
511
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
512 if (dd->retry_count < NUM_UDP_ATTEMPTS) {
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
513 /* TODO: We probably shouldn't be incrementing retry_count in two places */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
514 dd->retry_count++;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
515 purple_upnp_discover_send_broadcast(dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
516 } else {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
517 if (dd->fd)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
518 close(dd->fd);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
519
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
520 control_info.status = PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
521 control_info.lookup_time = time(NULL);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
522 control_info.service_type[0] = '\0';
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
523 g_free(control_info.control_url);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
524 control_info.control_url = NULL;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
525
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
526 fire_discovery_callbacks(FALSE);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
527
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
528 g_free(dd);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
529 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
530
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
531 return FALSE;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
532 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
533
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
534 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
535 purple_upnp_discover_udp_read(gpointer data, gint sock, PurpleInputCondition cond)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
536 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
537 int len;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
538 UPnPDiscoveryData *dd = data;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
539 gchar buf[65536];
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
540
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
541 do {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
542 len = recv(dd->fd, buf,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
543 sizeof(buf) - 1, 0);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
544
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
545 if(len > 0) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
546 buf[len] = '\0';
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
547 break;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
548 } else if(errno != EINTR) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
549 /* We'll either get called again, or time out */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
550 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
551 }
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
552 } while (errno == EINTR);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
553
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
554 purple_input_remove(dd->inpa);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
555 dd->inpa = 0;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
556
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
557 close(dd->fd);
20044
2b66cf7c7266 grab revision 24d76e86b06c5b1ab5f0a3ea37bd69ced034e0d0 (Reset file descriptors to -1 instead of 0 to fix some weird unexpected crashes in finch
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
558 dd->fd = -1;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
559
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
560 /* parse the response, and see if it was a success */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
561 purple_upnp_parse_discover_response(buf, len, dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
562
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
563 /* We'll either time out or continue successfully */
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
564 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
565
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
566 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
567 purple_upnp_discover_send_broadcast(UPnPDiscoveryData *dd)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
568 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
569 gchar *sendMessage = NULL;
25571
4cb4b6a61da6 Fix a null ptr deref/double free. Fixes #8336.
Daniel Atallah <datallah@pidgin.im>
parents: 24672
diff changeset
570 size_t totalSize;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
571 gboolean sentSuccess;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
572
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
573 /* because we are sending over UDP, if there is a failure
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
574 we should retry the send NUM_UDP_ATTEMPTS times. Also,
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
575 try different requests for WANIPConnection and WANPPPConnection*/
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
576 for(; dd->retry_count < NUM_UDP_ATTEMPTS; dd->retry_count++) {
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13097
diff changeset
577 sentSuccess = FALSE;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
578
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
579 if((dd->retry_count % 2) == 0) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
580 strncpy(dd->service_type, WAN_IP_CONN_SERVICE, sizeof(dd->service_type));
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
581 } else {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
582 strncpy(dd->service_type, WAN_PPP_CONN_SERVICE, sizeof(dd->service_type));
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
583 }
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
584
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
585 sendMessage = g_strdup_printf(SEARCH_REQUEST_STRING, dd->service_type);
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
586
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
587 totalSize = strlen(sendMessage);
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
588
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
589 do {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
590 if(sendto(dd->fd, sendMessage, totalSize, 0,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
591 (struct sockaddr*) &(dd->server),
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
592 sizeof(struct sockaddr_in)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
593 ) == totalSize) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
594 sentSuccess = TRUE;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
595 break;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
596 }
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13097
diff changeset
597 } while (errno == EINTR || errno == EAGAIN);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
598
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
599 g_free(sendMessage);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
600
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
601 if(sentSuccess) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
602 dd->tima = purple_timeout_add(DISCOVERY_TIMEOUT,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
603 purple_upnp_discover_timeout, dd);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
604 dd->inpa = purple_input_add(dd->fd, PURPLE_INPUT_READ,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
605 purple_upnp_discover_udp_read, dd);
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
606
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
607 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
608 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
609 }
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
610
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
611 /* We have already done all our retries. Make sure that the callback
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
612 * doesn't get called before the original function returns */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
613 purple_timeout_add(10, purple_upnp_discover_timeout, dd);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
614 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
615
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
616 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
617 purple_upnp_discover(PurpleUPnPCallback cb, gpointer cb_data)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
618 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
619 /* Socket Setup Variables */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
620 int sock;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
621 struct hostent* hp;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
622
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
623 /* UDP RECEIVE VARIABLES */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
624 UPnPDiscoveryData *dd;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
625
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
626 if (control_info.status == PURPLE_UPNP_STATUS_DISCOVERING) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
627 if (cb) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
628 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
629 discovery_callbacks, cb);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
630 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
631 discovery_callbacks, cb_data);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
632 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
633 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
634 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
635
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
636 dd = g_new0(UPnPDiscoveryData, 1);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
637 if (cb) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
638 discovery_callbacks = g_slist_append(discovery_callbacks, cb);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
639 discovery_callbacks = g_slist_append(discovery_callbacks,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
640 cb_data);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
641 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
642
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
643 /* Set up the sockets */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
644 sock = socket(AF_INET, SOCK_DGRAM, 0);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
645 if(sock == -1) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
646 purple_debug_error("upnp",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
647 "purple_upnp_discover(): Failed In sock creation\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
648 /* Short circuit the retry attempts */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
649 dd->retry_count = NUM_UDP_ATTEMPTS;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
650 purple_timeout_add(10, purple_upnp_discover_timeout, dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
651 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
652 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
653
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
654 dd->fd = sock;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
655
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
656 /* TODO: Non-blocking! */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
657 if((hp = gethostbyname(HTTPMU_HOST_ADDRESS)) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
658 purple_debug_error("upnp",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
659 "purple_upnp_discover(): Failed In gethostbyname\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
660 /* Short circuit the retry attempts */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
661 dd->retry_count = NUM_UDP_ATTEMPTS;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
662 purple_timeout_add(10, purple_upnp_discover_timeout, dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
663 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
664 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
665
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
666 memset(&(dd->server), 0, sizeof(struct sockaddr));
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
667 dd->server.sin_family = AF_INET;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
668 memcpy(&(dd->server.sin_addr), hp->h_addr_list[0], hp->h_length);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
669 dd->server.sin_port = htons(HTTPMU_HOST_PORT);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
670
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
671 control_info.status = PURPLE_UPNP_STATUS_DISCOVERING;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
672
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
673 purple_upnp_discover_send_broadcast(dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
674 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
675
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
676 static PurpleUtilFetchUrlData*
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
677 purple_upnp_generate_action_message_and_send(const gchar* actionName,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
678 const gchar* actionParams, PurpleUtilFetchUrlCallback cb,
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
679 gpointer cb_data)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
680 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
681 PurpleUtilFetchUrlData* gfud;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
682 gchar* soapMessage;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
683 gchar* totalSendMessage;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
684 gchar* pathOfControl;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
685 gchar* addressOfControl;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
686 int port = 0;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
687
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
688 /* parse the url into address, port, path variables */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
689 if(!purple_url_parse(control_info.control_url, &addressOfControl,
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
690 &port, &pathOfControl, NULL, NULL)) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
691 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
692 "generate_action_message_and_send(): Failed In Parse URL\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
693 /* XXX: This should probably be async */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
694 if(cb)
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
695 cb(NULL, cb_data, NULL, 0, NULL);
25571
4cb4b6a61da6 Fix a null ptr deref/double free. Fixes #8336.
Daniel Atallah <datallah@pidgin.im>
parents: 24672
diff changeset
696 return NULL;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
697 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
698 if(port == 0 || port == -1) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
699 port = DEFAULT_HTTP_PORT;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
700 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
701
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
702 /* set the soap message */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
703 soapMessage = g_strdup_printf(SOAP_ACTION, actionName,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
704 control_info.service_type, actionParams, actionName);
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
705
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
706 /* set the HTTP Header, and append the body to it */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
707 totalSendMessage = g_strdup_printf(HTTP_HEADER_ACTION "%s",
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
708 pathOfControl, addressOfControl, port,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
709 control_info.service_type, actionName,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
710 strlen(soapMessage), soapMessage);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
711 g_free(pathOfControl);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
712 g_free(soapMessage);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
713
24011
0cff24bf7dba Add temporary purple_util_fetch_url_request_len and purple_util_fetch_url_len
Daniel Atallah <datallah@pidgin.im>
parents: 22104
diff changeset
714 gfud = purple_util_fetch_url_request_len(control_info.control_url, FALSE, NULL, TRUE,
25571
4cb4b6a61da6 Fix a null ptr deref/double free. Fixes #8336.
Daniel Atallah <datallah@pidgin.im>
parents: 24672
diff changeset
715 totalSendMessage, TRUE, MAX_UPNP_DOWNLOAD, cb, cb_data);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
716
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
717 g_free(totalSendMessage);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
718 g_free(addressOfControl);
25571
4cb4b6a61da6 Fix a null ptr deref/double free. Fixes #8336.
Daniel Atallah <datallah@pidgin.im>
parents: 24672
diff changeset
719
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
720 return gfud;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
721 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
722
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
723 const gchar *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
724 purple_upnp_get_public_ip()
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
725 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
726 if (control_info.status == PURPLE_UPNP_STATUS_DISCOVERED
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
727 && control_info.publicip
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
728 && strlen(control_info.publicip) > 0)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
729 return control_info.publicip;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
730
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
731 /* Trigger another UPnP discovery if 5 minutes have elapsed since the
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
732 * last one, and it wasn't successful */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
733 if (control_info.status < PURPLE_UPNP_STATUS_DISCOVERING
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
734 && (time(NULL) - control_info.lookup_time) > 300)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
735 purple_upnp_discover(NULL, NULL);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
736
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
737 return NULL;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
738 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
739
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
740 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
741 looked_up_public_ip_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data,
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
742 const gchar *httpResponse, gsize len, const gchar *error_message)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
743 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
744 gchar* temp, *temp2;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
745
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
746 if ((error_message != NULL) || (httpResponse == NULL))
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
747 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
748
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
749 /* extract the ip, or see if there is an error */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
750 if((temp = g_strstr_len(httpResponse, len,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
751 "<NewExternalIPAddress")) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
752 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
753 "looked_up_public_ip_cb(): Failed Finding <NewExternalIPAddress\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
754 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
755 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
756 if(!(temp = g_strstr_len(temp, len - (temp - httpResponse), ">"))) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
757 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
758 "looked_up_public_ip_cb(): Failed In Finding >\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
759 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
760 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
761 if(!(temp2 = g_strstr_len(temp, len - (temp - httpResponse), "<"))) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
762 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
763 "looked_up_public_ip_cb(): Failed In Finding <\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
764 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
765 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
766 *temp2 = '\0';
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
767
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
768 strncpy(control_info.publicip, temp + 1,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
769 sizeof(control_info.publicip));
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
770
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
771 purple_debug_info("upnp", "NAT Returned IP: %s\n", control_info.publicip);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
772 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
773
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
774 static void
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
775 lookup_public_ip()
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
776 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
777 purple_upnp_generate_action_message_and_send("GetExternalIPAddress", "",
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
778 looked_up_public_ip_cb, NULL);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
779 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
780
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
781 /* TODO: This could be exported */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
782 static const gchar *
22104
56970903b8e9 Probe for -Wstrict-prototypes to get some more warnings. I then cleaned up
Richard Laager <rlaager@pidgin.im>
parents: 20636
diff changeset
783 purple_upnp_get_internal_ip(void)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
784 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
785 if (control_info.status == PURPLE_UPNP_STATUS_DISCOVERED
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
786 && control_info.internalip
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
787 && strlen(control_info.internalip) > 0)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
788 return control_info.internalip;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
789
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
790 /* Trigger another UPnP discovery if 5 minutes have elapsed since the
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
791 * last one, and it wasn't successful */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
792 if (control_info.status < PURPLE_UPNP_STATUS_DISCOVERING
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
793 && (time(NULL) - control_info.lookup_time) > 300)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
794 purple_upnp_discover(NULL, NULL);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
795
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
796 return NULL;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
797 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
798
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
799 static void
14183
bdde840e984c [gaim-migrate @ 16755]
Mark Doliner <markdoliner@pidgin.im>
parents: 14170
diff changeset
800 looked_up_internal_ip_cb(gpointer data, gint source, const gchar *error_message)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
801 {
14151
34427f138b1f [gaim-migrate @ 16712]
Mark Doliner <markdoliner@pidgin.im>
parents: 13793
diff changeset
802 if (source) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
803 strncpy(control_info.internalip,
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
804 purple_network_get_local_system_ip(source),
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
805 sizeof(control_info.internalip));
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
806 purple_debug_info("upnp", "Local IP: %s\n",
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
807 control_info.internalip);
14151
34427f138b1f [gaim-migrate @ 16712]
Mark Doliner <markdoliner@pidgin.im>
parents: 13793
diff changeset
808 close(source);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
809 } else
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 27000
diff changeset
810 purple_debug_error("upnp", "Unable to look up local IP\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
811
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
812 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
813
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
814 static void
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
815 lookup_internal_ip()
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
816 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
817 gchar* addressOfControl;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
818 int port = 0;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
819
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
820 if(!purple_url_parse(control_info.control_url, &addressOfControl, &port,
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
821 NULL, NULL, NULL)) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
822 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
823 "lookup_internal_ip(): Failed In Parse URL\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
824 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
825 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
826 if(port == 0 || port == -1) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
827 port = DEFAULT_HTTP_PORT;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
828 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
829
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
830 if(purple_proxy_connect(NULL, NULL, addressOfControl, port,
14170
f611621bc8a0 [gaim-migrate @ 16742]
Mark Doliner <markdoliner@pidgin.im>
parents: 14151
diff changeset
831 looked_up_internal_ip_cb, NULL) == NULL)
14151
34427f138b1f [gaim-migrate @ 16712]
Mark Doliner <markdoliner@pidgin.im>
parents: 13793
diff changeset
832 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
833 purple_debug_error("upnp", "Get Local IP Connect Failed: Address: %s @@@ Port %d\n",
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
834 addressOfControl, port);
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
835 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
836
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
837 g_free(addressOfControl);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
838 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
839
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
840 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
841 done_port_mapping_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data,
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
842 const gchar *httpResponse, gsize len, const gchar *error_message)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
843 {
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
844 UPnPMappingAddRemove *ar = user_data;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
845
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
846 gboolean success = TRUE;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
847
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
848 /* determine if port mapping was a success */
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
849 if ((error_message != NULL) || (httpResponse == NULL) ||
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
850 (g_strstr_len(httpResponse, len, HTTP_OK) == NULL))
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
851 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
852 purple_debug_error("upnp",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
853 "purple_upnp_set_port_mapping(): Failed HTTP_OK\n%s\n",
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
854 httpResponse ? httpResponse : "(null)");
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
855 success = FALSE;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
856 } else
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
857 purple_debug_info("upnp", "Successfully completed port mapping operation\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
858
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
859 if (ar->cb)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
860 ar->cb(success, ar->cb_data);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
861 g_free(ar);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
862 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
863
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
864 static void
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
865 do_port_mapping_cb(gboolean has_control_mapping, gpointer data)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
866 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
867 UPnPMappingAddRemove *ar = data;
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
868
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
869 if (has_control_mapping) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
870 gchar action_name[25];
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
871 gchar *action_params;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
872 if(ar->add) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
873 const gchar *internal_ip;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
874 /* get the internal IP */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
875 if(!(internal_ip = purple_upnp_get_internal_ip())) {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
876 purple_debug_error("upnp",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
877 "purple_upnp_set_port_mapping(): couldn't get local ip\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
878 /* UGLY */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
879 if (ar->cb)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
880 ar->cb(FALSE, ar->cb_data);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
881 g_free(ar);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
882 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
883 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
884 strncpy(action_name, "AddPortMapping",
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
885 sizeof(action_name));
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
886 action_params = g_strdup_printf(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
887 ADD_PORT_MAPPING_PARAMS,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
888 ar->portmap, ar->protocol, ar->portmap,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
889 internal_ip);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
890 } else {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
891 strncpy(action_name, "DeletePortMapping", sizeof(action_name));
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
892 action_params = g_strdup_printf(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
893 DELETE_PORT_MAPPING_PARAMS,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
894 ar->portmap, ar->protocol);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
895 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
896
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
897 ar->gfud = purple_upnp_generate_action_message_and_send(action_name,
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
898 action_params, done_port_mapping_cb, ar);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
899
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
900 g_free(action_params);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
901 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
902 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
903
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
904
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
905 if (ar->cb)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
906 ar->cb(FALSE, ar->cb_data);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
907 g_free(ar);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
908 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
910 static gboolean
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
911 fire_port_mapping_failure_cb(gpointer data)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
912 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
913 do_port_mapping_cb(FALSE, data);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
914 return FALSE;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
915 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
916
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
917 void purple_upnp_cancel_port_mapping(UPnPMappingAddRemove *ar)
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
918 {
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
919 GSList *l;
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
920
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
921 /* Remove ar from discovery_callbacks if present; it was inserted after a cb.
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
922 * The same cb may be in the list multple times, so be careful to remove the one assocaited with ar. */
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
923 l = discovery_callbacks;
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
924 while (l)
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
925 {
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
926 if (l->next && (l->next->data == ar)) {
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
927 discovery_callbacks = g_slist_delete_link(discovery_callbacks, l->next);
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
928 discovery_callbacks = g_slist_delete_link(discovery_callbacks, l);
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
929 }
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
930
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
931 l = l->next;
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
932 }
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
933
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
934 if (ar->tima > 0)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
935 purple_timeout_remove(ar->tima);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
936
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
937 if (ar->gfud)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
938 purple_util_fetch_url_cancel(ar->gfud);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
939
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
940 g_free(ar);
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
941 }
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
942
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
943 UPnPMappingAddRemove *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
944 purple_upnp_set_port_mapping(unsigned short portmap, const gchar* protocol,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
945 PurpleUPnPCallback cb, gpointer cb_data)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
946 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
947 UPnPMappingAddRemove *ar;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
948
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
949 ar = g_new0(UPnPMappingAddRemove, 1);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
950 ar->cb = cb;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
951 ar->cb_data = cb_data;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
952 ar->add = TRUE;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
953 ar->portmap = portmap;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
954 strncpy(ar->protocol, protocol, sizeof(ar->protocol));
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
955
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
956 /* If we're waiting for a discovery, add to the callbacks list */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
957 if(control_info.status == PURPLE_UPNP_STATUS_DISCOVERING) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
958 /* TODO: This will fail because when this cb is triggered,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
959 * the internal IP lookup won't be complete */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
960 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
961 discovery_callbacks, do_port_mapping_cb);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
962 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
963 discovery_callbacks, ar);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
964 return ar;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
965 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
966
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
967 /* If we haven't had a successful UPnP discovery, check if 5 minutes has
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
968 * elapsed since the last try, try again */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
969 if(control_info.status == PURPLE_UPNP_STATUS_UNDISCOVERED ||
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
970 (control_info.status == PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
971 && (time(NULL) - control_info.lookup_time) > 300)) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
972 purple_upnp_discover(do_port_mapping_cb, ar);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
973 return ar;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
974 } else if(control_info.status == PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
975 if (cb) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
976 /* Asynchronously trigger a failed response */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
977 ar->tima = purple_timeout_add(10, fire_port_mapping_failure_cb, ar);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
978 } else {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
979 /* No need to do anything if nobody expects a response*/
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
980 g_free(ar);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
981 ar = NULL;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
982 }
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
983 return ar;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
984 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
985
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
986 do_port_mapping_cb(TRUE, ar);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
987 return ar;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
988 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
989
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
990 UPnPMappingAddRemove *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
991 purple_upnp_remove_port_mapping(unsigned short portmap, const char* protocol,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
992 PurpleUPnPCallback cb, gpointer cb_data)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
993 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
994 UPnPMappingAddRemove *ar;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
995
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
996 ar = g_new0(UPnPMappingAddRemove, 1);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
997 ar->cb = cb;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
998 ar->cb_data = cb_data;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
999 ar->add = FALSE;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1000 ar->portmap = portmap;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1001 strncpy(ar->protocol, protocol, sizeof(ar->protocol));
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
1002
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1003 /* If we're waiting for a discovery, add to the callbacks list */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1004 if(control_info.status == PURPLE_UPNP_STATUS_DISCOVERING) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1005 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1006 discovery_callbacks, do_port_mapping_cb);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1007 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1008 discovery_callbacks, ar);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
1009 return ar;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1010 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1011
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1012 /* If we haven't had a successful UPnP discovery, check if 5 minutes has
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1013 * elapsed since the last try, try again */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1014 if(control_info.status == PURPLE_UPNP_STATUS_UNDISCOVERED ||
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1015 (control_info.status == PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1016 && (time(NULL) - control_info.lookup_time) > 300)) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1017 purple_upnp_discover(do_port_mapping_cb, ar);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
1018 return ar;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1019 } else if(control_info.status == PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1020 if (cb) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1021 /* Asynchronously trigger a failed response */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1022 ar->tima = purple_timeout_add(10, fire_port_mapping_failure_cb, ar);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1023 } else {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1024 /* No need to do anything if nobody expects a response*/
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1025 g_free(ar);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
1026 ar = NULL;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1027 }
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
1028 return ar;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1029 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1030
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1031 do_port_mapping_cb(TRUE, ar);
15502
250802f80d94 Fix a crash when a network_listen_range process is canceled before its UPnP port mapping completes, which occurs regularly on certain routers when file transfers are initiated and then quickly finished. Much thanks to Elliott Harris and Eric Richie for their hard work with me hunting this down and fixing it.
Evan Schoenberg <evands@pidgin.im>
parents: 15435
diff changeset
1032 return ar;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1033 }
16035
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1034
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1035 static void
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1036 purple_upnp_network_config_changed_cb(void *data)
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1037 {
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1038 /* Reset the control_info to default values */
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1039 control_info.status = PURPLE_UPNP_STATUS_UNDISCOVERED;
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1040 g_free(control_info.control_url);
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1041 control_info.control_url = NULL;
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1042 control_info.service_type[0] = '\0';
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1043 control_info.publicip[0] = '\0';
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1044 control_info.internalip[0] = '\0';
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1045 control_info.lookup_time = 0;
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1046 }
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1047
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1048 static void*
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1049 purple_upnp_get_handle(void)
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1050 {
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1051 static int handle;
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 24672
diff changeset
1052
24011
0cff24bf7dba Add temporary purple_util_fetch_url_request_len and purple_util_fetch_url_len
Daniel Atallah <datallah@pidgin.im>
parents: 22104
diff changeset
1053 return &handle;
16035
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1054 }
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1055
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1056 void
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1057 purple_upnp_init()
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1058 {
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1059 purple_signal_connect(purple_network_get_handle(), "network-configuration-changed",
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1060 purple_upnp_get_handle(), PURPLE_CALLBACK(purple_upnp_network_config_changed_cb),
24011
0cff24bf7dba Add temporary purple_util_fetch_url_request_len and purple_util_fetch_url_len
Daniel Atallah <datallah@pidgin.im>
parents: 22104
diff changeset
1061 NULL);
16035
eb4eda79a147 The network module now registers the signal 'network-configuration-changed' and emits it when a network change is detected via libnm or the win32 network monitor. The UI could also emit this signal if it knows something network.c doesn't. UPnP and NAT-PMP respond to the signal by clearing their IP address caches; changing networks without quitting/relaunching will now lead to the new IP address being (lazily) determined. This commit also enables nat-pmp and adds nat-pmp.[h|c] to the build process; please let me know if there are any problems building, as I only have OS X test machines.
Evan Schoenberg <evands@pidgin.im>
parents: 15884
diff changeset
1062 }

mercurial