Annotation of embedaddon/miniupnpc/src/testigddescparse.c, revision 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>