Annotation of embedaddon/miniupnpd/miniupnpc-async/igd_desc_parse.c, revision 1.1.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>