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