Update upnpreplyparse.c to take into account "empty" elements

This commit is contained in:
Thomas Bernard 2013-05-14 23:05:08 +02:00
parent 4cd6295119
commit 0f401fe2d5
6 changed files with 106 additions and 32 deletions

View File

@ -1,6 +1,9 @@
$Id: Changelog.txt,v 1.186 2013/05/14 20:37:35 nanard Exp $ $Id: Changelog.txt,v 1.186 2013/05/14 20:37:35 nanard Exp $
miniUPnP client Changelog. miniUPnP client Changelog.
2013/05/14:
Update upnpreplyparse to take into account "empty" elements
2013/05/03: 2013/05/03:
Fix Solaris build thanks to Maciej Małecki Fix Solaris build thanks to Maciej Małecki

View File

@ -1,7 +1,7 @@
/* $Id: upnpreplyparse.c,v 1.11 2011/02/07 16:17:06 nanard Exp $ */ /* $Id: upnpreplyparse.c,v 1.14 2013/05/14 19:53:54 nanard Exp $ */
/* MiniUPnP project /* MiniUPnP project
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
* (c) 2006-2011 Thomas Bernard * (c) 2006-2013 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 */
@ -16,17 +16,54 @@ static void
NameValueParserStartElt(void * d, const char * name, int l) NameValueParserStartElt(void * d, const char * name, int l)
{ {
struct NameValueParserData * data = (struct NameValueParserData *)d; struct NameValueParserData * data = (struct NameValueParserData *)d;
data->topelt = 1;
if(l>63) if(l>63)
l = 63; l = 63;
memcpy(data->curelt, name, l); memcpy(data->curelt, name, l);
data->curelt[l] = '\0'; data->curelt[l] = '\0';
data->cdata = NULL;
data->cdatalen = 0;
}
static void
NameValueParserEndElt(void * d, const char * name, int l)
{
struct NameValueParserData * data = (struct NameValueParserData *)d;
struct NameValue * nv;
(void)name;
(void)l;
if(!data->topelt)
return;
if(strcmp(data->curelt, "NewPortListing") != 0)
{
int l;
/* standard case. Limited to 63 chars strings */
l = data->cdatalen;
nv = malloc(sizeof(struct NameValue));
if(l>63)
l = 63;
strncpy(nv->name, data->curelt, 64);
nv->name[63] = '\0';
if(data->cdata != NULL)
{
memcpy(nv->value, data->cdata, l);
nv->value[l] = '\0';
}
else
{
nv->value[0] = '\0';
}
LIST_INSERT_HEAD( &(data->head), nv, entries);
}
data->cdata = NULL;
data->cdatalen = 0;
data->topelt = 0;
} }
static void static void
NameValueParserGetData(void * d, const char * datas, int l) NameValueParserGetData(void * d, const char * datas, int l)
{ {
struct NameValueParserData * data = (struct NameValueParserData *)d; struct NameValueParserData * data = (struct NameValueParserData *)d;
struct NameValue * nv;
if(strcmp(data->curelt, "NewPortListing") == 0) if(strcmp(data->curelt, "NewPortListing") == 0)
{ {
/* specific case for NewPortListing which is a XML Document */ /* specific case for NewPortListing which is a XML Document */
@ -42,15 +79,9 @@ NameValueParserGetData(void * d, const char * datas, int l)
} }
else else
{ {
/* standard case. Limited to 63 chars strings */ /* standard case. */
nv = malloc(sizeof(struct NameValue)); data->cdata = datas;
if(l>63) data->cdatalen = l;
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);
} }
} }
@ -67,7 +98,7 @@ ParseNameValue(const char * buffer, int bufsize,
parser.xmlsize = bufsize; parser.xmlsize = bufsize;
parser.data = data; parser.data = data;
parser.starteltfunc = NameValueParserStartElt; parser.starteltfunc = NameValueParserStartElt;
parser.endeltfunc = 0; parser.endeltfunc = NameValueParserEndElt;
parser.datafunc = NameValueParserGetData; parser.datafunc = NameValueParserGetData;
parser.attfunc = 0; parser.attfunc = 0;
parsexml(&parser); parsexml(&parser);

View File

@ -1,7 +1,7 @@
/* $Id: upnpreplyparse.h,v 1.12 2012/01/21 13:30:33 nanard Exp $ */ /* $Id: upnpreplyparse.h,v 1.16 2013/05/14 20:37:13 nanard Exp $ */
/* MiniUPnP project /* MiniUPnP project
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
* (c) 2006-2012 Thomas Bernard * (c) 2006-2013 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 */
@ -29,6 +29,9 @@ struct NameValueParserData {
char curelt[64]; char curelt[64];
char * portListing; char * portListing;
int portListingLength; int portListingLength;
int topelt;
const char * cdata;
int cdatalen;
}; };
/* ParseNameValue() */ /* ParseNameValue() */

