src/upnp.c

Sun, 28 Aug 2005 22:16:17 +0000

author
Bartosz Oler <bartosz@pidgin.im>
date
Sun, 28 Aug 2005 22:16:17 +0000
changeset 11357
d96a9c46f200
parent 11213
837e1970689d
child 11391
d172e72988cc
permissions
-rw-r--r--

[gaim-migrate @ 13579]
Image field added to the request API.

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
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
4 *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
5 * gaim
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
6 *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
7 * Gaim is the legal property of its developers, whose names are too numerous
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
8 * 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
9 * source distribution.
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
10 *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
11 * 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
12 * 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
13 * the Free Software Foundation; either version 2 of the License, or
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
14 * (at your option) any later version.
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
15 *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
16 * 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
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
19 * GNU General Public License for more details.
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
20 *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
21 * 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
22 * along with this program; if not, write to the Free Software
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
24 */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
25 #include "internal.h"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
26 #include "gtkgaim.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 "debug.h"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
29 #include "network.h"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
30 #include "eventloop.h"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
31 #include "upnp.h"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
32
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
33
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
34 /**
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
35 * Information on the httpResponse callback
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
36 */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
37 typedef struct
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 guint inpa; /* gaim_input_add handle */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
40 guint tima; /* gaim_timout_add handle */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
41 char* recvBuffer; /* response data */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
42 guint totalSizeRecv;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
43 gboolean done;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
44
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
45 } HRD;
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 /***************************************************************
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
49 ** General Defines *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
50 ****************************************************************/
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
51 #define HTTP_OK "200 OK"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
52 #define SIZEOF_HTTP 7 /* size of "http://" */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
53 #define RECIEVE_TIMEOUT 10000
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
54 #define CONSECUTIVE_RECIEVE_TIMEOUT 500
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
55 #define DISCOVERY_TIMEOUT 1000
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
56
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
57
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
58 /***************************************************************
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
59 ** Discovery/Description Defines *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
60 ****************************************************************/
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
61 #define NUM_UDP_ATTEMPTS 2
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
62
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
63 /* Address and port of an SSDP request used for discovery */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
64 #define HTTPMU_HOST_ADDRESS "239.255.255.250"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
65 #define HTTPMU_HOST_PORT 1900
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
66
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
67 #define SEARCH_REQUEST_DEVICE "urn:schemas-upnp-org:service:" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
68 "WANIPConnection:1"
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 #define SEARCH_REQUEST_STRING "M-SEARCH * HTTP/1.1\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
71 "MX: 2\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
72 "HOST: 239.255.255.250:1900\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
73 "MAN: \"ssdp:discover\"\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
74 "ST: urn:schemas-upnp-org:service:" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
75 "WANIPConnection:1\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
76 "\r\n"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
77
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
78 #define MAX_DISCOVERY_RECIEVE_SIZE 400
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
79 #define MAX_DESCRIPTION_RECIEVE_SIZE 7000
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
80 #define MAX_DESCRIPTION_HTTP_HEADER_SIZE 100
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
81
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
82
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
83 /******************************************************************
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
84 ** Action Defines *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
85 *******************************************************************/
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
86 #define HTTP_HEADER_ACTION "POST %s HTTP/1.1\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
87 "HOST: %s\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
88 "SOAPACTION: " \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
89 "\"urn:schemas-upnp-org:" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
90 "service:%s#%s\"\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
91 "CONTENT-TYPE: text/xml ; charset=\"utf-8\"\r\n"\
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
92 "Content-Length: %i\r\n\r\n"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
93
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
94 #define SOAP_ACTION "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
95 "<s:Envelope xmlns:s=" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
96 "\"http://schemas.xmlsoap.org/soap/envelope/\" " \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
97 "s:encodingStyle=" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
98 "\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
99 "<s:Body>\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
100 "<u:%s xmlns:u=" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
101 "\"urn:schemas-upnp-org:service:%s\">\r\n%s" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
102 "</u:%s>\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
103 "</s:Body>\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
104 "</s:Envelope>\r\n"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
105
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
106 #define PORT_MAPPING_LEASE_TIME "0"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
107 #define PORT_MAPPING_DESCRIPTION "GAIM_UPNP_PORT_FORWARD"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
108
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
109 #define ADD_PORT_MAPPING_PARAMS "<NewRemoteHost></NewRemoteHost>\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
110 "<NewExternalPort>%i</NewExternalPort>\r\n"\
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
111 "<NewProtocol>%s</NewProtocol>\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
112 "<NewInternalPort>%i</NewInternalPort>\r\n"\
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
113 "<NewInternalClient>%s" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
114 "</NewInternalClient>\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
115 "<NewEnabled>1</NewEnabled>\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
116 "<NewPortMappingDescription>" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
117 PORT_MAPPING_DESCRIPTION \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
118 "</NewPortMappingDescription>\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
119 "<NewLeaseDuration>" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
120 PORT_MAPPING_LEASE_TIME \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
121 "</NewLeaseDuration>\r\n"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
122
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
123 #define DELETE_PORT_MAPPING_PARAMS "<NewRemoteHost></NewRemoteHost>\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
124 "<NewExternalPort>%i" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
125 "</NewExternalPort>\r\n" \
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
126 "<NewProtocol>%s</NewProtocol>\r\n"
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
127
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
128
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
129
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
130 /* validate an http url without a port */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
131 static gboolean
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
132 gaim_upnp_validate_url(const char* url)
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
133 {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
134 int i1, i2, i3, i4, r;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
135
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
136 if(url == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
137 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
138 "gaim_upnp_validate_url(): url == NULL\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
139 return FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
140 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
141 r = sscanf(url, "http://%3i.%3i.%3i.%3i/", &i1, &i2, &i3, &i4);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
142 if(r == 4) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
143 return TRUE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
144 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
145
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
146 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
147 "gaim_upnp_validate_url(): Failed In validate URL\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
148 return FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
149 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
150
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
151
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
152 static void
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
153 gaim_upnp_timeout(gpointer data,
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
154 gint source,
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
155 GaimInputCondition cond)
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
156 {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
157 HRD* hrd = data;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
158
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
159 gaim_input_remove(hrd->inpa);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
160 gaim_timeout_remove(hrd->tima);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
161
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
162 if(hrd->totalSizeRecv == 0) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
163 free(hrd->recvBuffer);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
164 hrd->recvBuffer = NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
165 } else {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
166 hrd->recvBuffer[hrd->totalSizeRecv] = '\0';
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
167 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
168
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
169 hrd->done = TRUE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
170 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
171
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
172
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
173 static void
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
174 gaim_upnp_http_read(gpointer data,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
175 gint sock,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
176 GaimInputCondition cond)
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
177 {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
178 int sizeRecv;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
179 extern int errno;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
180 HRD* hrd = data;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
181
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
182 sizeRecv = recv(sock, &(hrd->recvBuffer[hrd->totalSizeRecv]),
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
183 MAX_DESCRIPTION_RECIEVE_SIZE-hrd->totalSizeRecv, 0);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
184 if(sizeRecv < 0 && errno != EINTR) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
185 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
186 "gaim_upnp_http_read(): recv < 0: %i!\n\n", errno);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
187 free(hrd->recvBuffer);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
188 hrd->recvBuffer = NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
189 gaim_timeout_remove(hrd->tima);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
190 gaim_input_remove(hrd->inpa);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
191 hrd->done = TRUE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
192 return;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
193 }else if(errno == EINTR) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
194 sizeRecv = 0;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
195 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
196 hrd->totalSizeRecv += sizeRecv;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
197
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
198 if(sizeRecv == 0) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
199 if(hrd->totalSizeRecv == 0) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
200 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
201 "gaim_upnp_http_read(): totalSizeRecv == 0\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
202 free(hrd->recvBuffer);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
203 hrd->recvBuffer = NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
204 } else {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
205 hrd->recvBuffer[hrd->totalSizeRecv] = '\0';
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
206 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
207 gaim_timeout_remove(hrd->tima);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
208 gaim_input_remove(hrd->inpa);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
209 hrd->done = TRUE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
210 } else {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
211 gaim_timeout_remove(hrd->tima);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
212 gaim_input_remove(hrd->inpa);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
213 hrd->tima = gaim_timeout_add(CONSECUTIVE_RECIEVE_TIMEOUT,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
214 (GSourceFunc)gaim_upnp_timeout, hrd);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
215 hrd->inpa = gaim_input_add(sock, GAIM_INPUT_READ,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
216 gaim_upnp_http_read, hrd);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
217 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
218
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
219 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
220
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
221
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
222
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
223 static char*
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
224 gaim_upnp_http_request(const char* address,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
225 unsigned short port,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
226 const char* httpRequest)
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
227 {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
228 int sock;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
229 int sizeSent, totalSizeSent = 0;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
230 extern int errno;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
231 struct sockaddr_in serv_addr;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
232 struct hostent *server;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
233 char* recvBuffer;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
234
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
235 HRD* hrd = (HRD*)malloc(sizeof(HRD));
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
236 if(hrd == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
237 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
238 "gaim_upnp_http_request(): Failed in hrd MALLOC\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
239 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
240 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
241
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
242 hrd->recvBuffer = NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
243 hrd->totalSizeRecv = 0;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
244 hrd->done = FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
245
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
246 hrd->recvBuffer = (char*)malloc(MAX_DESCRIPTION_RECIEVE_SIZE);
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
247 if(hrd->recvBuffer == NULL) {
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
248 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
249 "gaim_upnp_http_request(): Failed in recvBuffer MALLOC\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
250 free(hrd);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
251 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
252 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
253
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
254 sock = socket(AF_INET, SOCK_STREAM, 0);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
255 if(sock < 0) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
256 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
257 "gaim_upnp_http_request(): Failed In sock creation\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
258 free(hrd->recvBuffer);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
259 free(hrd);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
260 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
261 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
262
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
263 server = gethostbyname(address);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
264 if(server == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
265 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
266 "gaim_upnp_http_request(): Failed In gethostbyname\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
267 free(hrd->recvBuffer);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
268 free(hrd);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
269 close(sock);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
270 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
271 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
272 memset((char*)&serv_addr, 0, sizeof(serv_addr));
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
273 serv_addr.sin_family = AF_INET;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
274 memcpy(&serv_addr.sin_addr,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
275 server->h_addr_list[0],
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
276 server->h_length);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
277 serv_addr.sin_port = htons(port);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
278
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
279 if(connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) < 0) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
280 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
281 "gaim_upnp_http_request(): Failed In connect\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
282 free(hrd->recvBuffer);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
283 free(hrd);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
284 close(sock);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
285 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
286 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
287
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
288 while(totalSizeSent < strlen(httpRequest)) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
289 sizeSent = send(sock,(char*)((int)httpRequest+totalSizeSent),
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
290 strlen(httpRequest),0);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
291 if(sizeSent <= 0 && errno != EINTR) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
292 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
293 "gaim_upnp_http_request(): Failed In send\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
294 free(hrd->recvBuffer);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
295 free(hrd);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
296 close(sock);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
297 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
298 }else if(errno == EINTR) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
299 sizeSent = 0;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
300 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
301 totalSizeSent += sizeSent;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
302 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
303
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
304 hrd->tima = gaim_timeout_add(RECIEVE_TIMEOUT,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
305 (GSourceFunc)gaim_upnp_timeout, hrd);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
306 hrd->inpa = gaim_input_add(sock, GAIM_INPUT_READ,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
307 gaim_upnp_http_read, hrd);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
308 while (!hrd->done) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
309 gtk_main_iteration();
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
310 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
311 close(sock);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
312
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
313 recvBuffer = hrd->recvBuffer;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
314 free(hrd);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
315 return recvBuffer;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
316 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
317
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
318
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
319
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
320 /* This function takes the HTTP response requesting the description xml from
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
321 * the UPnP enabled IGD. It also takes as input the URL the request was sent
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
322 * to.
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
323 *
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
324 * The description contains the URL needed to control the actions of the UPnP
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
325 * enabled IGD. This URL can be in the form of just a path, in whcih case we
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
326 * have to append the path to the base URL. The base URL might be specified
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
327 * in the XML, or it might not, in which case u append to the httpURL.
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
328 */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
329
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
330 /* at some point, maybe parse the description response using an xml library */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
331 static char*
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
332 gaim_upnp_parse_description_response(const char* httpResponse,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
333 const char* httpURL)
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
334 {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
335 char* wanIPConnectionStart;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
336 char urlBaseTag[] = "<URLBase>";
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
337 char urlBaseEndTag[] = "</URLBase>";
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
338 char controlURLTag[] = "<controlURL>";
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
339 char controlURLEndTag[] = "</controlURL>";
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
340 char* urlBaseTagLoc;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
341 char* urlBaseEndTagLoc;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
342 char* controlURLTagLoc;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
343 char* controlURLEndTagLoc;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
344 int controlURLSize;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
345 int baseURLSize;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
346 char* controlURL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
347 char* baseURL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
348
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
349 if(strstr(httpResponse, HTTP_OK) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
350 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
351 "parse_description_response(): Failed In HTTP_OK\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
352 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
353 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
354
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
355 if((wanIPConnectionStart =
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
356 strstr(httpResponse, SEARCH_REQUEST_DEVICE)) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
357 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
358 "parse_description_response(): Failed SEARCH_REQUEST_DEVICE\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
359 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
360 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
361 if((controlURLTagLoc = strstr(wanIPConnectionStart, controlURLTag))
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
362 == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
363 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
364 "parse_description_response(): Failed In controlURLTagLoc\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
365 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
366 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
367 if((controlURLEndTagLoc =
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
368 strstr(wanIPConnectionStart, controlURLEndTag)) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
369 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
370 "parse_description_response(): Failed In controlURLEndTagLoc\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
371 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
372 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
373
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
374
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
375 controlURLSize =
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
376 controlURLEndTagLoc-&controlURLTagLoc[strlen(controlURLTag)];
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
377 if((controlURL = (char*)malloc(controlURLSize+1)) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
378 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
379 "parse_description_response(): Failed In MALLOC controlURL\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
380 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
381 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
382 memcpy(controlURL, &controlURLTagLoc[strlen(controlURLTag)],
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
383 controlURLSize);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
384 controlURL[controlURLSize] = '\0';
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
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
387 if((urlBaseTagLoc = strstr(httpResponse, urlBaseTag)) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
388 if((baseURL = (char*)malloc(strlen(httpURL)+controlURLSize+1)) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
389 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
390 "parse_description_response(): Failed In MALLOC baseURL\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
391 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
392 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
393 memcpy(baseURL, httpURL, strlen(httpURL));
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
394 baseURL[strlen(httpURL)] = '\0';
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
395 } else {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
396 if((urlBaseEndTagLoc = strstr(httpResponse, urlBaseEndTag)) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
397 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
398 "parse_description_response(): Failed In urlBaseEndTagLoc\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
399 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
400 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
401 baseURLSize =
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
402 urlBaseEndTagLoc - &urlBaseTagLoc[strlen(urlBaseTag)];
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
403 if((baseURL = (char*)malloc(baseURLSize+controlURLSize+1)) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
404 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
405 "parse_description_response(): Failed 2nd MALLOC baseURL\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
406 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
407 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
408 memcpy(baseURL, &urlBaseTagLoc[strlen(urlBaseTag)], baseURLSize);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
409 baseURL[baseURLSize] = '\0';
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
410 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
411
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
412 if(strstr(controlURL, "http://") == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
413 memcpy(&baseURL[strlen(baseURL)], controlURL, strlen(controlURL)+1);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
414 free(controlURL);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
415 controlURL = baseURL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
416 }else{
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
417 free(baseURL);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
418 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
419
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
420 return controlURL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
421 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
422
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
423
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
424
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
425
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
426 /* parse a url into it's approrpiate parts:
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
427 address, port, path. return true on success,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
428 false on failure */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
429 static gboolean
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
430 gaim_upnp_parse_url(const char* url, char** path,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
431 char** address, char** port)
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
432 {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
433 char* temp, *temp2;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
434
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
435 /* get the path */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
436 if((temp = strchr(&url[SIZEOF_HTTP], '/')) < 0) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
437 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
438 "gaim_upnp_parse_url(): Failed In 1\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
439 return FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
440 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
441 if((*path = (char*)malloc(strlen(temp)+1)) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
442 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
443 "gaim_upnp_parse_url(): Failed In 2\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
444 return FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
445 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
446 memcpy(*path, temp, strlen(temp));
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
447 (*path)[strlen(temp)] = '\0';
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
448
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
449 /* get the port */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
450 if((temp2 = strchr(&url[SIZEOF_HTTP], ':')) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
451 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
452 "gaim_upnp_parse_url(): Failed In 3\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
453 free(*path);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
454 return FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
455 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
456 if((*port = (char*)malloc(temp-temp2)) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
457 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
458 "gaim_upnp_parse_url(): Failed In 4\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
459 free(*path);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
460 return FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
461 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
462 memcpy(*port, &temp2[1], (temp-1)-temp2);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
463 (*port)[(temp-1)-temp2] = '\0';
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
464
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
465 /* get the address */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
466 if((*address = (char*)malloc((temp2-&url[SIZEOF_HTTP])+1)) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
467 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
468 "gaim_upnp_parse_url(): Failed In 5\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
469 free(*path);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
470 free(*port);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
471 return FALSE;
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 memcpy(*address, &url[SIZEOF_HTTP],
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
474 temp2-&url[SIZEOF_HTTP]);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
475 (*address)[temp2-&url[SIZEOF_HTTP]] = '\0';
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
476
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
477 return TRUE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
478 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
479
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
480
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
481
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
482 /*
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
483 * This function takes the URL where the UPnP enabled IGD description is
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
484 * located at, and sends an HTTP request to retrieve that description. Once
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
485 * the description is retrieved, we send the response to the
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
486 * gaim_upnp_parse_description_response() function. This will parse the
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
487 * description, and return the control URL needed to control the IGD, which
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
488 * this function returns.
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
489 */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
490 static char*
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
491 gaim_upnp_parse_description(const char* descriptionURL)
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
492 {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
493 char* fullURL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
494 char* controlURL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
495 char* httpResponse;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
496 char httpRequest[MAX_DESCRIPTION_HTTP_HEADER_SIZE];
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
497
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
498 char* descriptionXMLAddress;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
499 char* descriptionAddressPort;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
500 char* descriptionAddress;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
501 char* descriptionPort;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
502 unsigned short port;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
503
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
504 /* parse the 4 above variables out of the descriptionURL
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
505 example description URL: http://192.168.1.1:5678/rootDesc.xml */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
506
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
507 /* parse the url into address, port, path variables */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
508 if(!gaim_upnp_parse_url(descriptionURL, &descriptionXMLAddress,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
509 &descriptionAddress, &descriptionPort)) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
510 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
511 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
512 if((port = atoi(descriptionPort)) == 0) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
513 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
514 "gaim_upnp_parse_description(): failed atoi\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
515 free(descriptionXMLAddress);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
516 free(descriptionAddress);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
517 free(descriptionPort);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
518 return NULL;
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
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
521 if((descriptionAddressPort = (char*)malloc(strlen(descriptionAddress) +
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
522 strlen(descriptionPort) + 2))
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
523 == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
524 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
525 "gaim_upnp_parse_description(): failed MALLOC desAddPort\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
526 free(descriptionXMLAddress);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
527 free(descriptionAddress);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
528 free(descriptionPort);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
529 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
530 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
531 sprintf(descriptionAddressPort, "%s:%s",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
532 descriptionAddress, descriptionPort);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
533
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
534 if((fullURL = (char*)malloc(strlen(descriptionAddressPort) +
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
535 SIZEOF_HTTP + 1)) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
536 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
537 "gaim_upnp_parse_description(): failed MALLOC fullURL\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
538 free(descriptionXMLAddress);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
539 free(descriptionAddress);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
540 free(descriptionPort);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
541 free(descriptionAddressPort);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
542 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
543 sprintf(fullURL, "http://%s", descriptionAddressPort);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
544
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
545 /* for example...
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
546 GET /rootDesc.xml HTTP/1.1\r\nHost: 192.168.1.1:5678\r\n\r\n */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
547 sprintf(httpRequest, "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
548 descriptionXMLAddress, descriptionAddressPort);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
549
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
550 httpResponse = gaim_upnp_http_request(descriptionAddress,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
551 port, httpRequest);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
552 if(httpResponse == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
553 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
554 "gaim_upnp_parse_description(): httpResponse is NULL\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
555 free(descriptionXMLAddress);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
556 free(descriptionAddress);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
557 free(descriptionPort);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
558 free(descriptionAddressPort);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
559 free(fullURL);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
560 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
561 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
562
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
563 controlURL = gaim_upnp_parse_description_response(httpResponse, fullURL);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
564
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
565 free(descriptionXMLAddress);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
566 free(descriptionAddress);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
567 free(descriptionPort);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
568 free(descriptionAddressPort);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
569 free(fullURL);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
570 free(httpResponse);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
571
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
572 if(controlURL == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
573 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
574 "gaim_upnp_parse_description(): controlURL is NULL\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
575 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
576 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
577
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
578 return controlURL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
579 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
580
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
581
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
582 static char*
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
583 gaim_upnp_parse_discover_response(const char* buf,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
584 unsigned int bufSize)
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 char* startDescURL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
587 char* endDescURL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
588 char* descURL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
589 unsigned int descURLSize;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
590 char* retVal;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
591
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
592 if(strstr(buf, HTTP_OK) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
593 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
594 "parse_discover_response(): Failed In HTTP_OK\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
595 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
596 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
597
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
598 if((startDescURL = strstr(buf, "http://")) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
599 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
600 "parse_description_response(): Failed In finding http://\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
601 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
602 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
603
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
604 endDescURL = strchr(startDescURL, '\r');
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
605 if(endDescURL == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
606 endDescURL = strchr(startDescURL, '\n');
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
607 if(endDescURL == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
608 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
609 "parse_description_response(): Failed In endDescURL\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
610 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
611 }else if(endDescURL == startDescURL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
612 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
613 "parse_description_response(): endDescURL == startDescURL\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
614 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
615 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
616 }else if(endDescURL == startDescURL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
617 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
618 "parse_description_response(): 2nd endDescURL == startDescURL\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
619 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
620 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
621
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
622 descURLSize = (endDescURL-startDescURL)+1;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
623 descURL = (char*)malloc(descURLSize);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
624 memcpy(descURL, startDescURL, descURLSize-1);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
625 descURL[descURLSize-1] = '\0';
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
626
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
627 retVal = gaim_upnp_parse_description(descURL);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
628 free(descURL);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
629 return retVal;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
630 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
631
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
632
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
633
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
634 static void
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
635 gaim_upnp_discover_udp_read(gpointer data,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
636 gint sock,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
637 GaimInputCondition cond)
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
638 {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
639 unsigned int length;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
640 extern int errno;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
641 struct sockaddr_in from;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
642 int sizeRecv;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
643 HRD* hrd = data;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
644
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
645 gaim_timeout_remove(hrd->tima);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
646 length = sizeof(struct sockaddr_in);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
647
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
648 do {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
649 sizeRecv = recvfrom(sock, hrd->recvBuffer,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
650 MAX_DISCOVERY_RECIEVE_SIZE, 0,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
651 (struct sockaddr*)&from, &length);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
652
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
653 if(sizeRecv > 0) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
654 hrd->recvBuffer[sizeRecv] = '\0';
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
655 }else if(errno != EINTR) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
656 free(hrd->recvBuffer);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
657 hrd->recvBuffer = NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
658 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
659 }while(errno == EINTR);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
660
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
661 gaim_input_remove(hrd->inpa);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
662 hrd->done = TRUE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
663 return;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
664 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
665
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
666
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
667
11204
0669c72f555e [gaim-migrate @ 13332]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11195
diff changeset
668 char*
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
669 gaim_upnp_discover(void)
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
670 {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
671 int sock, i;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
672 int sizeSent, totalSizeSent;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
673 extern int errno;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
674 gboolean sentSuccess, recvSuccess;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
675 struct sockaddr_in server;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
676 struct hostent *hp;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
677 char sendMessage[] = SEARCH_REQUEST_STRING;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
678 char *controlURL = NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
679
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
680 HRD* hrd = (HRD*)malloc(sizeof(HRD));
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
681 if(hrd == NULL) {
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
682 gaim_debug_info("upnp",
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
683 "gaim_upnp_discover(): Failed in hrd MALLOC\n\n");
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
684 return NULL;
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
685 }
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
686
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
687 sock = socket(AF_INET, SOCK_DGRAM, 0);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
688 if (sock == -1) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
689 close(sock);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
690 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
691 "gaim_upnp_discover(): Failed In sock creation\n\n");
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
692 free(hrd->recvBuffer);
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
693 free(hrd);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
694 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
695 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
696
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
697 memset(&server, 0, sizeof(struct sockaddr));
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
698 server.sin_family = AF_INET;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
699 if((hp = gethostbyname(HTTPMU_HOST_ADDRESS)) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
700 close(sock);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
701 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
702 "gaim_upnp_discover(): Failed In gethostbyname\n\n");
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
703 free(hrd->recvBuffer);
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
704 free(hrd);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
705 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
706 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
707
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
708 memcpy(&server.sin_addr,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
709 hp->h_addr_list[0],
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
710 hp->h_length);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
711 server.sin_port = htons(HTTPMU_HOST_PORT);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
712
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
713 /* because we are sending over UDP, if there is a failure
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
714 we should retry the send NUM_UDP_ATTEMPTS times */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
715 for(i = 0; i < NUM_UDP_ATTEMPTS; i++) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
716 sentSuccess = TRUE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
717 recvSuccess = TRUE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
718 totalSizeSent = 0;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
719
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
720 hrd->recvBuffer = NULL;
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
721 hrd->totalSizeRecv = 0;
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
722 hrd->done = FALSE;
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
723
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
724 hrd->recvBuffer = (char*)malloc(MAX_DISCOVERY_RECIEVE_SIZE);
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
725 if(hrd->recvBuffer == NULL) {
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
726 gaim_debug_info("upnp",
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
727 "gaim_upnp_discover(): Failed in hrd->recvBuffer MALLOC\n\n");
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
728 free(hrd);
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
729 return NULL;
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
730 }
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
731
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
732 while(totalSizeSent < strlen(sendMessage)) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
733 sizeSent = sendto(sock,(void*)&sendMessage[totalSizeSent],
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
734 strlen(&sendMessage[totalSizeSent]),0,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
735 (struct sockaddr*)&server,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
736 sizeof(struct sockaddr_in));
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
737 if(sizeSent <= 0 && errno != EINTR) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
738 sentSuccess = FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
739 break;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
740 }else if(errno == EINTR) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
741 sizeSent = 0;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
742 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
743 totalSizeSent += sizeSent;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
744 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
745
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
746 if(sentSuccess) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
747 hrd->tima = gaim_timeout_add(DISCOVERY_TIMEOUT,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
748 (GSourceFunc)gaim_upnp_timeout, hrd);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
749 hrd->inpa = gaim_input_add(sock, GAIM_INPUT_READ,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
750 gaim_upnp_discover_udp_read, hrd);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
751 while (!hrd->done) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
752 gtk_main_iteration();
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
753 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
754 if(hrd->recvBuffer == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
755 recvSuccess = FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
756 } else {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
757 /* parse the response, and see if it was a success */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
758 close(sock);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
759 if((controlURL=
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
760 gaim_upnp_parse_discover_response(hrd->recvBuffer,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
761 strlen(hrd->recvBuffer)))==NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
762 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
763 "gaim_upnp_discover(): Failed In parse response\n\n");
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
764 free(hrd->recvBuffer);
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
765 free(hrd);
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
766 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
767 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
768 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
769 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
770
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
771 /* if sent success and recv successful, then break */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
772 if(sentSuccess && recvSuccess) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
773 i = NUM_UDP_ATTEMPTS;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
774 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
775 }
11213
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
776
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
777 if(hrd->recvBuffer != NULL) {
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
778 free(hrd->recvBuffer);
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
779 }
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
780 free(hrd);
837e1970689d [gaim-migrate @ 13344]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11204
diff changeset
781
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
782 if(!sentSuccess || !recvSuccess) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
783 close(sock);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
784 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
785 "gaim_upnp_discover(): Failed In sent/recv success\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
786 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
787 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
788
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
789 return controlURL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
790 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
791
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
792
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
793
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
794
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
795 static char*
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
796 gaim_upnp_generate_action_message_and_send(const char* controlURL,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
797 const char* actionName,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
798 const char* actionParams)
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
799 {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
800 char serviceType[] = "WANIPConnection:1";
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
801 char* actionMessage;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
802 char* soapMessage;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
803 char* httpResponse;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
804
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
805 char* pathOfControl;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
806 char* addressOfControl;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
807 char* addressPortOfControl;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
808 char* portOfControl;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
809 unsigned short port;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
810
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
811 /* set the soap message */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
812 if((soapMessage = (char*)malloc(strlen(SOAP_ACTION) +
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
813 strlen(serviceType) +
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
814 strlen(actionParams) +
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
815 strlen(actionName) +
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
816 strlen(actionName))) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
817 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
818 "generate_action_message_and_send(): Failed MALLOC soapMessage\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
819 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
820 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
821 sprintf(soapMessage, SOAP_ACTION, actionName, serviceType,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
822 actionParams, actionName);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
823
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
824 /* parse the url into address, port, path variables */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
825 if(!gaim_upnp_parse_url(controlURL, &pathOfControl,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
826 &addressOfControl, &portOfControl)) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
827 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
828 "generate_action_message_and_send(): Failed In Parse URL\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
829 free(soapMessage);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
830 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
831 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
832
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
833 /* set the addressPortOfControl variable which should have a
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
834 form like the following: 192.168.1.1:8000 */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
835 if((addressPortOfControl = (char*)malloc(strlen(addressOfControl) +
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
836 strlen(portOfControl) +
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
837 2)) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
838 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
839 "generate_action_message_and_send(): MALLOC addressPortOfControl\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
840 free(soapMessage);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
841 free(pathOfControl);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
842 free(addressOfControl);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
843 free(portOfControl);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
844 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
845 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
846 sprintf(addressPortOfControl, "%s:%s", addressOfControl, portOfControl);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
847 if((port = atoi(portOfControl)) == 0) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
848 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
849 "generate_action_message_and_send(): Failed In port = atoi\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
850 free(soapMessage);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
851 free(pathOfControl);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
852 free(addressOfControl);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
853 free(portOfControl);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
854 free(addressPortOfControl);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
855 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
856 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
857
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
858 /* set the HTTP Header */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
859 if((actionMessage = (char*)malloc(strlen(HTTP_HEADER_ACTION) +
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
860 strlen(pathOfControl) +
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
861 strlen(addressPortOfControl) +
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
862 strlen(serviceType) +
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
863 strlen(actionName) +
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
864 strlen(soapMessage))) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
865 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
866 "generate_action_message_and_send(): Failed MALLOC actionMessage\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
867 free(soapMessage);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
868 free(pathOfControl);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
869 free(addressOfControl);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
870 free(portOfControl);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
871 free(addressPortOfControl);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
872 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
873 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
874 sprintf(actionMessage, HTTP_HEADER_ACTION,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
875 pathOfControl, addressPortOfControl,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
876 serviceType, actionName, strlen(soapMessage));
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
877
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
878 /* append to the header the body */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
879 strcat(actionMessage, soapMessage);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
880
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
881 /* get the return of the http response */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
882 httpResponse = gaim_upnp_http_request(addressOfControl,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
883 port, actionMessage);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
884 if(httpResponse == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
885 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
886 "generate_action_message_and_send(): Failed In httpResponse\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
887 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
888
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
889 free(actionMessage);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
890 free(soapMessage);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
891 free(pathOfControl);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
892 free(addressOfControl);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
893 free(portOfControl);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
894 free(addressPortOfControl);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
895
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
896 return httpResponse;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
897 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
898
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
899
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
900
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
901
11204
0669c72f555e [gaim-migrate @ 13332]
Adam Warrington <awarring@users.sourceforge.net>
parents: 11195
diff changeset
902 char*
11195
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
903 gaim_upnp_get_public_ip(const char* controlURL)
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
904 {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
905 char* extIPAddress;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
906 char* httpResponse;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
907 char actionName[] = "GetExternalIPAddress";
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
908 char actionParams[] = "";
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
909 char* temp, *temp2;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
910
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
911 /* make sure controlURL is a valid URL */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
912 if(!gaim_upnp_validate_url(controlURL)) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
913 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
914 "gaim_upnp_get_public_ip(): Failed In Validate URL\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
915 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
916 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
917
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
918 httpResponse = gaim_upnp_generate_action_message_and_send(controlURL,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
919 actionName,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
920 actionParams);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
921 if(httpResponse == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
922 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
923 "gaim_upnp_get_public_ip(): Failed In httpResponse\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
924 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
925 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
926
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
927 /* extract the ip, or see if there is an error */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
928 /* at some point, maybe extract the ip using an xml library */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
929 if((temp = strstr(httpResponse, "<NewExternalIPAddress")) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
930 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
931 "gaim_upnp_get_public_ip(): Failed Finding <NewExternalIPAddress\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
932 free(httpResponse);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
933 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
934 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
935 if((temp = strchr(temp, '>')) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
936 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
937 "gaim_upnp_get_public_ip(): Failed In Finding >\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
938 free(httpResponse);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
939 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
940 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
941 if((temp2 = strchr(temp, '<')) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
942 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
943 "gaim_upnp_get_public_ip(): Failed In Finding <\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
944 free(httpResponse);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
945 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
946 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
947 if((extIPAddress = (char*)malloc(temp2-temp)) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
948 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
949 "gaim_upnp_get_public_ip(): Failed In MALLOC extIPAddress\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
950 free(httpResponse);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
951 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
952 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
953 memcpy(extIPAddress, &temp[1], (temp2-1)-temp);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
954 extIPAddress[(temp2-1)-temp] = '\0';
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
955
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
956 free(httpResponse);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
957 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
958 "gaim_upnp_get_public_ip() IP: %s\n\n", extIPAddress);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
959 return extIPAddress;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
960 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
961
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
962
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
963
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
964 static const char*
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
965 gaim_upnp_get_local_ip_address(const char* address) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
966 const char* ip;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
967 int sock;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
968 struct sockaddr_in serv_addr;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
969 struct hostent *server;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
970 char* pathOfControl;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
971 char* addressOfControl;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
972 char* portOfControl;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
973 unsigned short port;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
974
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
975 /* parse the url into address, port, path variables */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
976 if(!gaim_upnp_parse_url(address, &pathOfControl,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
977 &addressOfControl, &portOfControl)) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
978 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
979 "get_local_ip_address(): Failed In Parse URL\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
980 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
981 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
982 if((port = atoi(portOfControl)) == 0) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
983 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
984 "get_local_ip_address(): Failed In port = atoi\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
985 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
986 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
987
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
988 sock = socket(AF_INET, SOCK_STREAM, 0);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
989 if(sock < 0) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
990 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
991 "get_local_ip_address(): Failed In sock creation\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
992 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
993 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
994
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
995 server = gethostbyname(addressOfControl);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
996 if(server == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
997 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
998 "get_local_ip_address(): Failed In gethostbyname\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
999 close(sock);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1000 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1001 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1002 memset((char*)&serv_addr, 0, sizeof(serv_addr));
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1003 serv_addr.sin_family = AF_INET;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1004 memcpy(&serv_addr.sin_addr,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1005 server->h_addr_list[0],
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1006 server->h_length);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1007 serv_addr.sin_port = htons(port);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1008
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1009 if(connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) < 0) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1010 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1011 "get_local_ip_address(): Failed In connect\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1012 close(sock);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1013 return NULL;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1014 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1015
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1016 ip = gaim_network_get_local_system_ip(sock);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1017
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1018 close(sock);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1019 return ip;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1020 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1021
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1022
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1023
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1024 gboolean
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1025 gaim_upnp_set_port_mapping(const char* controlURL, unsigned short portMap,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1026 const char* protocol)
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1027 {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1028 char* httpResponse;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1029 char actionName[] = "AddPortMapping";
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1030 char* actionParams;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1031 const char* internalIP;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1032
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1033 /* make sure controlURL is a valid URL */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1034 if(!gaim_upnp_validate_url(controlURL)) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1035 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1036 "gaim_upnp_set_port_mapping(): Failed In Validate URL\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1037 return FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1038 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1039
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1040 /* get the internal IP */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1041 if((internalIP = gaim_upnp_get_local_ip_address(controlURL)) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1042 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1043 "gaim_upnp_set_port_mapping(): couldn't get local ip\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1044 return FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1045 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1046
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1047 /* make the portMappingParams variable */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1048 if((actionParams = (char*)malloc(strlen(ADD_PORT_MAPPING_PARAMS) +
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1049 strlen(internalIP) +
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1050 10 + /* size of port as int * 2 */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1051 strlen(protocol))) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1052 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1053 "gaim_upnp_set_port_mapping(): Failed MALLOC portMappingParams\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1054 return FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1055 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1056 sprintf(actionParams, ADD_PORT_MAPPING_PARAMS, portMap,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1057 protocol, portMap, internalIP);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1058
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1059 httpResponse = gaim_upnp_generate_action_message_and_send(controlURL,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1060 actionName,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1061 actionParams);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1062
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1063 if(httpResponse == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1064 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1065 "gaim_upnp_set_port_mapping(): Failed In httpResponse\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1066 free(actionParams);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1067 return FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1068 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1069
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1070 /* determine if port mapping was a success */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1071 if(strstr(httpResponse, HTTP_OK) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1072 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1073 "gaim_upnp_set_port_mapping(): Failed HTTP_OK\n\n%s\n\n", httpResponse);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1074 free(actionParams);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1075 free(httpResponse);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1076 return FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1077 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1078
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1079 free(actionParams);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1080 free(httpResponse);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1081 return TRUE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1082 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1083
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1084
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1085 gboolean
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1086 gaim_upnp_remove_port_mapping(const char* controlURL, unsigned short portMap,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1087 const char* protocol)
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1088 {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1089 char* httpResponse;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1090 char actionName[] = "DeletePortMapping";
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1091 char* actionParams;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1092
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1093 /* make sure controlURL is a valid URL */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1094 if(!gaim_upnp_validate_url(controlURL)) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1095 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1096 "gaim_upnp_set_port_mapping(): Failed In Validate URL\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1097 return FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1098 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1099
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1100 /* make the portMappingParams variable */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1101 if((actionParams = (char*)malloc(strlen(DELETE_PORT_MAPPING_PARAMS) +
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1102 5 + /* size of port as int */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1103 strlen(protocol))) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1104 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1105 "gaim_upnp_set_port_mapping(): Failed MALLOC portMappingParams\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1106 return FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1107 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1108 sprintf(actionParams, DELETE_PORT_MAPPING_PARAMS,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1109 portMap, protocol);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1110
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1111 httpResponse = gaim_upnp_generate_action_message_and_send(controlURL,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1112 actionName,
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1113 actionParams);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1114
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1115 if(httpResponse == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1116 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1117 "gaim_upnp_set_port_mapping(): Failed In httpResponse\n\n");
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1118 free(actionParams);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1119 return FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1120 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1121
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1122 /* determine if port mapping was a success */
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1123 if(strstr(httpResponse, HTTP_OK) == NULL) {
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1124 gaim_debug_info("upnp",
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1125 "gaim_upnp_set_port_mapping(): Failed HTTP_OK\n\n%s\n\n", httpResponse);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1126 free(actionParams);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1127 free(httpResponse);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1128 return FALSE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1129 }
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1130
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1131 free(actionParams);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1132 free(httpResponse);
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1133 return TRUE;
d84d542a04ac [gaim-migrate @ 13319]
Adam Warrington <awarring@users.sourceforge.net>
parents:
diff changeset
1134 }

mercurial