Annotation of embedaddon/miniupnpc/src/testigddescparse.c, revision 1.1.1.1
1.1 misho 1: /* $Id: testigddescparse.c,v 1.11 2019/02/10 12:33:32 nanard Exp $ */
2: /* Project : miniupnp
3: * http://miniupnp.free.fr/
4: * Author : Thomas Bernard
5: * Copyright (c) 2008-2015 Thomas Bernard
6: * This software is subject to the conditions detailed in the
7: * LICENCE file provided in this distribution.
8: * */
9: #include <stdio.h>
10: #include <stdlib.h>
11: #include <string.h>
12: #include "igd_desc_parse.h"
13: #include "minixml.h"
14: #include "miniupnpc.h"
15:
16: /* count number of differences */
17: int compare_service(struct IGDdatas_service * s, FILE * f)
18: {
19: int n = 0;
20: char line[1024];
21:
22: while(fgets(line, sizeof(line), f)) {
23: char * value;
24: char * equal;
25: char * name;
26: char * parsedvalue;
27: int l;
28: l = strlen(line);
29: while((l > 0) && ((line[l-1] == '\r') || (line[l-1] == '\n') || (line[l-1] == ' ')))
30: line[--l] = '\0';
31: if(l == 0)
32: break; /* end on blank line */
33: if(line[0] == '#')
34: continue; /* skip comments */
35: equal = strchr(line, '=');
36: if(equal == NULL) {
37: fprintf(stderr, "Warning, line does not contain '=' : %s\n", line);
38: continue;
39: }
40: *equal = '\0';
41: name = line;
42: while(*name == ' ' || *name == '\t')
43: name++;
44: l = strlen(name);
45: while((l > 0) && (name[l-1] == ' ' || name[l-1] == '\t'))
46: name[--l] = '\0';
47: value = equal + 1;
48: while(*value == ' ' || *value == '\t')
49: value++;
50: if(strcmp(name, "controlurl") == 0)
51: parsedvalue = s->controlurl;
52: else if(strcmp(name, "eventsuburl") == 0)
53: parsedvalue = s->eventsuburl;
54: else if(strcmp(name, "scpdurl") == 0)
55: parsedvalue = s->scpdurl;
56: else if(strcmp(name, "servicetype") == 0)
57: parsedvalue = s->servicetype;
58: else {
59: fprintf(stderr, "unknown field '%s'\n", name);
60: continue;
61: }
62: if(0 != strcmp(parsedvalue, value)) {
63: fprintf(stderr, "difference : '%s' != '%s'\n", parsedvalue, value);
64: n++;
65: }
66: }
67: return n;
68: }
69:
70: int compare_igd(struct IGDdatas * p, FILE * f)
71: {
72: int n = 0;
73: char line[1024];
74: struct IGDdatas_service * s;
75:
76: while(fgets(line, sizeof(line), f)) {
77: char * colon;
78: int l = (int)strlen(line);
79: while((l > 0) && (line[l-1] == '\r' || (line[l-1] == '\n')))
80: line[--l] = '\0';
81: if(l == 0 || line[0] == '#')
82: continue; /* skip blank lines and comments */
83: colon = strchr(line, ':');
84: if(colon == NULL) {
85: fprintf(stderr, "Warning, no ':' : %s\n", line);
86: continue;
87: }
88: s = NULL;
89: *colon = '\0';
90: if(strcmp(line, "CIF") == 0)
91: s = &p->CIF;
92: else if(strcmp(line, "first") == 0)
93: s = &p->first;
94: else if(strcmp(line, "second") == 0)
95: s = &p->second;
96: else if(strcmp(line, "IPv6FC") == 0)
97: s = &p->IPv6FC;
98: else {
99: s = NULL;
100: fprintf(stderr, "*** unknown service '%s' ***\n", line);
101: n++;
102: continue;
103: }
104: n += compare_service(s, f);
105: }
106: if(n > 0)
107: fprintf(stderr, "*** %d difference%s ***\n", n, (n > 1) ? "s" : "");
108: return n;
109: }
110:
111: int test_igd_desc_parse(char * buffer, int len, FILE * f)
112: {
113: int n;
114: struct IGDdatas igd;
115: struct xmlparser parser;
116: struct UPNPUrls urls;
117:
118: memset(&igd, 0, sizeof(struct IGDdatas));
119: memset(&parser, 0, sizeof(struct xmlparser));
120: parser.xmlstart = buffer;
121: parser.xmlsize = len;
122: parser.data = &igd;
123: parser.starteltfunc = IGDstartelt;
124: parser.endeltfunc = IGDendelt;
125: parser.datafunc = IGDdata;
126: parsexml(&parser);
127: #ifdef DEBUG
128: printIGD(&igd);
129: #endif /* DEBUG */
130: GetUPNPUrls(&urls, &igd, "http://fake/desc/url/file.xml", 0);
131: printf("ipcondescURL='%s'\n", urls.ipcondescURL);
132: printf("controlURL='%s'\n", urls.controlURL);
133: printf("controlURL_CIF='%s'\n", urls.controlURL_CIF);
134: n = f ? compare_igd(&igd, f) : 0;
135: FreeUPNPUrls(&urls);
136: return n;
137: }
138:
139: int main(int argc, char * * argv)
140: {
141: FILE * f;
142: char * buffer;
143: int len;
144: int r;
145: if(argc<2) {
146: fprintf(stderr, "Usage: %s file.xml [file.values]\n", argv[0]);
147: return 1;
148: }
149: f = fopen(argv[1], "rb");
150: if(!f) {
151: fprintf(stderr, "Cannot open %s for reading.\n", argv[1]);
152: return 1;
153: }
154: fseek(f, 0, SEEK_END);
155: len = ftell(f);
156: fseek(f, 0, SEEK_SET);
157: buffer = malloc(len);
158: if(!buffer) {
159: fprintf(stderr, "Memory allocation error.\n");
160: fclose(f);
161: return 1;
162: }
163: r = (int)fread(buffer, 1, len, f);
164: if(r != len) {
165: fprintf(stderr, "Failed to read file %s. %d out of %d bytes.\n",
166: argv[1], r, len);
167: fclose(f);
168: free(buffer);
169: return 1;
170: }
171: fclose(f);
172: f = NULL;
173: if(argc > 2) {
174: f = fopen(argv[2], "rb");
175: if(!f) {
176: fprintf(stderr, "Cannot open %s for reading.\n", argv[2]);
177: free(buffer);
178: return 1;
179: }
180: }
181: r = test_igd_desc_parse(buffer, len, f);
182: free(buffer);
183: if(f)
184: fclose(f);
185: return r;
186: }
187:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>