libpurple/upnp.c

Sun, 16 Oct 2011 03:03:39 +0000

author
Elliott Sales de Andrade <qulogic@pidgin.im>
date
Sun, 16 Oct 2011 03:03:39 +0000
changeset 32662
f6cf0e904b45
parent 32596
927575c2af4e
child 33424
9919d10ee405
permissions
-rw-r--r--

Remove free_memory argument from D-Bus list functions. It's already
always set to FALSE in the auto-generated code.

Fixes #1747.

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;
31273
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
145 gboolean success;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
146 guint tima; /* purple_timeout_add handle */
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
147 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
148 };
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
149
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
150 static PurpleUPnPControlInfo control_info = {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
151 PURPLE_UPNP_STATUS_UNDISCOVERED,
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
152 NULL, "\0", "\0", "\0", 0};
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
153
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
154 static GSList *discovery_callbacks = NULL;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
155
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
156 static void purple_upnp_discover_send_broadcast(UPnPDiscoveryData *dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
157 static void lookup_public_ip(void);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
158 static void lookup_internal_ip(void);
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
159
31273
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
160 static gboolean
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
161 fire_ar_cb_async_and_free(gpointer data)
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
162 {
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
163 UPnPMappingAddRemove *ar = data;
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
164 if (ar) {
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
165 if (ar->cb)
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
166 ar->cb(ar->success, ar->cb_data);
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
167 g_free(ar);
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
168 }
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
169
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
170 return FALSE;
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
171 }
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
172
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
173 static void
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
174 fire_discovery_callbacks(gboolean success)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
175 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
176 while(discovery_callbacks) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
177 gpointer data;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
178 PurpleUPnPCallback cb = discovery_callbacks->data;
31190
107e045ff742 I prefer this syntax. Plus, it's slightly faster... right?
Mark Doliner <markdoliner@pidgin.im>
parents: 30514
diff changeset
179 discovery_callbacks = g_slist_delete_link(discovery_callbacks, discovery_callbacks);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
180 data = discovery_callbacks->data;
31190
107e045ff742 I prefer this syntax. Plus, it's slightly faster... right?
Mark Doliner <markdoliner@pidgin.im>
parents: 30514
diff changeset
181 discovery_callbacks = g_slist_delete_link(discovery_callbacks, discovery_callbacks);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
182 cb(success, data);
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
183 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
184 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
185
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
186 static gboolean
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
187 purple_upnp_compare_device(const xmlnode* device, const gchar* deviceType)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
188 {
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
189 xmlnode* deviceTypeNode = xmlnode_get_child(device, "deviceType");
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
190 char *tmp;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
191 gboolean ret;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
192
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
193 if(deviceTypeNode == NULL) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
194 return FALSE;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
195 }
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
196
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
197 tmp = xmlnode_get_data(deviceTypeNode);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
198 ret = !g_ascii_strcasecmp(tmp, deviceType);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
199 g_free(tmp);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
200
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
201 return ret;
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
202 }
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
203
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
204 static gboolean
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
205 purple_upnp_compare_service(const xmlnode* service, const gchar* serviceType)
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
206 {
13793
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
207 xmlnode* serviceTypeNode;
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
208 char *tmp;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
209 gboolean ret;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
210
13793
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
211 if(service == NULL) {
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
212 return FALSE;
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
213 }
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
214
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
215 serviceTypeNode = xmlnode_get_child(service, "serviceType");
f5562178d141 [gaim-migrate @ 16203]
Nathan Walp <nwalp@pidgin.im>
parents: 13622
diff changeset
216
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
217 if(serviceTypeNode == NULL) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
218 return FALSE;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
219 }
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
220
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
221 tmp = xmlnode_get_data(serviceTypeNode);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
222 ret = !g_ascii_strcasecmp(tmp, serviceType);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
223 g_free(tmp);
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
224
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
225 return ret;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
226 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
227
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
228 static gchar*
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
229 purple_upnp_parse_description_response(const gchar* httpResponse, gsize len,
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
230 const gchar* httpURL, const gchar* serviceType)
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
231 {
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
232 gchar *xmlRoot, *baseURL, *controlURL, *service;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
233 xmlnode *xmlRootNode, *serviceTypeNode, *controlURLNode, *baseURLNode;
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
234 char *tmp;
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 /* make sure we have a valid http response */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
237 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
238 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
239 "parse_description_response(): Failed In HTTP_OK\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
240 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
241 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
242
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
243 /* find the root of the xml document */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
244 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
245 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
246 "parse_description_response(): Failed finding root\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
247 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
248 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
249
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
250 /* create the xml root node */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
251 if((xmlRootNode = xmlnode_from_str(xmlRoot,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
252 len - (xmlRoot - httpResponse))) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
253 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
254 "parse_description_response(): Could not parse xml root node\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
255 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
256 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
257
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
258 /* get the baseURL of the device */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
259 if((baseURLNode = xmlnode_get_child(xmlRootNode, "URLBase")) != NULL) {
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
260 baseURL = xmlnode_get_data(baseURLNode);
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
261 } else {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
262 baseURL = g_strdup(httpURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
263 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
264
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
265 /* 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
266
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
267 /* get urn:schemas-upnp-org:device:InternetGatewayDevice:1 and its devicelist */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
268 serviceTypeNode = xmlnode_get_child(xmlRootNode, "device");
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
269 while(!purple_upnp_compare_device(serviceTypeNode,
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
270 "urn:schemas-upnp-org:device:InternetGatewayDevice:1") &&
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
271 serviceTypeNode != NULL) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
272 serviceTypeNode = xmlnode_get_next_twin(serviceTypeNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
273 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
274 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
275 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
276 "parse_description_response(): could not get serviceTypeNode 1\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
277 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
278 xmlnode_free(xmlRootNode);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
279 return NULL;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
280 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
281 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "deviceList");
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
282 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
283 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
284 "parse_description_response(): could not get serviceTypeNode 2\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
285 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
286 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
287 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
288 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
289
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
290 /* get urn:schemas-upnp-org:device:WANDevice:1 and its devicelist */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
291 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "device");
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
292 while(!purple_upnp_compare_device(serviceTypeNode,
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
293 "urn:schemas-upnp-org:device:WANDevice:1") &&
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
294 serviceTypeNode != NULL) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
295 serviceTypeNode = xmlnode_get_next_twin(serviceTypeNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
296 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
297 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
298 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
299 "parse_description_response(): could not get serviceTypeNode 3\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
300 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
301 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
302 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
303 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
304 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "deviceList");
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 4\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 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
312
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
313 /* get urn:schemas-upnp-org:device:WANConnectionDevice:1 and its servicelist */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
314 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "device");
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
315 while(serviceTypeNode && !purple_upnp_compare_device(serviceTypeNode,
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
316 "urn:schemas-upnp-org:device:WANConnectionDevice:1")) {
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
317 serviceTypeNode = xmlnode_get_next_twin(serviceTypeNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
318 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
319 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
320 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
321 "parse_description_response(): could not get serviceTypeNode 5\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
322 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
323 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
324 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
325 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
326 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "serviceList");
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
327 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
328 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
329 "parse_description_response(): could not get serviceTypeNode 6\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
330 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
331 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
332 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
333 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
334
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
335 /* get the serviceType variable passed to this function */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
336 service = g_strdup_printf(SEARCH_REQUEST_DEVICE, serviceType);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
337 serviceTypeNode = xmlnode_get_child(serviceTypeNode, "service");
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
338 while(!purple_upnp_compare_service(serviceTypeNode, service) &&
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
339 serviceTypeNode != NULL) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
340 serviceTypeNode = xmlnode_get_next_twin(serviceTypeNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
341 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
342
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
343 g_free(service);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
344 if(serviceTypeNode == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
345 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
346 "parse_description_response(): could not get serviceTypeNode 7\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
347 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
348 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
349 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
350 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
351
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
352 /* get the controlURL of the service */
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
353 if((controlURLNode = xmlnode_get_child(serviceTypeNode,
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
354 "controlURL")) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
355 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
356 "parse_description_response(): Could not find controlURL\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
357 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
358 xmlnode_free(xmlRootNode);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
359 return NULL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
360 }
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
361
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
362 tmp = xmlnode_get_data(controlURLNode);
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
363 if(baseURL && !purple_str_has_prefix(tmp, "http://") &&
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
364 !purple_str_has_prefix(tmp, "HTTP://")) {
15348
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
365 /* Handle absolute paths in a relative URL. This probably
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
366 * belongs in util.c. */
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
367 if (tmp[0] == '/') {
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
368 size_t length;
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
369 const char *path, *start = strstr(baseURL, "://");
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
370 start = start ? start + 3 : baseURL;
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
371 path = strchr(start, '/');
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
372 length = path ? path - baseURL : strlen(baseURL);
15683
9421e229cb97 Minor warning fix
Mark Doliner <markdoliner@pidgin.im>
parents: 15502
diff changeset
373 controlURL = g_strdup_printf("%.*s%s", (int)length, baseURL, tmp);
15348
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
374 } else {
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
375 controlURL = g_strdup_printf("%s%s", baseURL, tmp);
5911c7af0870 [gaim-migrate @ 18076]
Ethan Blanton <elb@pidgin.im>
parents: 15290
diff changeset
376 }
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
377 g_free(tmp);
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
378 }else{
13622
9311eed487c7 [gaim-migrate @ 16007]
Richard Laager <rlaager@pidgin.im>
parents: 13201
diff changeset
379 controlURL = tmp;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
380 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
381 g_free(baseURL);
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
382 xmlnode_free(xmlRootNode);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
383
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
384 return controlURL;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
385 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
386
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
387 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
388 upnp_parse_description_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data,
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
389 const gchar *httpResponse, gsize len, const gchar *error_message)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
390 {
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
391 UPnPDiscoveryData *dd = user_data;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
392 gchar *control_url = NULL;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
393
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
394 if (len > 0)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
395 control_url = purple_upnp_parse_description_response(
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
396 httpResponse, len, dd->full_url, dd->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 g_free(dd->full_url);
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 if(control_url == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
401 purple_debug_error("upnp",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
402 "purple_upnp_parse_description(): control URL is NULL\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
403 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
404
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
405 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
406 : PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
407 control_info.lookup_time = time(NULL);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
408 control_info.control_url = control_url;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
409 strncpy(control_info.service_type, dd->service_type,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
410 sizeof(control_info.service_type));
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 fire_discovery_callbacks(control_url != NULL);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
413
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
414 /* Look up the public and internal IPs */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
415 if(control_url != NULL) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
416 lookup_public_ip();
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
417 lookup_internal_ip();
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
418 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
419
30514
b098c4f6eb80 Remove some timeout/input handlers for upnp.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 30384
diff changeset
420 if (dd->inpa > 0)
b098c4f6eb80 Remove some timeout/input handlers for upnp.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 30384
diff changeset
421 purple_input_remove(dd->inpa);
b098c4f6eb80 Remove some timeout/input handlers for upnp.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 30384
diff changeset
422 if (dd->tima > 0)
b098c4f6eb80 Remove some timeout/input handlers for upnp.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 30384
diff changeset
423 purple_timeout_remove(dd->tima);
b098c4f6eb80 Remove some timeout/input handlers for upnp.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 30384
diff changeset
424
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
425 g_free(dd);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
426 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
427
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
428 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
429 purple_upnp_parse_description(const gchar* descriptionURL, UPnPDiscoveryData *dd)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
430 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
431 gchar* httpRequest;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
432 gchar* descriptionXMLAddress;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
433 gchar* descriptionAddress;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
434 int port = 0;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
435
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
436 /* parse the 4 above variables out of the descriptionURL
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
437 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
438
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
439 /* 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
440 if(!purple_url_parse(descriptionURL, &descriptionAddress,
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
441 &port, &descriptionXMLAddress, NULL, NULL)) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
442 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
443 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
444 if(port == 0 || port == -1) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
445 port = DEFAULT_HTTP_PORT;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
446 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
447
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
448 /* for example...
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
449 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
450 httpRequest = g_strdup_printf(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
451 "GET /%s HTTP/1.1\r\n"
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
452 "Connection: close\r\n"
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
453 "Host: %s:%d\r\n\r\n",
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
454 descriptionXMLAddress, descriptionAddress, port);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
455
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
456 g_free(descriptionXMLAddress);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
457
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
458 dd->full_url = g_strdup_printf("http://%s:%d",
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
459 descriptionAddress, port);
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13097
diff changeset
460 g_free(descriptionAddress);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
461
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
462 /* Remove the timeout because everything it is waiting for has
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
463 * successfully completed */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
464 purple_timeout_remove(dd->tima);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
465 dd->tima = 0;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
466
32596
927575c2af4e * purple_util_fetch_url_request_len() renamed to purple_util_fetch_url_request().
Andrew Victor <andrew.victor@mxit.com>
parents: 32189
diff changeset
467 purple_util_fetch_url_request(NULL, descriptionURL, TRUE, NULL, TRUE, httpRequest,
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
468 TRUE, MAX_UPNP_DOWNLOAD, upnp_parse_description_cb, dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
469
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
470 g_free(httpRequest);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
471
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
472 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
473
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
474 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
475 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
476 UPnPDiscoveryData *dd)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
477 {
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
478 gchar* startDescURL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
479 gchar* endDescURL;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
480 gchar* descURL;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
481
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
482 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
483 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
484 "parse_discover_response(): Failed In HTTP_OK\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
485 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
486 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
487
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
488 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
489 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
490 "parse_discover_response(): Failed In finding http://\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 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
493
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
494 endDescURL = g_strstr_len(startDescURL, buf_len - (startDescURL - buf),
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
495 "\r");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
496 if(endDescURL == NULL) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
497 endDescURL = g_strstr_len(startDescURL,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
498 buf_len - (startDescURL - buf), "\n");
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
499 if(endDescURL == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
500 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
501 "parse_discover_response(): Failed In endDescURL\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
502 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
503 }
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
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
506 /* XXX: I'm not sure how this could ever happen */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
507 if(endDescURL == startDescURL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
508 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
509 "parse_discover_response(): endDescURL == startDescURL\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
510 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
511 }
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
512
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
513 descURL = g_strndup(startDescURL, endDescURL - startDescURL);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
514
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
515 purple_upnp_parse_description(descURL, dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
516
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
517 g_free(descURL);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
518
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
519 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
520
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
521 static gboolean
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
522 purple_upnp_discover_timeout(gpointer data)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
523 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
524 UPnPDiscoveryData* dd = data;
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 if (dd->inpa)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
527 purple_input_remove(dd->inpa);
30514
b098c4f6eb80 Remove some timeout/input handlers for upnp.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 30384
diff changeset
528 if (dd->tima > 0)
b098c4f6eb80 Remove some timeout/input handlers for upnp.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 30384
diff changeset
529 purple_timeout_remove(dd->tima);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
530 dd->inpa = 0;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
531 dd->tima = 0;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
532
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
533 if (dd->retry_count < NUM_UDP_ATTEMPTS) {
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
534 /* 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
535 dd->retry_count++;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
536 purple_upnp_discover_send_broadcast(dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
537 } else {
31949
f141aee90086 Fix some closes on invalid fds, which can crash on Windows.
Florian Quèze <florian@instantbird.org>
parents: 31273
diff changeset
538 if (dd->fd != -1)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
539 close(dd->fd);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
540
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
541 control_info.status = PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
542 control_info.lookup_time = time(NULL);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
543 control_info.service_type[0] = '\0';
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
544 g_free(control_info.control_url);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
545 control_info.control_url = NULL;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
546
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
547 fire_discovery_callbacks(FALSE);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
548
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
549 g_free(dd);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
550 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
551
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
552 return FALSE;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
553 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
554
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
555 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
556 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
557 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
558 int len;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
559 UPnPDiscoveryData *dd = data;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
560 gchar buf[65536];
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
561
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
562 do {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
563 len = recv(dd->fd, buf,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
564 sizeof(buf) - 1, 0);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
565
29810
8cb17c0c8fe5 Handle read of length 0 in upnp code.
Ethan Blanton <elb@pidgin.im>
parents: 27497
diff changeset
566 if(len >= 0) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
567 buf[len] = '\0';
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
568 break;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
569 } else if(errno != EINTR) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
570 /* We'll either get called again, or time out */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
571 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
572 }
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
573 } while (errno == EINTR);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
574
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
575 purple_input_remove(dd->inpa);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
576 dd->inpa = 0;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
577
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
578 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
579 dd->fd = -1;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
580
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
581 /* 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
582 purple_upnp_parse_discover_response(buf, len, dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
583
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
584 /* We'll either time out or continue successfully */
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
585 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
586
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
587 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
588 purple_upnp_discover_send_broadcast(UPnPDiscoveryData *dd)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
589 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
590 gchar *sendMessage = NULL;
25571
4cb4b6a61da6 Fix a null ptr deref/double free. Fixes #8336.
Daniel Atallah <datallah@pidgin.im>
parents: 24672
diff changeset
591 size_t totalSize;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
592 gboolean sentSuccess;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
593
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
594 /* because we are sending over UDP, if there is a failure
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
595 we should retry the send NUM_UDP_ATTEMPTS times. Also,
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
596 try different requests for WANIPConnection and WANPPPConnection*/
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
597 for(; dd->retry_count < NUM_UDP_ATTEMPTS; dd->retry_count++) {
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13097
diff changeset
598 sentSuccess = FALSE;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
599
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
600 if((dd->retry_count % 2) == 0) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
601 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
602 } else {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
603 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
604 }
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
605
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
606 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
607
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
608 totalSize = strlen(sendMessage);
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
609
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
610 do {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
611 if(sendto(dd->fd, sendMessage, totalSize, 0,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
612 (struct sockaddr*) &(dd->server),
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
613 sizeof(struct sockaddr_in)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
614 ) == totalSize) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
615 sentSuccess = TRUE;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
616 break;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
617 }
13201
8c224ef70efa [gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents: 13097
diff changeset
618 } while (errno == EINTR || errno == EAGAIN);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
619
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
620 g_free(sendMessage);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
621
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
622 if(sentSuccess) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
623 dd->tima = purple_timeout_add(DISCOVERY_TIMEOUT,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
624 purple_upnp_discover_timeout, dd);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
625 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
626 purple_upnp_discover_udp_read, dd);
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
627
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
628 return;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
629 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
630 }
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
631
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
632 /* 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
633 * doesn't get called before the original function returns */
30514
b098c4f6eb80 Remove some timeout/input handlers for upnp.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 30384
diff changeset
634 dd->tima = purple_timeout_add(10, purple_upnp_discover_timeout, dd);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
635 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
636
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
637 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
638 purple_upnp_discover(PurpleUPnPCallback cb, gpointer cb_data)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
639 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
640 /* Socket Setup Variables */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
641 int sock;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
642 struct hostent* hp;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
643
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
644 /* UDP RECEIVE VARIABLES */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
645 UPnPDiscoveryData *dd;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
646
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
647 if (control_info.status == PURPLE_UPNP_STATUS_DISCOVERING) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
648 if (cb) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
649 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
650 discovery_callbacks, cb);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
651 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
652 discovery_callbacks, cb_data);
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 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
655 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
656
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
657 dd = g_new0(UPnPDiscoveryData, 1);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
658 if (cb) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
659 discovery_callbacks = g_slist_append(discovery_callbacks, cb);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
660 discovery_callbacks = g_slist_append(discovery_callbacks,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
661 cb_data);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
662 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
663
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
664 /* Set up the sockets */
31949
f141aee90086 Fix some closes on invalid fds, which can crash on Windows.
Florian Quèze <florian@instantbird.org>
parents: 31273
diff changeset
665 dd->fd = sock = socket(AF_INET, SOCK_DGRAM, 0);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
666 if(sock == -1) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
667 purple_debug_error("upnp",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
668 "purple_upnp_discover(): Failed In sock creation\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
669 /* Short circuit the retry attempts */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
670 dd->retry_count = NUM_UDP_ATTEMPTS;
30514
b098c4f6eb80 Remove some timeout/input handlers for upnp.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 30384
diff changeset
671 dd->tima = purple_timeout_add(10, purple_upnp_discover_timeout, dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
672 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
673 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
674
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
675 /* TODO: Non-blocking! */
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
676 if((hp = gethostbyname(HTTPMU_HOST_ADDRESS)) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
677 purple_debug_error("upnp",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
678 "purple_upnp_discover(): Failed In gethostbyname\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
679 /* Short circuit the retry attempts */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
680 dd->retry_count = NUM_UDP_ATTEMPTS;
30514
b098c4f6eb80 Remove some timeout/input handlers for upnp.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 30384
diff changeset
681 dd->tima = purple_timeout_add(10, purple_upnp_discover_timeout, dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
682 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
683 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
684
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
685 memset(&(dd->server), 0, sizeof(struct sockaddr));
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
686 dd->server.sin_family = AF_INET;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
687 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
688 dd->server.sin_port = htons(HTTPMU_HOST_PORT);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
689
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
690 control_info.status = PURPLE_UPNP_STATUS_DISCOVERING;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
691
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
692 purple_upnp_discover_send_broadcast(dd);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
693 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
694
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
695 static PurpleUtilFetchUrlData*
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
696 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
697 const gchar* actionParams, PurpleUtilFetchUrlCallback cb,
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
698 gpointer cb_data)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
699 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
700 PurpleUtilFetchUrlData* gfud;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
701 gchar* soapMessage;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
702 gchar* totalSendMessage;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
703 gchar* pathOfControl;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
704 gchar* addressOfControl;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
705 int port = 0;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
706
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
707 /* 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
708 if(!purple_url_parse(control_info.control_url, &addressOfControl,
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
709 &port, &pathOfControl, NULL, NULL)) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
710 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
711 "generate_action_message_and_send(): Failed In Parse URL\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
712 /* XXX: This should probably be async */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
713 if(cb)
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
714 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
715 return NULL;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
716 }
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
717 if(port == 0 || port == -1) {
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
718 port = DEFAULT_HTTP_PORT;
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
719 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
720
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
721 /* set the soap message */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
722 soapMessage = g_strdup_printf(SOAP_ACTION, actionName,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
723 control_info.service_type, actionParams, actionName);
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
724
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
725 /* set the HTTP Header, and append the body to it */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
726 totalSendMessage = g_strdup_printf(HTTP_HEADER_ACTION "%s",
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
727 pathOfControl, addressOfControl, port,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
728 control_info.service_type, actionName,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
729 strlen(soapMessage), soapMessage);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
730 g_free(pathOfControl);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
731 g_free(soapMessage);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
732
32596
927575c2af4e * purple_util_fetch_url_request_len() renamed to purple_util_fetch_url_request().
Andrew Victor <andrew.victor@mxit.com>
parents: 32189
diff changeset
733 gfud = purple_util_fetch_url_request(NULL, 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
734 totalSendMessage, TRUE, MAX_UPNP_DOWNLOAD, cb, cb_data);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
735
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
736 g_free(totalSendMessage);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
737 g_free(addressOfControl);
25571
4cb4b6a61da6 Fix a null ptr deref/double free. Fixes #8336.
Daniel Atallah <datallah@pidgin.im>
parents: 24672
diff changeset
738
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
739 return gfud;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
740 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
741
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
742 const gchar *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
743 purple_upnp_get_public_ip()
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
744 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
745 if (control_info.status == PURPLE_UPNP_STATUS_DISCOVERED
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
746 && control_info.publicip
32189
3af8d41121b6 Don't use strlen() when all you're trying to do is check if the string
Mark Doliner <markdoliner@pidgin.im>
parents: 32147
diff changeset
747 && *control_info.publicip)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
748 return control_info.publicip;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
749
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
750 /* Trigger another UPnP discovery if 5 minutes have elapsed since the
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
751 * last one, and it wasn't successful */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
752 if (control_info.status < PURPLE_UPNP_STATUS_DISCOVERING
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
753 && (time(NULL) - control_info.lookup_time) > 300)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
754 purple_upnp_discover(NULL, NULL);
12909
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 return NULL;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
757 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
758
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
759 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
760 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
761 const gchar *httpResponse, gsize len, const gchar *error_message)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
762 {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
763 gchar* temp, *temp2;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
764
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
765 if ((error_message != NULL) || (httpResponse == NULL))
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
766 return;
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 /* extract the ip, or see if there is an error */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
769 if((temp = g_strstr_len(httpResponse, len,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
770 "<NewExternalIPAddress")) == NULL) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
771 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
772 "looked_up_public_ip_cb(): Failed Finding <NewExternalIPAddress\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
773 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
774 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
775 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
776 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
777 "looked_up_public_ip_cb(): Failed In Finding >\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
778 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
779 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
780 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
781 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
782 "looked_up_public_ip_cb(): Failed In Finding <\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
783 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
784 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
785 *temp2 = '\0';
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
786
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
787 strncpy(control_info.publicip, temp + 1,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
788 sizeof(control_info.publicip));
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
789
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
790 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
791 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
792
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
793 static void
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
794 lookup_public_ip()
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
795 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
796 purple_upnp_generate_action_message_and_send("GetExternalIPAddress", "",
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
797 looked_up_public_ip_cb, NULL);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
798 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
799
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
800 /* TODO: This could be exported */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
801 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
802 purple_upnp_get_internal_ip(void)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
803 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
804 if (control_info.status == PURPLE_UPNP_STATUS_DISCOVERED
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
805 && control_info.internalip
32189
3af8d41121b6 Don't use strlen() when all you're trying to do is check if the string
Mark Doliner <markdoliner@pidgin.im>
parents: 32147
diff changeset
806 && *control_info.internalip)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
807 return control_info.internalip;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
808
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
809 /* Trigger another UPnP discovery if 5 minutes have elapsed since the
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
810 * last one, and it wasn't successful */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
811 if (control_info.status < PURPLE_UPNP_STATUS_DISCOVERING
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
812 && (time(NULL) - control_info.lookup_time) > 300)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
813 purple_upnp_discover(NULL, NULL);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
814
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
815 return NULL;
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
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
818 static void
14183
bdde840e984c [gaim-migrate @ 16755]
Mark Doliner <markdoliner@pidgin.im>
parents: 14170
diff changeset
819 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
820 {
31949
f141aee90086 Fix some closes on invalid fds, which can crash on Windows.
Florian Quèze <florian@instantbird.org>
parents: 31273
diff changeset
821 if (source != -1) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
822 strncpy(control_info.internalip,
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
823 purple_network_get_local_system_ip(source),
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
824 sizeof(control_info.internalip));
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
825 purple_debug_info("upnp", "Local IP: %s\n",
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
826 control_info.internalip);
14151
34427f138b1f [gaim-migrate @ 16712]
Mark Doliner <markdoliner@pidgin.im>
parents: 13793
diff changeset
827 close(source);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
828 } 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
829 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
830
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
831 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
832
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
833 static void
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
834 lookup_internal_ip()
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
835 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
836 gchar* addressOfControl;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
837 int port = 0;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
838
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
839 if(!purple_url_parse(control_info.control_url, &addressOfControl, &port,
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
840 NULL, NULL, NULL)) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
841 purple_debug_error("upnp",
14899
c65f0b4fb351 [gaim-migrate @ 17606]
Mark Doliner <markdoliner@pidgin.im>
parents: 14552
diff changeset
842 "lookup_internal_ip(): Failed In Parse URL\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
843 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
844 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
845 if(port == 0 || port == -1) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
846 port = DEFAULT_HTTP_PORT;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
847 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
848
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
849 if(purple_proxy_connect(NULL, NULL, addressOfControl, port,
14170
f611621bc8a0 [gaim-migrate @ 16742]
Mark Doliner <markdoliner@pidgin.im>
parents: 14151
diff changeset
850 looked_up_internal_ip_cb, NULL) == NULL)
14151
34427f138b1f [gaim-migrate @ 16712]
Mark Doliner <markdoliner@pidgin.im>
parents: 13793
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", "Get Local IP Connect Failed: Address: %s @@@ Port %d\n",
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
853 addressOfControl, port);
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
854 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
855
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
856 g_free(addressOfControl);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
857 }
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 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
860 done_port_mapping_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data,
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
861 const gchar *httpResponse, gsize len, const gchar *error_message)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
862 {
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
863 UPnPMappingAddRemove *ar = user_data;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
864
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
865 gboolean success = TRUE;
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 /* determine if port mapping was a success */
14416
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
868 if ((error_message != NULL) || (httpResponse == NULL) ||
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
869 (g_strstr_len(httpResponse, len, HTTP_OK) == NULL))
c95ffd983a39 [gaim-migrate @ 17060]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
870 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
871 purple_debug_error("upnp",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
872 "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
873 httpResponse ? httpResponse : "(null)");
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
874 success = FALSE;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
875 } else
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
876 purple_debug_info("upnp", "Successfully completed port mapping operation\n");
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
877
31273
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
878 ar->success = success;
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
879 ar->tima = purple_timeout_add(0, fire_ar_cb_async_and_free, ar);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
880 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
881
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
882 static void
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
883 do_port_mapping_cb(gboolean has_control_mapping, gpointer data)
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
884 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
885 UPnPMappingAddRemove *ar = data;
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
886
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
887 if (has_control_mapping) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
888 gchar action_name[25];
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
889 gchar *action_params;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
890 if(ar->add) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
891 const gchar *internal_ip;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
892 /* get the internal IP */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
893 if(!(internal_ip = purple_upnp_get_internal_ip())) {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
894 purple_debug_error("upnp",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
895 "purple_upnp_set_port_mapping(): couldn't get local ip\n");
31273
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
896 ar->success = FALSE;
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
897 ar->tima = purple_timeout_add(0, fire_ar_cb_async_and_free, ar);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
898 return;
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 strncpy(action_name, "AddPortMapping",
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
901 sizeof(action_name));
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
902 action_params = g_strdup_printf(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
903 ADD_PORT_MAPPING_PARAMS,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
904 ar->portmap, ar->protocol, ar->portmap,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
905 internal_ip);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
906 } else {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
907 strncpy(action_name, "DeletePortMapping", sizeof(action_name));
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
908 action_params = g_strdup_printf(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
909 DELETE_PORT_MAPPING_PARAMS,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
910 ar->portmap, ar->protocol);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
911 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
912
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
913 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
914 action_params, done_port_mapping_cb, ar);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
915
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
916 g_free(action_params);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
917 return;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
918 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
919
31273
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
920 ar->success = FALSE;
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
921 ar->tima = purple_timeout_add(0, fire_ar_cb_async_and_free, ar);
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
922 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
923
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
924 static gboolean
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
925 fire_port_mapping_failure_cb(gpointer data)
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
926 {
31273
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
927 UPnPMappingAddRemove *ar = data;
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
928
c221db041ca1 upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
Paul Aurich <darkrain42@pidgin.im>
parents: 31190
diff changeset
929 ar->tima = 0;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
930 do_port_mapping_cb(FALSE, data);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
931 return FALSE;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
932 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
933
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
934 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
935 {
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 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
937
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
938 /* Remove ar from discovery_callbacks if present; it was inserted after a cb.
30383
030f0d1491e1 Comment spellcheck.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 29810
diff changeset
939 * The same cb may be in the list multiple times, so be careful to remove
030f0d1491e1 Comment spellcheck.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 29810
diff changeset
940 * the one associated with ar. */
30384
4b8995626b20 Fix a read-after-free from valgrind:
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 30383
diff changeset
941 l = discovery_callbacks;
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
942 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
943 {
30384
4b8995626b20 Fix a read-after-free from valgrind:
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 30383
diff changeset
944 GSList *next = l->next;
4b8995626b20 Fix a read-after-free from valgrind:
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 30383
diff changeset
945
4b8995626b20 Fix a read-after-free from valgrind:
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 30383
diff changeset
946 if (next && (next->data == ar)) {
4b8995626b20 Fix a read-after-free from valgrind:
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 30383
diff changeset
947 discovery_callbacks = g_slist_delete_link(discovery_callbacks, next);
4b8995626b20 Fix a read-after-free from valgrind:
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 30383
diff changeset
948 next = l->next;
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
949 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
950 }
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
951
30384
4b8995626b20 Fix a read-after-free from valgrind:
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 30383
diff changeset
952 l = next;
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
953 }
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
954
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
955 if (ar->tima > 0)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
956 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
957
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
958 if (ar->gfud)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
959 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
960
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
961 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
962 }
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
963
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 UPnPMappingAddRemove *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
965 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
966 PurpleUPnPCallback cb, gpointer cb_data)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
967 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
968 UPnPMappingAddRemove *ar;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
969
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
970 ar = g_new0(UPnPMappingAddRemove, 1);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
971 ar->cb = cb;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
972 ar->cb_data = cb_data;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
973 ar->add = TRUE;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
974 ar->portmap = portmap;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
975 strncpy(ar->protocol, protocol, sizeof(ar->protocol));
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
976
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
977 /* 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
978 if(control_info.status == PURPLE_UPNP_STATUS_DISCOVERING) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
979 /* TODO: This will fail because when this cb is triggered,
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
980 * the internal IP lookup won't be complete */
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
981 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
982 discovery_callbacks, do_port_mapping_cb);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
983 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
984 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
985 return ar;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
986 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
987
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
988 /* 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
989 * elapsed since the last try, try again */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
990 if(control_info.status == PURPLE_UPNP_STATUS_UNDISCOVERED ||
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
991 (control_info.status == PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
992 && (time(NULL) - control_info.lookup_time) > 300)) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
993 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
994 return ar;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
995 } 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
996 if (cb) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
997 /* Asynchronously trigger a failed response */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
998 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
999 } else {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1000 /* No need to do anything if nobody expects a response*/
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1001 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
1002 ar = NULL;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1003 }
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
1004 return ar;
12734
69569600b471 [gaim-migrate @ 15078]
Daniel Atallah <datallah@pidgin.im>
parents: 12207
diff changeset
1005 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1006
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1007 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
1008 return ar;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1009 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1010
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
1011 UPnPMappingAddRemove *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1012 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
1013 PurpleUPnPCallback cb, gpointer cb_data)
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1014 {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1015 UPnPMappingAddRemove *ar;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1016
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1017 ar = g_new0(UPnPMappingAddRemove, 1);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1018 ar->cb = cb;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1019 ar->cb_data = cb_data;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1020 ar->add = FALSE;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1021 ar->portmap = portmap;
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1022 strncpy(ar->protocol, protocol, sizeof(ar->protocol));
11391
d172e72988cc [gaim-migrate @ 13620]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11213
diff changeset
1023
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1024 /* 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
1025 if(control_info.status == PURPLE_UPNP_STATUS_DISCOVERING) {
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1026 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1027 discovery_callbacks, do_port_mapping_cb);
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1028 discovery_callbacks = g_slist_append(
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1029 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
1030 return ar;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1031 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1032
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1033 /* 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
1034 * elapsed since the last try, try again */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1035 if(control_info.status == PURPLE_UPNP_STATUS_UNDISCOVERED ||
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1036 (control_info.status == PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1037 && (time(NULL) - control_info.lookup_time) > 300)) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1038 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
1039 return ar;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1040 } 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
1041 if (cb) {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1042 /* Asynchronously trigger a failed response */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15683
diff changeset
1043 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
1044 } else {
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1045 /* No need to do anything if nobody expects a response*/
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1046 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
1047 ar = NULL;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1048 }
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
1049 return ar;
12909
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1050 }
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1051
dfcf4df1dcd7 [gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents: 12734
diff changeset
1052 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
1053 return ar;
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1054 }
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
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 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
1057 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
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 /* 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
1060 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
1061 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
1062 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
1063 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
1064 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
1065 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
1066 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
1067 }
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
1068
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
1069 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
1070 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
1071 {
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
1072 static int handle;
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 24672
diff changeset
1073
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
1074 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
1075 }
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
1076
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
1077 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
1078 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
1079 {
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
1080 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
1081 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
1082 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
1083 }

mercurial