Annotation of embedaddon/miniupnpd/miniupnpc-async/igd_desc_parse.c, revision 1.1

1.1     ! misho       1: /* $Id: igd_desc_parse.c,v 1.17 2015/09/15 13:30:04 nanard Exp $ */
        !             2: /* Project : miniupnp
        !             3:  * http://miniupnp.free.fr/
        !             4:  * Author : Thomas Bernard
        !             5:  * Copyright (c) 2005-2015 Thomas Bernard
        !             6:  * This software is subject to the conditions detailed in the
        !             7:  * LICENCE file provided in this distribution. */
        !             8: 
        !             9: #include "igd_desc_parse.h"
        !            10: #include <stdio.h>
        !            11: #include <string.h>
        !            12: 
        !            13: /* Start element handler :
        !            14:  * update nesting level counter and copy element name */
        !            15: void IGDstartelt(void * d, const char * name, int l)
        !            16: {
        !            17:        struct IGDdatas * datas = (struct IGDdatas *)d;
        !            18:        if(l >= MINIUPNPC_URL_MAXSIZE)
        !            19:                l = MINIUPNPC_URL_MAXSIZE-1;
        !            20:        memcpy(datas->cureltname, name, l);
        !            21:        datas->cureltname[l] = '\0';
        !            22:        datas->level++;
        !            23:        if( (l==7) && !memcmp(name, "service", l) ) {
        !            24:                datas->tmp.controlurl[0] = '\0';
        !            25:                datas->tmp.eventsuburl[0] = '\0';
        !            26:                datas->tmp.scpdurl[0] = '\0';
        !            27:                datas->tmp.servicetype[0] = '\0';
        !            28:        }
        !            29: }
        !            30: 
        !            31: #define COMPARE(str, cstr) (0==memcmp(str, cstr, sizeof(cstr) - 1))
        !            32: 
        !            33: /* End element handler :
        !            34:  * update nesting level counter and update parser state if
        !            35:  * service element is parsed */
        !            36: void IGDendelt(void * d, const char * name, int l)
        !            37: {
        !            38:        struct IGDdatas * datas = (struct IGDdatas *)d;
        !            39:        datas->level--;
        !            40:        /*printf("endelt %2d %.*s\n", datas->level, l, name);*/
        !            41:        if( (l==7) && !memcmp(name, "service", l) )
        !            42:        {
        !            43:                if(COMPARE(datas->tmp.servicetype,
        !            44:                           "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:")) {
        !            45:                        memcpy(&datas->CIF, &datas->tmp, sizeof(struct IGDdatas_service));
        !            46:                } else if(COMPARE(datas->tmp.servicetype,
        !            47:                                        "urn:schemas-upnp-org:service:WANIPv6FirewallControl:")) {
        !            48:                        memcpy(&datas->IPv6FC, &datas->tmp, sizeof(struct IGDdatas_service));
        !            49:                } else if(COMPARE(datas->tmp.servicetype,
        !            50:                                  "urn:schemas-upnp-org:service:WANIPConnection:")
        !            51:                         || COMPARE(datas->tmp.servicetype,
        !            52:                                    "urn:schemas-upnp-org:service:WANPPPConnection:") ) {
        !            53:                        if(datas->first.servicetype[0] == '\0') {
        !            54:                                memcpy(&datas->first, &datas->tmp, sizeof(struct IGDdatas_service));
        !            55:                        } else {
        !            56:                                memcpy(&datas->second, &datas->tmp, sizeof(struct IGDdatas_service));
        !            57:                        }
        !            58:                }
        !            59:        }
        !            60: }
        !            61: 
        !            62: /* Data handler :
        !            63:  * copy data depending on the current element name and state */
        !            64: void IGDdata(void * d, const char * data, int l)
        !            65: {
        !            66:        struct IGDdatas * datas = (struct IGDdatas *)d;
        !            67:        char * dstmember = 0;
        !            68:        /*printf("%2d %s : %.*s\n",
        !            69:            datas->level, datas->cureltname, l, data);  */
        !            70:        if( !strcmp(datas->cureltname, "URLBase") )
        !            71:                dstmember = datas->urlbase;
        !            72:        else if( !strcmp(datas->cureltname, "presentationURL") )
        !            73:                dstmember = datas->presentationurl;
        !            74:        else if( !strcmp(datas->cureltname, "serviceType") )
        !            75:                dstmember = datas->tmp.servicetype;
        !            76:        else if( !strcmp(datas->cureltname, "controlURL") )
        !            77:                dstmember = datas->tmp.controlurl;
        !            78:        else if( !strcmp(datas->cureltname, "eventSubURL") )
        !            79:                dstmember = datas->tmp.eventsuburl;
        !            80:        else if( !strcmp(datas->cureltname, "SCPDURL") )
        !            81:                dstmember = datas->tmp.scpdurl;
        !            82: /*     else if( !strcmp(datas->cureltname, "deviceType") )
        !            83:                dstmember = datas->devicetype_tmp;*/
        !            84:        if(dstmember)
        !            85:        {
        !            86:                if(l>=MINIUPNPC_URL_MAXSIZE)
        !            87:                        l = MINIUPNPC_URL_MAXSIZE-1;
        !            88:                memcpy(dstmember, data, l);
        !            89:                dstmember[l] = '\0';
        !            90:        }
        !            91: }
        !            92: 
        !            93: #ifdef DEBUG
        !            94: void printIGD(struct IGDdatas * d)
        !            95: {
        !            96:        printf("urlbase = '%s'\n", d->urlbase);
        !            97:        printf("WAN Device (Common interface config) :\n");
        !            98:        /*printf(" deviceType = '%s'\n", d->CIF.devicetype);*/
        !            99:        printf(" serviceType = '%s'\n", d->CIF.servicetype);
        !           100:        printf(" controlURL = '%s'\n", d->CIF.controlurl);
        !           101:        printf(" eventSubURL = '%s'\n", d->CIF.eventsuburl);
        !           102:        printf(" SCPDURL = '%s'\n", d->CIF.scpdurl);
        !           103:        printf("primary WAN Connection Device (IP or PPP Connection):\n");
        !           104:        /*printf(" deviceType = '%s'\n", d->first.devicetype);*/
        !           105:        printf(" servicetype = '%s'\n", d->first.servicetype);
        !           106:        printf(" controlURL = '%s'\n", d->first.controlurl);
        !           107:        printf(" eventSubURL = '%s'\n", d->first.eventsuburl);
        !           108:        printf(" SCPDURL = '%s'\n", d->first.scpdurl);
        !           109:        printf("secondary WAN Connection Device (IP or PPP Connection):\n");
        !           110:        /*printf(" deviceType = '%s'\n", d->second.devicetype);*/
        !           111:        printf(" servicetype = '%s'\n", d->second.servicetype);
        !           112:        printf(" controlURL = '%s'\n", d->second.controlurl);
        !           113:        printf(" eventSubURL = '%s'\n", d->second.eventsuburl);
        !           114:        printf(" SCPDURL = '%s'\n", d->second.scpdurl);
        !           115:        printf("WAN IPv6 Firewall Control :\n");
        !           116:        /*printf(" deviceType = '%s'\n", d->IPv6FC.devicetype);*/
        !           117:        printf(" servicetype = '%s'\n", d->IPv6FC.servicetype);
        !           118:        printf(" controlURL = '%s'\n", d->IPv6FC.controlurl);
        !           119:        printf(" eventSubURL = '%s'\n", d->IPv6FC.eventsuburl);
        !           120:        printf(" SCPDURL = '%s'\n", d->IPv6FC.scpdurl);
        !           121: }
        !           122: #endif /* DEBUG */
        !           123: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>