version 1.1.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); |