Annotation of embedaddon/miniupnpc/portlistingparse.c, revision 1.1

1.1     ! misho       1: /* $Id: portlistingparse.c,v 1.4 2011/03/18 11:02:17 nanard Exp $ */
        !             2: /* MiniUPnP project
        !             3:  * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
        !             4:  * (c) 2011 Thomas Bernard 
        !             5:  * This software is subject to the conditions detailed
        !             6:  * in the LICENCE file provided within the distribution */
        !             7: #include <string.h>
        !             8: #include <stdlib.h>
        !             9: #include "portlistingparse.h"
        !            10: #include "minixml.h"
        !            11: 
        !            12: /* list of the elements */
        !            13: static const struct {
        !            14:        const portMappingElt code;
        !            15:        const char * const str;
        !            16: } elements[] = {
        !            17:        { PortMappingEntry, "PortMappingEntry"},
        !            18:        { NewRemoteHost, "NewRemoteHost"},
        !            19:        { NewExternalPort, "NewExternalPort"},
        !            20:        { NewProtocol, "NewProtocol"},
        !            21:        { NewInternalPort, "NewInternalPort"},
        !            22:        { NewInternalClient, "NewInternalClient"},
        !            23:        { NewEnabled, "NewEnabled"},
        !            24:        { NewDescription, "NewDescription"},
        !            25:        { NewLeaseTime, "NewLeaseTime"},
        !            26:        { PortMappingEltNone, NULL}
        !            27: };
        !            28: 
        !            29: /* Helper function */
        !            30: static UNSIGNED_INTEGER
        !            31: atoui(const char * p, int l)
        !            32: {
        !            33:        UNSIGNED_INTEGER r = 0;
        !            34:        while(l > 0 && *p)
        !            35:        {
        !            36:                if(*p >= '0' && *p <= '9')
        !            37:                        r = r*10 + (*p - '0');
        !            38:                else
        !            39:                        break;
        !            40:                p++;
        !            41:                l--;
        !            42:        }
        !            43:        return r;
        !            44: }
        !            45: 
        !            46: /* Start element handler */
        !            47: static void
        !            48: startelt(void * d, const char * name, int l)
        !            49: {
        !            50:        int i;
        !            51:        struct PortMappingParserData * pdata = (struct PortMappingParserData *)d;
        !            52:        pdata->curelt = PortMappingEltNone;
        !            53:        for(i = 0; elements[i].str; i++)
        !            54:        {
        !            55:                if(memcmp(name, elements[i].str, l) == 0)
        !            56:                {
        !            57:                        pdata->curelt = elements[i].code;
        !            58:                        break;
        !            59:                }
        !            60:        }
        !            61:        if(pdata->curelt == PortMappingEntry)
        !            62:        {
        !            63:                struct PortMapping * pm;
        !            64:                pm = calloc(1, sizeof(struct PortMapping));
        !            65:                LIST_INSERT_HEAD( &(pdata->head), pm, entries);
        !            66:        }
        !            67: }
        !            68: 
        !            69: /* End element handler */
        !            70: static void
        !            71: endelt(void * d, const char * name, int l)
        !            72: {
        !            73:        struct PortMappingParserData * pdata = (struct PortMappingParserData *)d;
        !            74:        pdata->curelt = PortMappingEltNone;
        !            75: }
        !            76: 
        !            77: /* Data handler */
        !            78: static void
        !            79: data(void * d, const char * data, int l)
        !            80: {
        !            81:        struct PortMapping * pm;
        !            82:        struct PortMappingParserData * pdata = (struct PortMappingParserData *)d;
        !            83:        pm = pdata->head.lh_first;
        !            84:        if(!pm)
        !            85:                return;
        !            86:        if(l > 63)
        !            87:                l = 63;
        !            88:        switch(pdata->curelt)
        !            89:        {
        !            90:        case NewRemoteHost:
        !            91:                memcpy(pm->remoteHost, data, l);
        !            92:                pm->remoteHost[l] = '\0';
        !            93:                break;
        !            94:        case NewExternalPort:
        !            95:                pm->externalPort = (unsigned short)atoui(data, l);
        !            96:                break;
        !            97:        case NewProtocol:
        !            98:                if(l > 3)
        !            99:                        l = 3;
        !           100:                memcpy(pm->protocol, data, l);
        !           101:                pm->protocol[l] = '\0';
        !           102:                break;
        !           103:        case NewInternalPort:
        !           104:                pm->internalPort = (unsigned short)atoui(data, l);
        !           105:                break;
        !           106:        case NewInternalClient:
        !           107:                memcpy(pm->internalClient, data, l);
        !           108:                pm->internalClient[l] = '\0';
        !           109:                break;
        !           110:        case NewEnabled:
        !           111:                pm->enabled = (unsigned char)atoui(data, l);
        !           112:                break;
        !           113:        case NewDescription:
        !           114:                memcpy(pm->description, data, l);
        !           115:                pm->description[l] = '\0';
        !           116:                break;
        !           117:        case NewLeaseTime:
        !           118:                pm->leaseTime = atoui(data, l);
        !           119:                break;
        !           120:        default:
        !           121:                break;
        !           122:        }
        !           123: }
        !           124: 
        !           125: 
        !           126: /* Parse the PortMappingList XML document for IGD version 2
        !           127:  */
        !           128: void
        !           129: ParsePortListing(const char * buffer, int bufsize,
        !           130:                  struct PortMappingParserData * pdata)
        !           131: {
        !           132:        struct xmlparser parser;
        !           133: 
        !           134:        memset(pdata, 0, sizeof(struct PortMappingParserData));
        !           135:        LIST_INIT(&(pdata->head));
        !           136:        /* init xmlparser */
        !           137:        parser.xmlstart = buffer;
        !           138:        parser.xmlsize = bufsize;
        !           139:        parser.data = pdata;
        !           140:        parser.starteltfunc = startelt;
        !           141:        parser.endeltfunc = endelt;
        !           142:        parser.datafunc = data;
        !           143:        parser.attfunc = 0;
        !           144:        parsexml(&parser);
        !           145: }
        !           146: 
        !           147: void
        !           148: FreePortListing(struct PortMappingParserData * pdata)
        !           149: {
        !           150:        struct PortMapping * pm;
        !           151:        while((pm = pdata->head.lh_first) != NULL)
        !           152:        {
        !           153:                LIST_REMOVE(pm, entries);
        !           154:                free(pm);
        !           155:        }
        !           156: }
        !           157: 

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