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>