Annotation of embedaddon/miniupnpd/miniupnpc-async/igd_desc_parse.c, revision 1.1
1.1 ! misho 1: /* $Id: igd_desc_parse.c,v 1.17 2015/09/15 13:30:04 nanard Exp $ */
! 2: /* Project : miniupnp
! 3: * http://miniupnp.free.fr/
! 4: * Author : Thomas Bernard
! 5: * Copyright (c) 2005-2015 Thomas Bernard
! 6: * This software is subject to the conditions detailed in the
! 7: * LICENCE file provided in this distribution. */
! 8:
! 9: #include "igd_desc_parse.h"
! 10: #include <stdio.h>
! 11: #include <string.h>
! 12:
! 13: /* Start element handler :
! 14: * update nesting level counter and copy element name */
! 15: void IGDstartelt(void * d, const char * name, int l)
! 16: {
! 17: struct IGDdatas * datas = (struct IGDdatas *)d;
! 18: if(l >= MINIUPNPC_URL_MAXSIZE)
! 19: l = MINIUPNPC_URL_MAXSIZE-1;
! 20: memcpy(datas->cureltname, name, l);
! 21: datas->cureltname[l] = '\0';
! 22: datas->level++;
! 23: if( (l==7) && !memcmp(name, "service", l) ) {
! 24: datas->tmp.controlurl[0] = '\0';
! 25: datas->tmp.eventsuburl[0] = '\0';
! 26: datas->tmp.scpdurl[0] = '\0';
! 27: datas->tmp.servicetype[0] = '\0';
! 28: }
! 29: }
! 30:
! 31: #define COMPARE(str, cstr) (0==memcmp(str, cstr, sizeof(cstr) - 1))
! 32:
! 33: /* End element handler :
! 34: * update nesting level counter and update parser state if
! 35: * service element is parsed */
! 36: void IGDendelt(void * d, const char * name, int l)
! 37: {
! 38: struct IGDdatas * datas = (struct IGDdatas *)d;
! 39: datas->level--;
! 40: /*printf("endelt %2d %.*s\n", datas->level, l, name);*/
! 41: if( (l==7) && !memcmp(name, "service", l) )
! 42: {
! 43: if(COMPARE(datas->tmp.servicetype,
! 44: "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:")) {
! 45: memcpy(&datas->CIF, &datas->tmp, sizeof(struct IGDdatas_service));
! 46: } else if(COMPARE(datas->tmp.servicetype,
! 47: "urn:schemas-upnp-org:service:WANIPv6FirewallControl:")) {
! 48: memcpy(&datas->IPv6FC, &datas->tmp, sizeof(struct IGDdatas_service));
! 49: } else if(COMPARE(datas->tmp.servicetype,
! 50: "urn:schemas-upnp-org:service:WANIPConnection:")
! 51: || COMPARE(datas->tmp.servicetype,
! 52: "urn:schemas-upnp-org:service:WANPPPConnection:") ) {
! 53: if(datas->first.servicetype[0] == '\0') {
! 54: memcpy(&datas->first, &datas->tmp, sizeof(struct IGDdatas_service));
! 55: } else {
! 56: memcpy(&datas->second, &datas->tmp, sizeof(struct IGDdatas_service));
! 57: }
! 58: }
! 59: }
! 60: }
! 61:
! 62: /* Data handler :
! 63: * copy data depending on the current element name and state */
! 64: void IGDdata(void * d, const char * data, int l)
! 65: {
! 66: struct IGDdatas * datas = (struct IGDdatas *)d;
! 67: char * dstmember = 0;
! 68: /*printf("%2d %s : %.*s\n",
! 69: datas->level, datas->cureltname, l, data); */
! 70: if( !strcmp(datas->cureltname, "URLBase") )
! 71: dstmember = datas->urlbase;
! 72: else if( !strcmp(datas->cureltname, "presentationURL") )
! 73: dstmember = datas->presentationurl;
! 74: else if( !strcmp(datas->cureltname, "serviceType") )
! 75: dstmember = datas->tmp.servicetype;
! 76: else if( !strcmp(datas->cureltname, "controlURL") )
! 77: dstmember = datas->tmp.controlurl;
! 78: else if( !strcmp(datas->cureltname, "eventSubURL") )
! 79: dstmember = datas->tmp.eventsuburl;
! 80: else if( !strcmp(datas->cureltname, "SCPDURL") )
! 81: dstmember = datas->tmp.scpdurl;
! 82: /* else if( !strcmp(datas->cureltname, "deviceType") )
! 83: dstmember = datas->devicetype_tmp;*/
! 84: if(dstmember)
! 85: {
! 86: if(l>=MINIUPNPC_URL_MAXSIZE)
! 87: l = MINIUPNPC_URL_MAXSIZE-1;
! 88: memcpy(dstmember, data, l);
! 89: dstmember[l] = '\0';
! 90: }
! 91: }
! 92:
! 93: #ifdef DEBUG
! 94: void printIGD(struct IGDdatas * d)
! 95: {
! 96: printf("urlbase = '%s'\n", d->urlbase);
! 97: printf("WAN Device (Common interface config) :\n");
! 98: /*printf(" deviceType = '%s'\n", d->CIF.devicetype);*/
! 99: printf(" serviceType = '%s'\n", d->CIF.servicetype);
! 100: printf(" controlURL = '%s'\n", d->CIF.controlurl);
! 101: printf(" eventSubURL = '%s'\n", d->CIF.eventsuburl);
! 102: printf(" SCPDURL = '%s'\n", d->CIF.scpdurl);
! 103: printf("primary WAN Connection Device (IP or PPP Connection):\n");
! 104: /*printf(" deviceType = '%s'\n", d->first.devicetype);*/
! 105: printf(" servicetype = '%s'\n", d->first.servicetype);
! 106: printf(" controlURL = '%s'\n", d->first.controlurl);
! 107: printf(" eventSubURL = '%s'\n", d->first.eventsuburl);
! 108: printf(" SCPDURL = '%s'\n", d->first.scpdurl);
! 109: printf("secondary WAN Connection Device (IP or PPP Connection):\n");
! 110: /*printf(" deviceType = '%s'\n", d->second.devicetype);*/
! 111: printf(" servicetype = '%s'\n", d->second.servicetype);
! 112: printf(" controlURL = '%s'\n", d->second.controlurl);
! 113: printf(" eventSubURL = '%s'\n", d->second.eventsuburl);
! 114: printf(" SCPDURL = '%s'\n", d->second.scpdurl);
! 115: printf("WAN IPv6 Firewall Control :\n");
! 116: /*printf(" deviceType = '%s'\n", d->IPv6FC.devicetype);*/
! 117: printf(" servicetype = '%s'\n", d->IPv6FC.servicetype);
! 118: printf(" controlURL = '%s'\n", d->IPv6FC.controlurl);
! 119: printf(" eventSubURL = '%s'\n", d->IPv6FC.eventsuburl);
! 120: printf(" SCPDURL = '%s'\n", d->IPv6FC.scpdurl);
! 121: }
! 122: #endif /* DEBUG */
! 123:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>