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

📄 slpd_database.c

📁 SLP协议在linux下的实现。此版本为1.2.1版。官方网站为www.openslp.org
💻 C
📖 第 1 页 / 共 3 页
字号:
                    if ( G_SlpdProperty.checkSourceAddr &&                         memcmp(&(entry->msg->peer.sin_addr),                                &(msg->peer.sin_addr),                                sizeof(struct in_addr)) )                    {                        SLPDatabaseClose(dh);                        return SLP_ERROR_AUTHENTICATION_FAILED;                    }#ifdef ENABLE_SLPv2_SECURITY                    if ( entryreg->urlentry.authcount &&                         entryreg->urlentry.authcount != dereg->urlentry.authcount )                    {                        SLPDatabaseClose(dh);                        return SLP_ERROR_AUTHENTICATION_FAILED;                    }#endif                                        /* remove the registration from the database */                    SLPDLogRegistration("Deregistration",entry);		    SLPDatabaseRemove(dh,entry);                    break;                }            }        }        SLPDatabaseClose(dh);        if ( entry==NULL )        {            return SLP_ERROR_INVALID_REGISTRATION;        }    }    return 0;}/*=========================================================================*/int SLPDDatabaseSrvRqstStart(SLPMessage msg,                             SLPDDatabaseSrvRqstResult** result)/* Find services in the database                                           *//*                                                                         *//* msg      (IN) the SrvRqst to find.                                      *//*                                                                         *//* result   (OUT) pointer result structure                                 *//*                                                                         *//* Returns  - Zero on success. Non-zero on failure                         *//*                                                                         *//* Note:    Caller must pass *result to SLPDDatabaseSrvRqstEnd() to free   *//*=========================================================================*/{    SLPDatabaseHandle           dh;    SLPDatabaseEntry*           entry;    SLPSrvReg*                  entryreg;    SLPSrvRqst*                 srvrqst;#ifdef ENABLE_SLPv2_SECURITY    int                         i;#endif    /* start with the result set to NULL just to be safe */    *result = NULL;    dh = SLPDatabaseOpen(&G_SlpdDatabase.database);    if ( dh )    {        /* srvrqst is the SrvRqst being made */        srvrqst = &(msg->body.srvrqst);        while ( 1 )        {            /*-----------------------------------------------------------*/            /* Allocate result with generous array of url entry pointers */            /*-----------------------------------------------------------*/            *result = (SLPDDatabaseSrvRqstResult*) xrealloc(*result, sizeof(SLPDDatabaseSrvRqstResult) + (sizeof(SLPUrlEntry*) * G_SlpdDatabase.urlcount));            if ( *result == NULL )            {                /* out of memory */                SLPDatabaseClose(dh);                return SLP_ERROR_INTERNAL_ERROR;            }            (*result)->urlarray = (SLPUrlEntry**)((*result) + 1);            (*result)->urlcount = 0;            (*result)->reserved = dh;            /*-------------------------------------------------*/            /* Rewind enumeration in case we had to reallocate */            /*-------------------------------------------------*/            SLPDatabaseRewind(dh);            /*-----------------------------------------*/            /* Check to see if there is matching entry */            /*-----------------------------------------*/            while ( 1 )            {                entry = SLPDatabaseEnum(dh);                if ( entry == NULL )                {                    /* This is the only successful way out */                    return 0;                }                /* entry reg is the SrvReg message from the database */                entryreg = &(entry->msg->body.srvreg);                /* check the service type */                if ( SLPCompareSrvType(srvrqst->srvtypelen,                                       srvrqst->srvtype,                                       entryreg->srvtypelen,                                       entryreg->srvtype) == 0 &&                     SLPIntersectStringList(entryreg->scopelistlen,                                            entryreg->scopelist,                                            srvrqst->scopelistlen,                                            srvrqst->scopelist) > 0 )                {#ifdef ENABLE_PREDICATES                    if ( SLPDPredicateTest(msg->header.version,                                           entryreg->attrlistlen,                                           entryreg->attrlist,                                           srvrqst->predicatelen,                                           srvrqst->predicate) )#endif                    {#ifdef ENABLE_SLPv2_SECURITY                        if ( srvrqst->spistrlen )                        {                            for ( i=0; i< entryreg->urlentry.authcount;i++ )                            {                                if ( SLPCompareString(srvrqst->spistrlen,                                                      srvrqst->spistr,                                                      entryreg->urlentry.autharray[i].spistrlen,                                                      entryreg->urlentry.autharray[i].spistr) == 0 )                                {                                    break;                                }                            }                            if ( i == entryreg->urlentry.authcount )                            {                                continue;                            }                        }#endif                        if ( (*result)->urlcount + 1 > G_SlpdDatabase.urlcount )                        {                            /* Oops we did not allocate a big enough result */                            G_SlpdDatabase.urlcount *= 2;                            break;                        }                        (*result)->urlarray[(*result)->urlcount] = &(entryreg->urlentry);                        (*result)->urlcount ++;                    }                }            }        }    }    return 0;}/*=========================================================================*/void SLPDDatabaseSrvRqstEnd(SLPDDatabaseSrvRqstResult* result)/* Find services in the database                                           *//*                                                                         *//* result   (IN) pointer result structure previously passed to             *//*               SLPDDatabaseSrvRqstStart                                  *//*                                                                         *//* Returns  - None                                                         *//*=========================================================================*/{    if ( result )    {        SLPDatabaseClose((SLPDatabaseHandle)result->reserved);        xfree(result);    }}/*=========================================================================*/int SLPDDatabaseSrvTypeRqstStart(SLPMessage msg,                                 SLPDDatabaseSrvTypeRqstResult** result)/* Find service types in the database                                      *//*                                                                         *//* msg      (IN) the SrvTypRqst to find.                                   *//*                                                                         *//* result   (OUT) pointer result structure                                 *//*                                                                         *//* Returns  - Zero on success. Non-zero on failure                         *//*                                                                         *//* Note:    Caller must pass *result to SLPDDatabaseSrvtypeRqstEnd() to    *//*          free                                                           *//*=========================================================================*/{    SLPDatabaseHandle           dh;    SLPDatabaseEntry*           entry;    SLPSrvReg*                  entryreg;    SLPSrvTypeRqst*             srvtyperqst;    dh = SLPDatabaseOpen(&G_SlpdDatabase.database);    if ( dh )    {        /* srvtyperqst is the SrvTypeRqst being made */        srvtyperqst = &(msg->body.srvtyperqst);        while ( 1 )        {            /*-----------------------------------------------------------------*/            /* Allocate result with generous srvtypelist of url entry pointers */            /*-----------------------------------------------------------------*/            *result = (SLPDDatabaseSrvTypeRqstResult*) xrealloc(*result, sizeof(SLPDDatabaseSrvTypeRqstResult) + G_SlpdDatabase.srvtypelistlen);            if ( *result == NULL )            {                /* out of memory */                SLPDatabaseClose(dh);                return SLP_ERROR_INTERNAL_ERROR;            }            (*result)->srvtypelist = (char*)((*result) + 1);            (*result)->srvtypelistlen = 0;            (*result)->reserved = dh;            /*-------------------------------------------------*/            /* Rewind enumeration in case we had to reallocate */            /*-------------------------------------------------*/            SLPDatabaseRewind(dh);            while ( 1 )            {                entry = SLPDatabaseEnum(dh);                if ( entry == NULL )                {                    /* This is the only successful way out */                    return 0;                }                /* entry reg is the SrvReg message from the database */                entryreg = &(entry->msg->body.srvreg);                if ( SLPCompareNamingAuth(entryreg->srvtypelen,                                          entryreg->srvtype,                                          srvtyperqst->namingauthlen,                                          srvtyperqst->namingauth) == 0 &&                      SLPIntersectStringList(srvtyperqst->scopelistlen,                                            srvtyperqst->scopelist,                                            entryreg->scopelistlen,                                            entryreg->scopelist) &&                     SLPContainsStringList((*result)->srvtypelistlen,                                            (*result)->srvtypelist,                                           entryreg->srvtypelen,                                           entryreg->srvtype) == 0 )                {                    /* Check to see if we allocated a big enough srvtypelist */                    if ( (*result)->srvtypelistlen + entryreg->srvtypelen > G_SlpdDatabase.srvtypelistlen )                    {                        /* Oops we did not allocate a big enough result */                        G_SlpdDatabase.srvtypelistlen *= 2;                        break;                    }                    /* Append a comma if needed */                    if ( (*result)->srvtypelistlen )                    {                        (*result)->srvtypelist[(*result)->srvtypelistlen] = ',';                        (*result)->srvtypelistlen += 1;                    }                    /* Append the service type */                    memcpy(((*result)->srvtypelist) + (*result)->srvtypelistlen,                           entryreg->srvtype,                           entryreg->srvtypelen);                    (*result)->srvtypelistlen += entryreg->srvtypelen;                }            }        }        SLPDatabaseClose(dh);    }    return 0;}/*=========================================================================*/void SLPDDatabaseSrvTypeRqstEnd(SLPDDatabaseSrvTypeRqstResult* result)/* Release resources used to find service types in the database            *//*                                                                         *//* result   (IN) pointer result structure previously passed to             *//*               SLPDDatabaseSrvTypeRqstStart                              *//*                                                                         *//* Returns  - None                                                         *//*=========================================================================*/{    if ( result )    {        SLPDatabaseClose((SLPDatabaseHandle)result->reserved);        xfree(result);    }}/*=========================================================================*/int SLPDDatabaseAttrRqstStart(SLPMessage msg,                              SLPDDatabaseAttrRqstResult** result)/* Find attributes in the database                                         *//*                                                                         *//* msg      (IN) the AttrRqst to find.                                     *//*                                                                         *//* result   (OUT) pointer result structure                                 *//*                                                                         *//* Returns  - Zero on success. Non-zero on failure                         *//*                                                                         *//* Note:    Caller must pass *result to SLPDDatabaseAttrRqstEnd() to       *//*          free                                                           *//*=========================================================================*/

⌨️ 快捷键说明

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