Return to igd_desc_parse.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / miniupnpd / miniupnpc / src |
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: