slp_message.c
来自「SLP协议在linux下的实现。此版本为1.2.1版。官方网站为www.open」· C语言 代码 · 共 1,213 行 · 第 1/3 页
C
1,213 行
srvreg->authcount = *(buffer->curpos); buffer->curpos = buffer->curpos + 1; /* parse out the auth block (if any) */ if(srvreg->authcount) { srvreg->autharray = (SLPAuthBlock*)xmalloc(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;}/*--------------------------------------------------------------------------*/int ParseSrvDeReg(SLPBuffer buffer, SLPSrvDeReg* srvdereg)/*--------------------------------------------------------------------------*/{ int result; /* make sure that min size is met */ if(buffer->end - buffer->curpos < 4) { return SLP_ERROR_PARSE_ERROR; } /* parse the scope list */ srvdereg->scopelistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(srvdereg->scopelistlen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } 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 */ if(buffer->end - buffer->curpos < 2) { return SLP_ERROR_PARSE_ERROR; } srvdereg->taglistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(srvdereg->taglistlen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } srvdereg->taglist = buffer->curpos; buffer->curpos = buffer->curpos + srvdereg->taglistlen; return 0;}/*--------------------------------------------------------------------------*/int ParseSrvAck(SLPBuffer buffer, SLPSrvAck* srvack)/*--------------------------------------------------------------------------*/{ srvack->errorcode = AsUINT16(buffer->curpos); return 0;}/*--------------------------------------------------------------------------*/int ParseAttrRqst(SLPBuffer buffer, SLPAttrRqst* attrrqst)/*--------------------------------------------------------------------------*/{ /* make sure that min size is met */ if(buffer->end - buffer->curpos < 10) { return SLP_ERROR_PARSE_ERROR; } /* parse the prlist */ attrrqst->prlistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(attrrqst->prlistlen + 2 > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } attrrqst->prlist = buffer->curpos; buffer->curpos = buffer->curpos + attrrqst->prlistlen; /* parse the url */ attrrqst->urllen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(attrrqst->urllen + 2 > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } attrrqst->url = buffer->curpos; buffer->curpos = buffer->curpos + attrrqst->urllen; /* parse the scope list */ attrrqst->scopelistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(attrrqst->scopelistlen + 2 > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } attrrqst->scopelist = buffer->curpos; buffer->curpos = buffer->curpos + attrrqst->scopelistlen; /* parse the taglist string */ attrrqst->taglistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(attrrqst->taglistlen + 2 > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } attrrqst->taglist = buffer->curpos; buffer->curpos = buffer->curpos + attrrqst->taglistlen; /* parse the slpspi string */ attrrqst->spistrlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(attrrqst->spistrlen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } attrrqst->spistr = buffer->curpos; buffer->curpos = buffer->curpos + attrrqst->spistrlen; return 0;}/*--------------------------------------------------------------------------*/int ParseAttrRply(SLPBuffer buffer, SLPAttrRply* attrrply)/*--------------------------------------------------------------------------*/{ 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 */ attrrply->errorcode = AsUINT16(buffer->curpos); if(attrrply->errorcode) { /* We better not trust the rest of the packet */ memset(attrrply,0,sizeof(SLPAttrRply)); attrrply->errorcode = AsUINT16(buffer->curpos); return 0; } buffer->curpos = buffer->curpos + 2; /* parse out the attrlist */ attrrply->attrlistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(attrrply->attrlistlen + 1 > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } attrrply->attrlist = buffer->curpos; buffer->curpos = buffer->curpos + attrrply->attrlistlen; /* parse out auth block count */ attrrply->authcount = *(buffer->curpos); buffer->curpos = buffer->curpos + 1; /* parse out the auth block (if any) */ if(attrrply->authcount) { attrrply->autharray = (SLPAuthBlock*)xmalloc(sizeof(SLPAuthBlock) * attrrply->authcount); if(attrrply->autharray == 0) { return SLP_ERROR_INTERNAL_ERROR; } memset(attrrply->autharray,0,sizeof(SLPAuthBlock) * attrrply->authcount); for(i=0;i<attrrply->authcount;i++) { result = ParseAuthBlock(buffer,&(attrrply->autharray[i])); if(result) return result; } } return 0;}/*-------------------------------------------------------------------------*/int ParseDAAdvert(SLPBuffer buffer, SLPDAAdvert* daadvert)/*-------------------------------------------------------------------------*/{ 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 */ daadvert->errorcode = AsUINT16(buffer->curpos); if(daadvert->errorcode) { /* We better not trust the rest of the packet */ memset(daadvert,0,sizeof(SLPDAAdvert)); daadvert->errorcode = AsUINT16(buffer->curpos); return 0; } buffer->curpos = buffer->curpos + 2; /* parse out the bootstamp */ if(buffer->end - buffer->curpos < 6) { return SLP_ERROR_PARSE_ERROR; } daadvert->bootstamp = AsUINT32(buffer->curpos); buffer->curpos = buffer->curpos + 4; /* parse out the url */ daadvert->urllen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(daadvert->urllen + 2 > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } daadvert->url = buffer->curpos; buffer->curpos = buffer->curpos + daadvert->urllen; /* parse the scope list */ daadvert->scopelistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(daadvert->scopelistlen + 2 > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } daadvert->scopelist = buffer->curpos; buffer->curpos = buffer->curpos + daadvert->scopelistlen; /* parse the attr list */ daadvert->attrlistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(daadvert->attrlistlen + 2 > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } daadvert->attrlist = buffer->curpos; buffer->curpos = buffer->curpos + daadvert->attrlistlen; /* parse the SPI list */ daadvert->spilistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(daadvert->spilistlen + 1 > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } daadvert->spilist = buffer->curpos; buffer->curpos = buffer->curpos + daadvert->spilistlen; /* parse out auth block count */ daadvert->authcount = *(buffer->curpos); buffer->curpos = buffer->curpos + 1; /* parse out the auth block (if any) */ if(daadvert->authcount) { daadvert->autharray = (SLPAuthBlock*)xmalloc(sizeof(SLPAuthBlock) * daadvert->authcount); if(daadvert->autharray == 0) { return SLP_ERROR_INTERNAL_ERROR; } memset(daadvert->autharray,0,sizeof(SLPAuthBlock) * daadvert->authcount); for(i=0;i<daadvert->authcount;i++) { result = ParseAuthBlock(buffer,&(daadvert->autharray[i])); if(result) return result; } } return 0;}/*-------------------------------------------------------------------------*/int ParseSAAdvert(SLPBuffer buffer, SLPSAAdvert* saadvert)/*-------------------------------------------------------------------------*/{ 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 url */ saadvert->urllen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(saadvert->urllen + 2 > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } saadvert->url = buffer->curpos; buffer->curpos = buffer->curpos + saadvert->urllen; /* parse the scope list */ saadvert->scopelistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(saadvert->scopelistlen + 2 > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } saadvert->scopelist = buffer->curpos; buffer->curpos = buffer->curpos + saadvert->scopelistlen; /* parse the attr list */ saadvert->attrlistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(saadvert->attrlistlen + 1 > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } saadvert->attrlist = buffer->curpos; buffer->curpos = buffer->curpos + saadvert->attrlistlen; /* parse out auth block count */ saadvert->authcount = *(buffer->curpos); buffer->curpos = buffer->curpos + 1; /* parse out the auth block (if any) */ if(saadvert->authcount) { saadvert->autharray = (SLPAuthBlock*)xmalloc(sizeof(SLPAuthBlock) * saadvert->authcount); if(saadvert->autharray == 0) { return SLP_ERROR_INTERNAL_ERROR; } memset(saadvert->autharray,0,sizeof(SLPAuthBlock) * saadvert->authcount); for(i=0;i<saadvert->authcount;i++) { result = ParseAuthBlock(buffer,&(saadvert->autharray[i])); if(result) return result; } } return 0;}/*--------------------------------------------------------------------------*/int ParseSrvTypeRqst(SLPBuffer buffer, SLPSrvTypeRqst* srvtyperqst)/*--------------------------------------------------------------------------*/{ /* make sure that min size is met */ if(buffer->end - buffer->curpos < 6) { return SLP_ERROR_PARSE_ERROR; } /* parse the prlist */ srvtyperqst->prlistlen = AsUINT16(buffer->curpos); buffer->curpos += 2; if(srvtyperqst->prlistlen + 2 > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } srvtyperqst->prlist = srvtyperqst->prlistlen ? buffer->curpos : 0; buffer->curpos += srvtyperqst->prlistlen; /* parse the naming authority if present */ srvtyperqst->namingauthlen = AsUINT16(buffer->curpos); buffer->curpos += 2; if(!srvtyperqst->namingauthlen || srvtyperqst->namingauthlen == 0xffff) { srvtyperqst->namingauth = 0; } else { if(srvtyperqst->namingauthlen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?