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 + -
显示快捷键?