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>