/*--------------------------------------------------------------------------*/ int ParseSrvDeReg(SLPBuffer buffer, SLPSrvDeReg* srvdereg) /*--------------------------------------------------------------------------*/ { int result; /* make sure that min size is met */ #if(defined(PARANOID) || defined(DEBUG)) if(buffer->end - buffer->curpos < 4) { return SLP_ERROR_PARSE_ERROR; } #endif /* parse the scope list */ srvdereg->scopelistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; #if(defined(PARANOID) || defined(DEBUG)) if(srvdereg->scopelistlen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } #endif srvdereg->scopelist = buffer->curpos; buffer->curpos = buffer->curpos + srvdereg->scopelistlen; /* parse the url entry */ result = ParseUrlEntry(buffer,&(srvdereg->urlentry)); if(result) { return result; } /* parse the tag list */ srvdereg->taglistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; #if(defined(PARANOID) || defined(DEBUG)) if(srvdereg->taglistlen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } #endif srvdereg->taglist = buffer->curpos; buffer->curpos = buffer->curpos + srvdereg->taglistlen; return 0; }
/*--------------------------------------------------------------------------*/ int ParseSrvRply(SLPBuffer buffer, SLPSrvRply* srvrply) /*--------------------------------------------------------------------------*/ { int result; int i; /* make sure that min size is met */ if(buffer->end - buffer->curpos < 4) { return SLP_ERROR_PARSE_ERROR; } /* parse out the error code */ srvrply->errorcode = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; /* parse out the url entry count */ srvrply->urlcount = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; /* parse out the url entries (if any) */ if(srvrply->urlcount) { srvrply->urlarray = (SLPUrlEntry*)malloc(sizeof(SLPUrlEntry) * srvrply->urlcount); if(srvrply->urlarray == 0) { return SLP_ERROR_INTERNAL_ERROR; } memset(srvrply->urlarray,0,sizeof(SLPUrlEntry) * srvrply->urlcount); for(i=0;i<srvrply->urlcount;i++) { result = ParseUrlEntry(buffer,&(srvrply->urlarray[i])); if(result) return result; } } else { srvrply->urlarray = 0; } return 0; }
/*--------------------------------------------------------------------------*/ int ParseSrvReg(SLPBuffer buffer, SLPSrvReg* srvreg) /*--------------------------------------------------------------------------*/ { int result; int i; /* Parse out the url entry */ result = ParseUrlEntry(buffer,&(srvreg->urlentry)); if(result) { return result; } /* parse the service type */ srvreg->srvtypelen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(srvreg->srvtypelen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } srvreg->srvtype = buffer->curpos; buffer->curpos = buffer->curpos + srvreg->srvtypelen; /* parse the scope list */ srvreg->scopelistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(srvreg->scopelistlen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } srvreg->scopelist = buffer->curpos; buffer->curpos = buffer->curpos + srvreg->scopelistlen; /* parse the attribute list*/ srvreg->attrlistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(srvreg->attrlistlen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } srvreg->attrlist = buffer->curpos; buffer->curpos = buffer->curpos + srvreg->attrlistlen; /* parse out attribute auth block count */ srvreg->authcount = *(buffer->curpos); buffer->curpos = buffer->curpos + 1; /* parse out the auth block (if any) */ if(srvreg->authcount) { srvreg->autharray = (SLPAuthBlock*)malloc(sizeof(SLPAuthBlock) * srvreg->authcount); if(srvreg->autharray == 0) { return SLP_ERROR_INTERNAL_ERROR; } memset(srvreg->autharray,0,sizeof(SLPAuthBlock) * srvreg->authcount); for(i=0;i<srvreg->authcount;i++) { result = ParseAuthBlock(buffer,&(srvreg->autharray[i])); if(result) return result; } } return 0; }