Update upnpreplyparse.c to take into account "empty" elements
This commit is contained in:
parent
4cd6295119
commit
0f401fe2d5
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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() */
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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() */
|
||||||
|
|
Loading…
Reference in New Issue