summaryrefslogtreecommitdiff
path: root/src/nat/upnp-igd-parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nat/upnp-igd-parse.c')
-rw-r--r--src/nat/upnp-igd-parse.c207
1 files changed, 0 insertions, 207 deletions
diff --git a/src/nat/upnp-igd-parse.c b/src/nat/upnp-igd-parse.c
deleted file mode 100644
index 0812065ed..000000000
--- a/src/nat/upnp-igd-parse.c
+++ /dev/null
@@ -1,207 +0,0 @@
1/*
2 This file is part of GNUnet.
3 (C) 2009, 2010 Christian Grothoff (and other contributing authors)
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
19*/
20
21/*
22 * Code in this file is originally based on the miniupnp library.
23 * Copyright (c) 2005-2008, Thomas BERNARD. All rights reserved.
24 *
25 * Original licence:
26 *
27 * Redistribution and use in source and binary forms, with or without
28 * modification, are permitted provided that the following conditions are met:
29 *
30 * * Redistributions of source code must retain the above copyright notice,
31 * this list of conditions and the following disclaimer.
32 * * Redistributions in binary form must reproduce the above copyright notice,
33 * this list of conditions and the following disclaimer in the documentation
34 * and/or other materials provided with the distribution.
35 * * The name of the author may not be used to endorse or promote products
36 * derived from this software without specific prior written permission.
37 *
38 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
39 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
40 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
41 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
42 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
43 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
44 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
45 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
46 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
47 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
48 * POSSIBILITY OF SUCH DAMAGE.
49 */
50
51/**
52 * @file nat/upnp-igd-parse.h
53 * @brief Parser for XML descriptions of UPnP Internet Gateway Devices
54 *
55 * @author Milan Bouchet-Valat
56 */
57#include <stdio.h>
58#include <string.h>
59
60#include "platform.h"
61#include "gnunet_util_lib.h"
62#include "upnp-minixml.h"
63#include "upnp-igd-parse.h"
64
65/**
66 * Start element handler: update nesting level counter
67 * and copy element name.
68 */
69static void
70start_elt (void *d, const char *name, int l)
71{
72 struct UPNP_IGD_Data_ *datas = (struct UPNP_IGD_Data_ *) d;
73
74 memcpy (datas->cur_elt_name, name, l);
75 datas->cur_elt_name[l] = '\0';
76 datas->level++;
77 if ((l == 7) && !memcmp (name, "service", l))
78 {
79 datas->control_url_tmp[0] = '\0';
80 datas->event_sub_url_tmp[0] = '\0';
81 datas->scpd_url_tmp[0] = '\0';
82 datas->service_type_tmp[0] = '\0';
83 }
84}
85
86/**
87 * End element handler: update nesting level counter
88 * and update parser state if service element is parsed.
89 */
90static void
91end_elt (void *d, const char *name, int l)
92{
93 struct UPNP_IGD_Data_ *datas = (struct UPNP_IGD_Data_ *) d;
94
95 datas->level--;
96
97 if ((l == 7) && !memcmp (name, "service", l))
98 {
99 if (0 == strcmp (datas->service_type_tmp,
100 "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1"))
101 {
102 memcpy (datas->control_url_CIF, datas->control_url_tmp,
103 MINIUPNPC_URL_MAXSIZE);
104 memcpy (datas->event_sub_url_CIF, datas->event_sub_url_tmp,
105 MINIUPNPC_URL_MAXSIZE);
106 memcpy (datas->scpd_url_CIF, datas->scpd_url_tmp,
107 MINIUPNPC_URL_MAXSIZE);
108 memcpy (datas->service_type_CIF, datas->service_type_tmp,
109 MINIUPNPC_URL_MAXSIZE);
110 }
111 else if (0 == strcmp (datas->service_type_tmp,
112 "urn:schemas-upnp-org:service:WANIPConnection:1")
113 || 0 == strcmp (datas->service_type_tmp,
114 "urn:schemas-upnp-org:service:WANPPPConnection:1"))
115 {
116 memcpy (datas->control_url, datas->control_url_tmp,
117 MINIUPNPC_URL_MAXSIZE);
118 memcpy (datas->event_sub_url, datas->event_sub_url_tmp,
119 MINIUPNPC_URL_MAXSIZE);
120 memcpy (datas->scpd_url, datas->scpd_url_tmp,
121 MINIUPNPC_URL_MAXSIZE);
122 memcpy (datas->service_type, datas->service_type_tmp,
123 MINIUPNPC_URL_MAXSIZE);
124 }
125 }
126}
127
128/**
129 * Data handler: copy data depending on the current
130 * element name and state.
131 */
132static void
133IGDdata (void *d, const char *data, int l)
134{
135 struct UPNP_IGD_Data_ *datas = (struct UPNP_IGD_Data_ *) d;
136 char *dstmember = NULL;
137
138 if (!strcmp (datas->cur_elt_name, "URLBase"))
139 dstmember = datas->base_url;
140 else if (!strcmp (datas->cur_elt_name, "serviceType"))
141 dstmember = datas->service_type_tmp;
142 else if (!strcmp (datas->cur_elt_name, "controlURL"))
143 dstmember = datas->control_url_tmp;
144 else if (!strcmp (datas->cur_elt_name, "eventSubURL"))
145 dstmember = datas->event_sub_url_tmp;
146 else if (!strcmp (datas->cur_elt_name, "SCPDURL"))
147 dstmember = datas->scpd_url_tmp;
148
149 /* Copy current element name into destination member */
150 if (dstmember)
151 {
152 if (l >= MINIUPNPC_URL_MAXSIZE)
153 l = MINIUPNPC_URL_MAXSIZE - 1;
154
155 memcpy (dstmember, data, l);
156 dstmember[l] = '\0';
157 }
158}
159
160#ifdef DEBUG_UPNP
161static void
162print_IGD (struct UPNP_IGD_Data_ *d)
163{
164 GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "UPnP",
165 "base_url = %s\n", d->base_url);
166 GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "UPnP",
167 "WAN Device (Common interface config) :\n"
168 " sevice_type = %s\n"
169 " control_url = %s\n"
170 " event_sub_url = %s\n"
171 " scpd_url = %s\n",
172 d->service_type_CIF,
173 d->control_url_CIF, d->event_sub_url_CIF, d->scpd_url_CIF);
174 GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "UPnP",
175 "WAN Connection Device (IP or PPP Connection):\n"
176 " service_type = %s\n"
177 " control_url = %s\n"
178 " event_sub_url = %s\n"
179 " scpd_url = %s\n",
180 d->service_type,
181 d->control_url, d->event_sub_url, d->scpd_url);
182}
183#endif
184
185/**
186 * Parse XML description of an IGD device into a UPNP_IGD_Data_ struct.
187 */
188void
189UPNP_IGD_parse_desc_ (const char *buffer, int buf_size,
190 struct UPNP_IGD_Data_ *data)
191{
192 struct UPNP_xml_parser_ parser;
193
194 parser.xml_start = buffer;
195 parser.xml_size = buf_size;
196 parser.cls = data;
197 parser.start_elt_func = start_elt;
198 parser.end_elt_func = end_elt;
199 parser.data_func = IGDdata;
200 parser.att_func = 0;
201
202 UPNP_parse_xml_ (&parser);
203
204#ifdef DEBUG_UPNP
205 print_IGD (data);
206#endif
207}