Annotation of embedaddon/miniupnpd/miniupnpc-async/upnpreplyparse.c, revision 1.1.1.1
1.1 misho 1: /* $Id: upnpreplyparse.c,v 1.20 2017/12/12 11:26:25 nanard Exp $ */
2: /* vim: tabstop=4 shiftwidth=4 noexpandtab
3: * MiniUPnP project
4: * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
5: * (c) 2006-2019 Thomas Bernard
6: * This software is subject to the conditions detailed
7: * in the LICENCE file provided within the distribution */
8:
9: #include <stdlib.h>
10: #include <string.h>
11: #include <stdio.h>
12:
13: #include "upnpreplyparse.h"
14: #include "minixml.h"
15:
16: static void
17: NameValueParserStartElt(void * d, const char * name, int l)
18: {
19: struct NameValueParserData * data = (struct NameValueParserData *)d;
20: data->topelt = 1;
21: if(l>63)
22: l = 63;
23: memcpy(data->curelt, name, l);
24: data->curelt[l] = '\0';
25: data->cdata = NULL;
26: data->cdatalen = 0;
27: }
28:
29: static void
30: NameValueParserEndElt(void * d, const char * name, int namelen)
31: {
32: struct NameValueParserData * data = (struct NameValueParserData *)d;
33: struct NameValue * nv;
34: (void)name;
35: (void)namelen;
36: if(!data->topelt)
37: return;
38: if(strcmp(data->curelt, "NewPortListing") != 0)
39: {
40: int l;
41: /* standard case. Limited to n chars strings */
42: l = data->cdatalen;
43: nv = malloc(sizeof(struct NameValue));
44: if(nv == NULL)
45: {
46: /* malloc error */
47: #ifdef DEBUG
48: fprintf(stderr, "%s: error allocating memory",
49: "NameValueParserEndElt");
50: #endif /* DEBUG */
51: return;
52: }
53: if(l>=(int)sizeof(nv->value))
54: l = sizeof(nv->value) - 1;
55: strncpy(nv->name, data->curelt, 64);
56: nv->name[63] = '\0';
57: if(data->cdata != NULL)
58: {
59: memcpy(nv->value, data->cdata, l);
60: nv->value[l] = '\0';
61: }
62: else
63: {
64: nv->value[0] = '\0';
65: }
66: nv->l_next = data->l_head; /* insert in list */
67: data->l_head = nv;
68: }
69: data->cdata = NULL;
70: data->cdatalen = 0;
71: data->topelt = 0;
72: }
73:
74: static void
75: NameValueParserGetData(void * d, const char * datas, int l)
76: {
77: struct NameValueParserData * data = (struct NameValueParserData *)d;
78: if(strcmp(data->curelt, "NewPortListing") == 0)
79: {
80: /* specific case for NewPortListing which is a XML Document */
81: free(data->portListing);
82: data->portListing = malloc(l + 1);
83: if(!data->portListing)
84: {
85: /* malloc error */
86: #ifdef DEBUG
87: fprintf(stderr, "%s: error allocating memory",
88: "NameValueParserGetData");
89: #endif /* DEBUG */
90: return;
91: }
92: memcpy(data->portListing, datas, l);
93: data->portListing[l] = '\0';
94: data->portListingLength = l;
95: }
96: else
97: {
98: /* standard case. */
99: data->cdata = datas;
100: data->cdatalen = l;
101: }
102: }
103:
104: void
105: ParseNameValue(const char * buffer, int bufsize,
106: struct NameValueParserData * data)
107: {
108: struct xmlparser parser;
109: memset(data, 0, sizeof(struct NameValueParserData));
110: /* init xmlparser object */
111: parser.xmlstart = buffer;
112: parser.xmlsize = bufsize;
113: parser.data = data;
114: parser.starteltfunc = NameValueParserStartElt;
115: parser.endeltfunc = NameValueParserEndElt;
116: parser.datafunc = NameValueParserGetData;
117: parser.attfunc = 0;
118: parsexml(&parser);
119: }
120:
121: void
122: ClearNameValueList(struct NameValueParserData * pdata)
123: {
124: struct NameValue * nv;
125: if(pdata->portListing)
126: {
127: free(pdata->portListing);
128: pdata->portListing = NULL;
129: pdata->portListingLength = 0;
130: }
131: while((nv = pdata->l_head) != NULL)
132: {
133: pdata->l_head = nv->l_next;
134: free(nv);
135: }
136: }
137:
138: char *
139: GetValueFromNameValueList(struct NameValueParserData * pdata,
140: const char * Name)
141: {
142: struct NameValue * nv;
143: char * p = NULL;
144: for(nv = pdata->l_head;
145: (nv != NULL) && (p == NULL);
146: nv = nv->l_next)
147: {
148: if(strcmp(nv->name, Name) == 0)
149: p = nv->value;
150: }
151: return p;
152: }
153:
154: #if 0
155: /* useless now that minixml ignores namespaces by itself */
156: char *
157: GetValueFromNameValueListIgnoreNS(struct NameValueParserData * pdata,
158: const char * Name)
159: {
160: struct NameValue * nv;
161: char * p = NULL;
162: char * pname;
163: for(nv = pdata->head.lh_first;
164: (nv != NULL) && (p == NULL);
165: nv = nv->entries.le_next)
166: {
167: pname = strrchr(nv->name, ':');
168: if(pname)
169: pname++;
170: else
171: pname = nv->name;
172: if(strcmp(pname, Name)==0)
173: p = nv->value;
174: }
175: return p;
176: }
177: #endif
178:
179: /* debug all-in-one function
180: * do parsing then display to stdout */
181: #ifdef DEBUG
182: void
183: DisplayNameValueList(char * buffer, int bufsize)
184: {
185: struct NameValueParserData pdata;
186: struct NameValue * nv;
187: ParseNameValue(buffer, bufsize, &pdata);
188: for(nv = pdata.l_head;
189: nv != NULL;
190: nv = nv->l_next)
191: {
192: printf("%s = %s\n", nv->name, nv->value);
193: }
194: ClearNameValueList(&pdata);
195: }
196: #endif /* DEBUG */
197:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>