View File

@ -1,5 +1,8 @@
$Id: Changelog.txt,v 1.338 2013/05/03 09:30:32 nanard Exp $ $Id: Changelog.txt,v 1.338 2013/05/03 09:30:32 nanard Exp $
2013/05/14:
Update upnpreplyparse to take into account "empty" elements
2013/05/03: 2013/05/03:
Use pkg-config under linux to find libiptc. Thanks to Olivier Langlois Use pkg-config under linux to find libiptc. Thanks to Olivier Langlois

View File

@ -1,7 +1,7 @@
/* $Id: upnpreplyparse.c,v 1.11 2011/02/07 16:17:06 nanard Exp $ */ /* $Id: upnpreplyparse.c,v 1.14 2013/05/14 19:53:54 nanard Exp $ */
/* MiniUPnP project /* MiniUPnP project
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
* (c) 2006-2011 Thomas Bernard * (c) 2006-2013 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 */
@ -16,17 +16,54 @@ static void
NameValueParserStartElt(void * d, const char * name, int l) NameValueParserStartElt(void * d, const char * name, int l)
{ {
struct NameValueParserData * data = (struct NameValueParserData *)d; struct NameValueParserData * data = (struct NameValueParserData *)d;
data->topelt = 1;
if(l>63) if(l>63)
l = 63; l = 63;
memcpy(data->curelt, name, l); memcpy(data->curelt, name, l);
data->curelt[l] = '\0'; data->curelt[l] = '\0';
data->cdata = NULL;
data->cdatalen = 0;
}
static void
NameValueParserEndElt(void * d, const char * name, int l)
{
struct NameValueParserData * data = (struct NameValueParserData *)d;
struct NameValue * nv;
(void)name;
(void)l;
if(!data->topelt)
return;
if(strcmp(data->curelt, "NewPortListing") != 0)
{
int l;
/* standard case. Limited to 63 chars strings */
l = data->cdatalen;
nv = malloc(sizeof(struct NameValue));
if(l>63)
l = 63;
strncpy(nv->name, data->curelt, 64);
nv->name[63] = '\0';
if(data->cdata != NULL)
{
memcpy(nv->value, data->cdata, l);
nv->value[l] = '\0';
}
else
{
nv->value[0] = '\0';
}
LIST_INSERT_HEAD( &(data->head), nv, entries);
}
data->cdata = NULL;
data->cdatalen = 0;
data->topelt = 0;
} }
static void static void
NameValueParserGetData(void * d, const char * datas, int l) NameValueParserGetData(void * d, const char * datas, int l)
{ {
struct NameValueParserData * data = (struct NameValueParserData *)d; struct NameValueParserData * data = (struct NameValueParserData *)d;
struct NameValue * nv;
if(strcmp(data->curelt, "NewPortListing") == 0) if(strcmp(data->curelt, "NewPortListing") == 0)
{ {
/* specific case for NewPortListing which is a XML Document */ /* specific case for NewPortListing which is a XML Document */
@ -42,15 +79,9 @@ NameValueParserGetData(void * d, const char * datas, int l)
} }
else else
{ {
/* standard case. Limited to 63 chars strings */ /* standard case. */
nv = malloc(sizeof(struct NameValue)); data->cdata = datas;
if(l>63) data->cdatalen = l;
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);
} }
} }
@ -67,7 +98,7 @@ ParseNameValue(const char * buffer, int bufsize,
parser.xmlsize = bufsize; parser.xmlsize = bufsize;
parser.data = data; parser.data = data;
parser.starteltfunc = NameValueParserStartElt; parser.starteltfunc = NameValueParserStartElt;
parser.endeltfunc = 0; parser.endeltfunc = NameValueParserEndElt;
parser.datafunc = NameValueParserGetData; parser.datafunc = NameValueParserGetData;
parser.attfunc = 0; parser.attfunc = 0;
parsexml(&parser); parsexml(&parser);

View File

@ -1,7 +1,7 @@
/* $Id: upnpreplyparse.h,v 1.12 2012/01/21 13:30:33 nanard Exp $ */ /* $Id: upnpreplyparse.h,v 1.16 2013/05/14 20:37:13 nanard Exp $ */
/* MiniUPnP project /* MiniUPnP project
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
* (c) 2006-2012 Thomas Bernard * (c) 2006-2013 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 */
@ -29,6 +29,9 @@ struct NameValueParserData {
char curelt[64]; char curelt[64];
char * portListing; char * portListing;
int portListingLength; int portListingLength;
int topelt;
const char * cdata;
int cdatalen;
}; };
/* ParseNameValue() */ /* ParseNameValue() */