Annotation of embedaddon/miniupnpd/miniupnpc-async/upnpreplyparse.c, revision 1.1
1.1 ! misho 1: /* $Id: upnpreplyparse.c,v 1.20 2017/12/12 11:26:25 nanard Exp $ */
! 2: /* vim: tabstop=4 shiftwidth=4 noexpandtab
! 3: * MiniUPnP project
! 4: * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
! 5: * (c) 2006-2019 Thomas Bernard
! 6: * This software is subject to the conditions detailed
! 7: * in the LICENCE file provided within the distribution */
! 8:
! 9: #include <stdlib.h>
! 10: #include <string.h>
! 11: #include <stdio.h>
! 12:
! 13: #include "upnpreplyparse.h"
! 14: #include "minixml.h"
! 15:
! 16: static void
! 17: NameValueParserStartElt(void * d, const char * name, int l)
! 18: {
! 19: struct NameValueParserData * data = (struct NameValueParserData *)d;
! 20: data->topelt = 1;
! 21: if(l>63)
! 22: l = 63;
! 23: memcpy(data->curelt, name, l);
! 24: data->curelt[l] = '\0';
! 25: data->cdata = NULL;
! 26: data->cdatalen = 0;
! 27: }
! 28:
! 29: static void
! 30: NameValueParserEndElt(void * d, const char * name, int namelen)
! 31: {
! 32: struct NameValueParserData * data = (struct NameValueParserData *)d;
! 33: struct NameValue * nv;
! 34: (void)name;
! 35: (void)namelen;
! 36: if(!data->topelt)
! 37: return;
! 38: if(strcmp(data->curelt, "NewPortListing") != 0)
! 39: {
! 40: int l;
! 41: /* standard case. Limited to n chars strings */
! 42: l = data->cdatalen;
! 43: nv = malloc(sizeof(struct NameValue));
! 44: if(nv == NULL)
! 45: {
! 46: /* malloc error */
! 47: #ifdef DEBUG
! 48: fprintf(stderr, "%s: error allocating memory",
! 49: "NameValueParserEndElt");
! 50: #endif /* DEBUG */
! 51: return;
! 52: }
! 53: if(l>=(int)sizeof(nv->value))
! 54: l = sizeof(nv->value) - 1;
! 55: strncpy(nv->name, data->curelt, 64);
! 56: nv->name[63] = '\0';
! 57: if(data->cdata != NULL)
! 58: {
! 59: memcpy(nv->value, data->cdata, l);
! 60: nv->value[l] = '\0';
! 61: }
! 62: else
! 63: {
! 64: nv->value[0] = '\0';
! 65: }
! 66: nv->l_next = data->l_head; /* insert in list */
! 67: data->l_head = nv;
! 68: }
! 69: data->cdata = NULL;
! 70: data->cdatalen = 0;
! 71: data->topelt = 0;
! 72: }
! 73:
! 74: static void
! 75: NameValueParserGetData(void * d, const char * datas, int l)
! 76: {
! 77: struct NameValueParserData * data = (struct NameValueParserData *)d;
! 78: if(strcmp(data->curelt, "NewPortListing") == 0)
! 79: {
! 80: /* specific case for NewPortListing which is a XML Document */
! 81: free(data->portListing);
! 82: data->portListing = malloc(l + 1);
! 83: if(!data->portListing)
! 84: {
! 85: /* malloc error */
! 86: #ifdef DEBUG
! 87: fprintf(stderr, "%s: error allocating memory",
! 88: "NameValueParserGetData");
! 89: #endif /* DEBUG */
! 90: return;
! 91: }
! 92: memcpy(data->portListing, datas, l);
! 93: data->portListing[l] = '\0';
! 94: data->portListingLength = l;
! 95: }
! 96: else
! 97: {
! 98: /* standard case. */
! 99: data->cdata = datas;
! 100: data->cdatalen = l;
! 101: }
! 102: }
! 103:
! 104: void
! 105: ParseNameValue(const char * buffer, int bufsize,
! 106: struct NameValueParserData * data)
! 107: {
! 108: struct xmlparser parser;
! 109: memset(data, 0, sizeof(struct NameValueParserData));
! 110: /* init xmlparser object */
! 111: parser.xmlstart = buffer;
! 112: parser.xmlsize = bufsize;
! 113: parser.data = data;
! 114: parser.starteltfunc = NameValueParserStartElt;
! 115: parser.endeltfunc = NameValueParserEndElt;
! 116: parser.datafunc = NameValueParserGetData;
! 117: parser.attfunc = 0;
! 118: parsexml(&parser);
! 119: }
! 120:
! 121: void
! 122: ClearNameValueList(struct NameValueParserData * pdata)
! 123: {
! 124: struct NameValue * nv;
! 125: if(pdata->portListing)
! 126: {
! 127: free(pdata->portListing);
! 128: pdata->portListing = NULL;
! 129: pdata->portListingLength = 0;
! 130: }
! 131: while((nv = pdata->l_head) != NULL)
! 132: {
! 133: pdata->l_head = nv->l_next;
! 134: free(nv);
! 135: }
! 136: }
! 137:
! 138: char *
! 139: GetValueFromNameValueList(struct NameValueParserData * pdata,
! 140: const char * Name)
! 141: {
! 142: struct NameValue * nv;
! 143: char * p = NULL;
! 144: for(nv = pdata->l_head;
! 145: (nv != NULL) && (p == NULL);
! 146: nv = nv->l_next)
! 147: {
! 148: if(strcmp(nv->name, Name) == 0)
! 149: p = nv->value;
! 150: }
! 151: return p;
! 152: }
! 153:
! 154: #if 0
! 155: /* useless now that minixml ignores namespaces by itself */
! 156: char *
! 157: GetValueFromNameValueListIgnoreNS(struct NameValueParserData * pdata,
! 158: const char * Name)
! 159: {
! 160: struct NameValue * nv;
! 161: char * p = NULL;
! 162: char * pname;
! 163: for(nv = pdata->head.lh_first;
! 164: (nv != NULL) && (p == NULL);
! 165: nv = nv->entries.le_next)
! 166: {
! 167: pname = strrchr(nv->name, ':');
! 168: if(pname)
! 169: pname++;
! 170: else
! 171: pname = nv->name;
! 172: if(strcmp(pname, Name)==0)
! 173: p = nv->value;
! 174: }
! 175: return p;
! 176: }
! 177: #endif
! 178:
! 179: /* debug all-in-one function
! 180: * do parsing then display to stdout */
! 181: #ifdef DEBUG
! 182: void
! 183: DisplayNameValueList(char * buffer, int bufsize)
! 184: {
! 185: struct NameValueParserData pdata;
! 186: struct NameValue * nv;
! 187: ParseNameValue(buffer, bufsize, &pdata);
! 188: for(nv = pdata.l_head;
! 189: nv != NULL;
! 190: nv = nv->l_next)
! 191: {
! 192: printf("%s = %s\n", nv->name, nv->value);
! 193: }
! 194: ClearNameValueList(&pdata);
! 195: }
! 196: #endif /* DEBUG */
! 197:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>