Annotation of embedaddon/miniupnpd/miniupnpc-async/igd_desc_parse.c, revision 1.1.1.1
1.1 misho 1: /* $Id: igd_desc_parse.c,v 1.17 2015/09/15 13:30:04 nanard Exp $ */
2: /* Project : miniupnp
3: * http://miniupnp.free.fr/
4: * Author : Thomas Bernard
5: * Copyright (c) 2005-2015 Thomas Bernard
6: * This software is subject to the conditions detailed in the
7: * LICENCE file provided in this distribution. */
8:
9: #include "igd_desc_parse.h"
10: #include <stdio.h>
11: #include <string.h>
12:
13: /* Start element handler :
14: * update nesting level counter and copy element name */
15: void IGDstartelt(void * d, const char * name, int l)
16: {
17: struct IGDdatas * datas = (struct IGDdatas *)d;
18: if(l >= MINIUPNPC_URL_MAXSIZE)
19: l = MINIUPNPC_URL_MAXSIZE-1;
20: memcpy(datas->cureltname, name, l);
21: datas->cureltname[l] = '\0';
22: datas->level++;
23: if( (l==7) && !memcmp(name, "service", l) ) {
24: datas->tmp.controlurl[0] = '\0';
25: datas->tmp.eventsuburl[0] = '\0';
26: datas->tmp.scpdurl[0] = '\0';
27: datas->tmp.servicetype[0] = '\0';
28: }
29: }
30:
31: #define COMPARE(str, cstr) (0==memcmp(str, cstr, sizeof(cstr) - 1))
32:
33: /* End element handler :
34: * update nesting level counter and update parser state if
35: * service element is parsed */
36: void IGDendelt(void * d, const char * name, int l)
37: {
38: struct IGDdatas * datas = (struct IGDdatas *)d;
39: datas->level--;
40: /*printf("endelt %2d %.*s\n", datas->level, l, name);*/
41: if( (l==7) && !memcmp(name, "service", l) )
42: {
43: if(COMPARE(datas->tmp.servicetype,
44: "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:")) {
45: memcpy(&datas->CIF, &datas->tmp, sizeof(struct IGDdatas_service));
46: } else if(COMPARE(datas->tmp.servicetype,
47: "urn:schemas-upnp-org:service:WANIPv6FirewallControl:")) {
48: memcpy(&datas->IPv6FC, &datas->tmp, sizeof(struct IGDdatas_service));
49: } else if(COMPARE(datas->tmp.servicetype,
50: "urn:schemas-upnp-org:service:WANIPConnection:")
51: || COMPARE(datas->tmp.servicetype,
52: "urn:schemas-upnp-org:service:WANPPPConnection:") ) {
53: if(datas->first.servicetype[0] == '\0') {
54: memcpy(&datas->first, &datas->tmp, sizeof(struct IGDdatas_service));
55: } else {
56: memcpy(&datas->second, &datas->tmp, sizeof(struct IGDdatas_service));
57: }
58: }
59: }
60: }
61:
62: /* Data handler :
63: * copy data depending on the current element name and state */
64: void IGDdata(void * d, const char * data, int l)
65: {
66: struct IGDdatas * datas = (struct IGDdatas *)d;
67: char * dstmember = 0;
68: /*printf("%2d %s : %.*s\n",
69: datas->level, datas->cureltname, l, data); */
70: if( !strcmp(datas->cureltname, "URLBase") )
71: dstmember = datas->urlbase;
72: else if( !strcmp(datas->cureltname, "presentationURL") )
73: dstmember = datas->presentationurl;
74: else if( !strcmp(datas->cureltname, "serviceType") )
75: dstmember = datas->tmp.servicetype;
76: else if( !strcmp(datas->cureltname, "controlURL") )
77: dstmember = datas->tmp.controlurl;
78: else if( !strcmp(datas->cureltname, "eventSubURL") )
79: dstmember = datas->tmp.eventsuburl;
80: else if( !strcmp(datas->cureltname, "SCPDURL") )
81: dstmember = datas->tmp.scpdurl;
82: /* else if( !strcmp(datas->cureltname, "deviceType") )
83: dstmember = datas->devicetype_tmp;*/
84: if(dstmember)
85: {
86: if(l>=MINIUPNPC_URL_MAXSIZE)
87: l = MINIUPNPC_URL_MAXSIZE-1;
88: memcpy(dstmember, data, l);
89: dstmember[l] = '\0';
90: }
91: }
92:
93: #ifdef DEBUG
94: void printIGD(struct IGDdatas * d)
95: {
96: printf("urlbase = '%s'\n", d->urlbase);
97: printf("WAN Device (Common interface config) :\n");
98: /*printf(" deviceType = '%s'\n", d->CIF.devicetype);*/
99: printf(" serviceType = '%s'\n", d->CIF.servicetype);
100: printf(" controlURL = '%s'\n", d->CIF.controlurl);
101: printf(" eventSubURL = '%s'\n", d->CIF.eventsuburl);
102: printf(" SCPDURL = '%s'\n", d->CIF.scpdurl);
103: printf("primary WAN Connection Device (IP or PPP Connection):\n");
104: /*printf(" deviceType = '%s'\n", d->first.devicetype);*/
105: printf(" servicetype = '%s'\n", d->first.servicetype);
106: printf(" controlURL = '%s'\n", d->first.controlurl);
107: printf(" eventSubURL = '%s'\n", d->first.eventsuburl);
108: printf(" SCPDURL = '%s'\n", d->first.scpdurl);
109: printf("secondary WAN Connection Device (IP or PPP Connection):\n");
110: /*printf(" deviceType = '%s'\n", d->second.devicetype);*/
111: printf(" servicetype = '%s'\n", d->second.servicetype);
112: printf(" controlURL = '%s'\n", d->second.controlurl);
113: printf(" eventSubURL = '%s'\n", d->second.eventsuburl);
114: printf(" SCPDURL = '%s'\n", d->second.scpdurl);
115: printf("WAN IPv6 Firewall Control :\n");
116: /*printf(" deviceType = '%s'\n", d->IPv6FC.devicetype);*/
117: printf(" servicetype = '%s'\n", d->IPv6FC.servicetype);
118: printf(" controlURL = '%s'\n", d->IPv6FC.controlurl);
119: printf(" eventSubURL = '%s'\n", d->IPv6FC.eventsuburl);
120: printf(" SCPDURL = '%s'\n", d->IPv6FC.scpdurl);
121: }
122: #endif /* DEBUG */
123:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>