⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slpd_v1process.c

📁 SLP协议在linux下的实现。此版本为1.2.1版。官方网站为www.openslp.org
💻 C
📖 第 1 页 / 共 3 页
字号:
int v1ProcessSrvTypeRqst(struct sockaddr_in* peeraddr,                         SLPMessage message,                         SLPBuffer* sendbuf,                         int errorcode)/*-------------------------------------------------------------------------*/{    char*                           type;    char*                           end;    char*                           slider;    int                             i;    int                             typelen;    int                             numsrvtypes = 0;    int                             size        = 0;    SLPDDatabaseSrvTypeRqstResult*  db          = 0;    SLPBuffer                       result      = *sendbuf;    /*-------------------------------------------------*/    /* Check for one of our IP addresses in the prlist */    /*-------------------------------------------------*/    if (SLPIntersectStringList(message->body.srvtyperqst.prlistlen,                               message->body.srvtyperqst.prlist,                               G_SlpdProperty.interfacesLen,                               G_SlpdProperty.interfaces))    {        result->end = result->start;        goto FINISHED;    }    /*------------------------------------*/    /* Make sure that we handle the scope */    /*------------------------------------*/    if (SLPIntersectStringList(message->body.srvtyperqst.scopelistlen,                               message->body.srvtyperqst.scopelist,                               G_SlpdProperty.useScopesLen,                               G_SlpdProperty.useScopes) != 0)    {        /*------------------------------------*/        /* Find service types in the database */        /*------------------------------------*/        errorcode = SLPDDatabaseSrvTypeRqstStart(message, &db);    }    else    {        errorcode = SLP_ERROR_SCOPE_NOT_SUPPORTED;    }    /*----------------------------------------------------------------*/    /* Do not send error codes or empty replies to multicast requests */    /*----------------------------------------------------------------*/    if (message->header.flags & SLP_FLAG_MCAST)    {        if (errorcode != 0 || db->srvtypelistlen == 0)        {            result->end = result->start;            goto FINISHED;          }    }    /*-----------------------------------------------------------------*/    /* ensure the buffer is big enough to handle the whole srvtyperply */    /*-----------------------------------------------------------------*/    size = 16; /* 12 bytes for header, 2 bytes for error code, 2 bytes                  for num of service types */    if (errorcode == 0)    {        if (db->srvtypelistlen)        {            /* there has to be at least one service type*/            numsrvtypes = 1;            /* count the rest of the service types */            type = db->srvtypelist;            for (i=0; i< db->srvtypelistlen; i++)            {                if (type[i] == ',')                {                    numsrvtypes += 1;                }            }            /* figure out how much memory is required for srvtype strings */            typelen = INT_MAX;            errorcode = SLPv1ToEncoding(0,                                        &typelen,                                        message->header.encoding,                                          db->srvtypelist,                                        db->srvtypelistlen);            /* TRICKY: we add in the numofsrvtypes + 1 to make room for the */            /* type length.  We can do this because the ',' of the comma    */            /* delimited list is one byte.                                  */            size = size + typelen + numsrvtypes + 1;        }        else        {            numsrvtypes = 0;        }    }    /*-----------------*/    /* Allocate memory */    /*-----------------*/    result = SLPBufferRealloc(result,size);    if (result == 0)    {        errorcode = SLP_ERROR_INTERNAL_ERROR;        goto FINISHED;    }    /*----------------*/    /* Add the header */    /*----------------*/    /*version*/    *(result->start)       = 1;    /*function id*/    *(result->start + 1)   = SLP_FUNCT_SRVTYPERPLY;    /*length*/    ToUINT16(result->start + 2, size);    /*flags - TODO set the flags correctly */    *(result->start + 4) = message->header.flags |                           (size > SLP_MAX_DATAGRAM_SIZE ? SLPv1_FLAG_OVERFLOW : 0);      /*dialect*/    *(result->start + 5) = 0;    /*language code*/    memcpy(result->start + 6, message->header.langtag, 2);    ToUINT16(result->start + 8, message->header.encoding);    /*xid*/    ToUINT16(result->start + 10, message->header.xid);    /*-----------------------------*/    /* Add rest of the SrvTypeRply */    /*-----------------------------*/    result->curpos = result->start + 12;    /* error code*/    ToUINT16(result->curpos, errorcode);    result->curpos += 2;    if (errorcode == 0)    {        /* num of service types */        ToUINT16(result->curpos, numsrvtypes);        result->curpos += 2;        /* service type strings */        type = db->srvtypelist;        slider = db->srvtypelist;        end = &(type[db->srvtypelistlen]);        for (i=0;i<numsrvtypes; i++)        {            while (slider < end && *slider != ',') slider++;            typelen = size;            /* put in the encoded service type */            SLPv1ToEncoding(result->curpos + 2,                             &typelen,                            message->header.encoding,                            type,                            slider - type);            /* slip in the typelen */            ToUINT16(result->curpos, typelen);            result->curpos += 2;            result->curpos += typelen;            slider ++; /* skip comma */            type = slider;        }        /* TODO - make sure we don't return generic types */    }    FINISHED:       if (db) SLPDDatabaseSrvTypeRqstEnd(db);    *sendbuf = result;    return errorcode;}/*=========================================================================*/int SLPDv1ProcessMessage(struct sockaddr_in* peeraddr,                         SLPBuffer recvbuf,                         SLPBuffer* sendbuf)/* Processes the SLPv1 message and places the results in sendbuf           *//*                                                                         *//* peeraddr - the socket the message was received on                       *//*                                                                         *//* recvbuf  - message to process                                           *//*                                                                         *//* sendbuf  - results of the processed message                             *//*                                                                         *//* Returns  - zero on success SLP_ERROR_PARSE_ERROR or                     *//*            SLP_ERROR_INTERNAL_ERROR on ENOMEM.                          *//*=========================================================================*/{    SLPHeader   header;    SLPMessage  message;    int         errorcode   = 0;    if (!G_SlpdProperty.isDA)    {        /* SLPv1 messages are handled only by DAs */        errorcode = SLP_ERROR_VER_NOT_SUPPORTED;        return errorcode;    }    /* Parse just the message header the reset the buffer "curpos" pointer */    recvbuf->curpos = recvbuf->start;    errorcode = SLPv1MessageParseHeader(recvbuf, &header);    if (errorcode != 0)    {        return errorcode;    }    /* TRICKY: Duplicate SRVREG recvbufs *before* parsing them   */    /*         it because we are going to keep them in the       */    if (header.functionid == SLP_FUNCT_SRVREG)    {        recvbuf = SLPBufferDup(recvbuf);        if (recvbuf == NULL)        {            return SLP_ERROR_INTERNAL_ERROR;        }    }    /* Allocate the message descriptor */    message = SLPMessageAlloc();    if (message)    {        /* Parse the message and fill out the message descriptor */        errorcode = SLPv1MessageParseBuffer(peeraddr,recvbuf, message);        if (errorcode == 0)        {            /* Process messages based on type */            switch (message->header.functionid)            {            case SLP_FUNCT_SRVRQST:                errorcode = v1ProcessSrvRqst(peeraddr, message, sendbuf, errorcode);                break;            case SLP_FUNCT_SRVREG:                errorcode = v1ProcessSrvReg(peeraddr,                                            message,                                            recvbuf,                                            sendbuf,                                            errorcode);                if (errorcode == 0)                {                    SLPDKnownDAEcho(message, recvbuf);                      }                break;            case SLP_FUNCT_SRVDEREG:                errorcode = v1ProcessSrvDeReg(peeraddr, message, sendbuf, errorcode);                if (errorcode == 0)                {                    SLPDKnownDAEcho(message, recvbuf);                      }                break;            case SLP_FUNCT_ATTRRQST:                errorcode = v1ProcessAttrRqst(peeraddr, message, sendbuf, errorcode);                break;            case SLP_FUNCT_SRVTYPERQST:                errorcode = v1ProcessSrvTypeRqst(peeraddr, message, sendbuf, errorcode);                break;            case SLP_FUNCT_DAADVERT:                /* we are a SLPv2 DA, ignore other v1 DAs */                (*sendbuf)->end = (*sendbuf)->start;                break;            default:                /* Should never happen... but we're paranoid */                errorcode = SLP_ERROR_PARSE_ERROR;                break;            }           }        if (header.functionid == SLP_FUNCT_SRVREG)        {            /* TRICKY: Do not free the message descriptor for SRVREGs */            /*         because we are keeping them in the database    */            /*         unless there is an error then we free memory   */            if (errorcode)            {                SLPMessageFree(message);                SLPBufferFree(recvbuf);            }        }        else        {            SLPMessageFree(message);        }    }    else    {        /* out of memory */        errorcode = SLP_ERROR_INTERNAL_ERROR;    }    return errorcode;}                

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -