Annotation of embedaddon/miniupnpc/portlistingparse.c, revision 1.1.1.2
1.1.1.2 ! misho 1: /* $Id: portlistingparse.c,v 1.6 2012/05/29 10:26:51 nanard Exp $ */
1.1 misho 2: /* MiniUPnP project
3: * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
1.1.1.2 ! misho 4: * (c) 2011 Thomas Bernard
1.1 misho 5: * This software is subject to the conditions detailed
6: * in the LICENCE file provided within the distribution */
7: #include <string.h>
8: #include <stdlib.h>
9: #include "portlistingparse.h"
10: #include "minixml.h"
11:
12: /* list of the elements */
13: static const struct {
14: const portMappingElt code;
15: const char * const str;
16: } elements[] = {
17: { PortMappingEntry, "PortMappingEntry"},
18: { NewRemoteHost, "NewRemoteHost"},
19: { NewExternalPort, "NewExternalPort"},
20: { NewProtocol, "NewProtocol"},
21: { NewInternalPort, "NewInternalPort"},
22: { NewInternalClient, "NewInternalClient"},
23: { NewEnabled, "NewEnabled"},
24: { NewDescription, "NewDescription"},
25: { NewLeaseTime, "NewLeaseTime"},
26: { PortMappingEltNone, NULL}
27: };
28:
29: /* Helper function */
30: static UNSIGNED_INTEGER
31: atoui(const char * p, int l)
32: {
33: UNSIGNED_INTEGER r = 0;
34: while(l > 0 && *p)
35: {
36: if(*p >= '0' && *p <= '9')
37: r = r*10 + (*p - '0');
38: else
39: break;
40: p++;
41: l--;
42: }
43: return r;
44: }
45:
46: /* Start element handler */
47: static void
48: startelt(void * d, const char * name, int l)
49: {
50: int i;
51: struct PortMappingParserData * pdata = (struct PortMappingParserData *)d;
52: pdata->curelt = PortMappingEltNone;
53: for(i = 0; elements[i].str; i++)
54: {
55: if(memcmp(name, elements[i].str, l) == 0)
56: {
57: pdata->curelt = elements[i].code;
58: break;
59: }
60: }
61: if(pdata->curelt == PortMappingEntry)
62: {
63: struct PortMapping * pm;
64: pm = calloc(1, sizeof(struct PortMapping));
65: LIST_INSERT_HEAD( &(pdata->head), pm, entries);
66: }
67: }
68:
69: /* End element handler */
70: static void
71: endelt(void * d, const char * name, int l)
72: {
73: struct PortMappingParserData * pdata = (struct PortMappingParserData *)d;
1.1.1.2 ! misho 74: (void)name;
! 75: (void)l;
1.1 misho 76: pdata->curelt = PortMappingEltNone;
77: }
78:
79: /* Data handler */
80: static void
81: data(void * d, const char * data, int l)
82: {
83: struct PortMapping * pm;
84: struct PortMappingParserData * pdata = (struct PortMappingParserData *)d;
85: pm = pdata->head.lh_first;
86: if(!pm)
87: return;
88: if(l > 63)
89: l = 63;
90: switch(pdata->curelt)
91: {
92: case NewRemoteHost:
93: memcpy(pm->remoteHost, data, l);
94: pm->remoteHost[l] = '\0';
95: break;
96: case NewExternalPort:
97: pm->externalPort = (unsigned short)atoui(data, l);
98: break;
99: case NewProtocol:
100: if(l > 3)
101: l = 3;
102: memcpy(pm->protocol, data, l);
103: pm->protocol[l] = '\0';
104: break;
105: case NewInternalPort:
106: pm->internalPort = (unsigned short)atoui(data, l);
107: break;
108: case NewInternalClient:
109: memcpy(pm->internalClient, data, l);
110: pm->internalClient[l] = '\0';
111: break;
112: case NewEnabled:
113: pm->enabled = (unsigned char)atoui(data, l);
114: break;
115: case NewDescription:
116: memcpy(pm->description, data, l);
117: pm->description[l] = '\0';
118: break;
119: case NewLeaseTime:
120: pm->leaseTime = atoui(data, l);
121: break;
122: default:
123: break;
124: }
125: }
126:
127:
128: /* Parse the PortMappingList XML document for IGD version 2
129: */
130: void
131: ParsePortListing(const char * buffer, int bufsize,
132: struct PortMappingParserData * pdata)
133: {
134: struct xmlparser parser;
135:
136: memset(pdata, 0, sizeof(struct PortMappingParserData));
137: LIST_INIT(&(pdata->head));
138: /* init xmlparser */
139: parser.xmlstart = buffer;
140: parser.xmlsize = bufsize;
141: parser.data = pdata;
142: parser.starteltfunc = startelt;
143: parser.endeltfunc = endelt;
144: parser.datafunc = data;
145: parser.attfunc = 0;
146: parsexml(&parser);
147: }
148:
149: void
150: FreePortListing(struct PortMappingParserData * pdata)
151: {
152: struct PortMapping * pm;
153: while((pm = pdata->head.lh_first) != NULL)
154: {
155: LIST_REMOVE(pm, entries);
156: free(pm);
157: }
158: }
159:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>