|
|
| version 1.1, 2012/02/21 23:16:02 | version 1.1.1.2, 2012/05/29 12:55:57 |
|---|---|
| Line 1 | Line 1 |
| /* $Id$ */ | /* $Id$ */ |
| /* MiniUPnP project | /* MiniUPnP project |
| * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ | * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ |
| * (c) 2006 Thomas Bernard | * (c) 2006-2011 Thomas Bernard |
| * This software is subject to the conditions detailed | * This software is subject to the conditions detailed |
| * in the LICENCE file provided within the distribution */ | * in the LICENCE file provided within the distribution */ |
| Line 27 NameValueParserGetData(void * d, const char * datas, i | Line 27 NameValueParserGetData(void * d, const char * datas, i |
| { | { |
| struct NameValueParserData * data = (struct NameValueParserData *)d; | struct NameValueParserData * data = (struct NameValueParserData *)d; |
| struct NameValue * nv; | struct NameValue * nv; |
| nv = malloc(sizeof(struct NameValue)); | if(strcmp(data->curelt, "NewPortListing") == 0) |
| if(l>63) | { |
| l = 63; | /* specific case for NewPortListing which is a XML Document */ |
| strncpy(nv->name, data->curelt, 64); | data->portListing = malloc(l + 1); |
| nv->name[63] = '\0'; | if(!data->portListing) |
| memcpy(nv->value, datas, l); | { |
| nv->value[l] = '\0'; | /* malloc error */ |
| LIST_INSERT_HEAD( &(data->head), nv, entries); | return; |
| } | |
| memcpy(data->portListing, datas, l); | |
| data->portListing[l] = '\0'; | |
| data->portListingLength = l; | |
| } | |
| else | |
| { | |
| /* standard case. Limited to 63 chars strings */ | |
| nv = malloc(sizeof(struct NameValue)); | |
| if(l>63) | |
| l = 63; | |
| strncpy(nv->name, data->curelt, 64); | |
| nv->name[63] = '\0'; | |
| memcpy(nv->value, datas, l); | |
| nv->value[l] = '\0'; | |
| LIST_INSERT_HEAD( &(data->head), nv, entries); | |
| } | |
| } | } |
| void | void |
| ParseNameValue(const char * buffer, int bufsize, | ParseNameValue(const char * buffer, int bufsize, |
| struct NameValueParserData * data) | struct NameValueParserData * data) |
| { | { |
| struct xmlparser parser; | struct xmlparser parser; |
| LIST_INIT(&(data->head)); | LIST_INIT(&(data->head)); |
| data->portListing = NULL; | |
| data->portListingLength = 0; | |
| /* init xmlparser object */ | /* init xmlparser object */ |
| parser.xmlstart = buffer; | parser.xmlstart = buffer; |
| parser.xmlsize = bufsize; | parser.xmlsize = bufsize; |
| Line 58 void | Line 77 void |
| ClearNameValueList(struct NameValueParserData * pdata) | ClearNameValueList(struct NameValueParserData * pdata) |
| { | { |
| struct NameValue * nv; | struct NameValue * nv; |
| if(pdata->portListing) | |
| { | |
| free(pdata->portListing); | |
| pdata->portListing = NULL; | |
| pdata->portListingLength = 0; | |
| } | |
| while((nv = pdata->head.lh_first) != NULL) | while((nv = pdata->head.lh_first) != NULL) |
| { | { |
| LIST_REMOVE(nv, entries); | LIST_REMOVE(nv, entries); |