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

📄 slpd_database.c

📁 SLP协议在linux下的实现。此版本为1.2.1版。官方网站为www.openslp.org
💻 C
📖 第 1 页 / 共 3 页
字号:
{    SLPDatabaseHandle           dh;    SLPDatabaseEntry*           entry;    SLPSrvReg*                  entryreg;    SLPAttrRqst*                attrrqst;#ifdef ENABLE_SLPv2_SECURITY    int                         i;#endif    *result = xmalloc(sizeof(SLPDDatabaseAttrRqstResult));    if ( *result == NULL )    {        return SLP_ERROR_INTERNAL_ERROR;    }    memset(*result,0,sizeof(SLPDDatabaseAttrRqstResult));    dh = SLPDatabaseOpen(&G_SlpdDatabase.database);    if ( dh )    {        (*result)->reserved = dh;        /* attrrqst is the AttrRqst being made */        attrrqst = &(msg->body.attrrqst);        while ( 1 )        {            entry = SLPDatabaseEnum(dh);            if ( entry == NULL )            {                return 0;            }            /* entry reg is the SrvReg message from the database */            entryreg = &(entry->msg->body.srvreg);            if ( SLPCompareString(attrrqst->urllen,                                  attrrqst->url,                                  entryreg->urlentry.urllen,                                  entryreg->urlentry.url) == 0 ||                 SLPCompareSrvType(attrrqst->urllen,                                   attrrqst->url,                                   entryreg->srvtypelen,                                   entryreg->srvtype) == 0 )            {                if ( SLPIntersectStringList(attrrqst->scopelistlen,                                            attrrqst->scopelist,                                            entryreg->scopelistlen,                                            entryreg->scopelist) )                {                    if ( attrrqst->taglistlen == 0 )                    {#ifdef ENABLE_SLPv2_SECURITY                        if ( attrrqst->spistrlen )                        {                            for ( i=0; i< entryreg->authcount;i++ )                            {                                if ( SLPCompareString(attrrqst->spistrlen,                                                      attrrqst->spistr,                                                      entryreg->autharray[i].spistrlen,                                                      entryreg->autharray[i].spistr) == 0 )                                {                                    break;                                }                            }                            if ( i == entryreg->authcount )                            {                                continue;                            }                        }#endif                        /* Send back what was registered */                        (*result)->attrlistlen = entryreg->attrlistlen;                        (*result)->attrlist = (char*)entryreg->attrlist;                        (*result)->authcount = entryreg->authcount;                        (*result)->autharray = entryreg->autharray;                                            }#ifdef ENABLE_PREDICATES                    else                    {                        /* Send back a partial list as specified by taglist */                        if ( SLPDFilterAttributes(entryreg->attrlistlen,                                                  entryreg->attrlist,                                                  attrrqst->taglistlen,                                                  attrrqst->taglist,                                                  &(*result)->attrlistlen,                                                  &(*result)->attrlist) == 0 )                        {                            (*result)->ispartial = 1;                            break;                        }                    }#endif                }            }        }    }    return 0;}/*=========================================================================*/void SLPDDatabaseAttrRqstEnd(SLPDDatabaseAttrRqstResult* result)/* Release resources used to find attributes in the database               *//*                                                                         *//* result   (IN) pointer result structure previously passed to             *//*               SLPDDatabaseSrvTypeRqstStart                              *//*                                                                         *//* Returns  - None                                                         *//*=========================================================================*/{    if ( result )    {        SLPDatabaseClose((SLPDatabaseHandle)result->reserved);        if ( result->ispartial && result->attrlist ) free(result->attrlist);        xfree(result);    }}/*=========================================================================*/void* SLPDDatabaseEnumStart()/* Start an enumeration of the entire database                             *//*                                                                         *//* Returns: An enumeration handle that is passed to subsequent calls to    *//*          SLPDDatabaseEnum().  Returns NULL on failure.  Returned        *//*          enumeration handle (if not NULL) must be passed to             *//*          SLPDDatabaseEnumEnd() when you are done with it.               *//*=========================================================================*/{    return SLPDatabaseOpen(&G_SlpdDatabase.database);   }/*=========================================================================*/SLPMessage SLPDDatabaseEnum(void* eh, SLPMessage* msg, SLPBuffer* buf)/* Enumerate through all entries of the database                           *//*                                                                         *//* eh (IN) pointer to opaque data that is used to maintain                 *//*         enumerate entries.  Pass in a pointer to NULL to start          *//*         enumeration.                                                    *//*                                                                         *//* msg (OUT) pointer to the SrvReg message that discribes buf              *//*                                                                         *//* buf (OUT) pointer to the SrvReg message buffer                          *//*                                                                         *//* returns: Pointer to enumerated entry or NULL if end of enumeration      *//*=========================================================================*/{    SLPDatabaseEntry*   entry;    entry = SLPDatabaseEnum((SLPDatabaseHandle) eh);    if ( entry )    {        *msg = entry->msg;        *buf = entry->buf;    }    else    {        *msg = 0;        *buf = 0;    }    return *msg;}/*=========================================================================*/void SLPDDatabaseEnumEnd(void* eh)/* End an enumeration started by SLPDDatabaseEnumStart()                   *//*                                                                         *//* Parameters:  eh (IN) The enumeration handle returned by                 *//*              SLPDDatabaseEnumStart()                                    *//*=========================================================================*/{    if ( eh )    {        SLPDatabaseClose((SLPDatabaseHandle)eh);    }}/*=========================================================================*/int SLPDDatabaseIsEmpty()/* Returns an boolean value indicating whether the database is empty       *//*=========================================================================*/{    int result = 1;    SLPDatabaseHandle dh;    dh = SLPDatabaseOpen(&G_SlpdDatabase.database);    {        result = SLPDatabaseCount(dh) == 0;        SLPDatabaseClose(dh);    }    return result;}/*=========================================================================*/int SLPDDatabaseInit(const char* regfile)/* Initialize the database with registrations from a regfile.              *//*                                                                         *//* regfile  (IN)    the regfile to register.  Pass in NULL for no regfile  *//*                                                                         *//* Returns  - zero on success or non-zero on error.                        *//*=========================================================================*/{    /* Set initial values */    memset(&G_SlpdDatabase,0,sizeof(G_SlpdDatabase));    G_SlpdDatabase.urlcount = SLPDDATABASE_INITIAL_URLCOUNT;    G_SlpdDatabase.srvtypelistlen = SLPDDATABASE_INITIAL_SRVTYPELISTLEN;    SLPDatabaseInit(&G_SlpdDatabase.database);    /* Call the reinit function */    return SLPDDatabaseReInit(regfile);}/*=========================================================================*/int SLPDDatabaseReInit(const char* regfile)/* Re-initialize the database with changed registrations from a regfile.   *//*                                                                         *//* regfile  (IN)    the regfile to register.                               *//*                                                                         *//* Returns  - zero on success or non-zero on error.                        *//*=========================================================================*/{    SLPDatabaseHandle   dh;    SLPDatabaseEntry*   entry;    SLPMessage          msg;    SLPBuffer           buf;    FILE*               fd;    /*------------------------------------------------------------------*/    /* open the database handle and remove all the static registrations */    /* (the registrations from the /etc/slp.reg) file.                  */    /*------------------------------------------------------------------*/    dh = SLPDatabaseOpen(&G_SlpdDatabase.database);    if ( dh )    {        while ( 1 )        {            entry = SLPDatabaseEnum(dh);            if ( entry == NULL ) break;            if ( entry->msg->body.srvreg.source == SLP_REG_SOURCE_STATIC )            {                SLPDatabaseRemove(dh,entry);            }        }        SLPDatabaseClose(dh);    }    /*--------------------------------------*/    /* Read static registration file if any */    /*--------------------------------------*/    if ( regfile )    {        fd = fopen(regfile,"rb");        if ( fd )        {            while ( SLPDRegFileReadSrvReg(fd, &msg, &buf) == 0 )            {                SLPDDatabaseReg(msg, buf);            }               fclose(fd);        }    }    return 0;}#ifdef DEBUG/*=========================================================================*/void SLPDDatabaseDeinit(void)/* Cleans up all resources used by the database                            *//*=========================================================================*/{    SLPDatabaseDeinit(&G_SlpdDatabase.database);}/*=========================================================================*/void SLPDDatabaseDump(void)/* Dumps currently valid service registrations present with slpd           *//*=========================================================================*/{    SLPMessage      msg;    SLPBuffer       buf;    void* eh;    eh = SLPDDatabaseEnumStart();    if ( eh )    {        SLPDLog("\n========================================================================\n");        SLPDLog("Dumping Registrations\n");        SLPDLog("========================================================================\n");        while ( SLPDDatabaseEnum(eh, &msg, &buf) )        {            SLPDLogMessageInternals(msg);            SLPDLog("\n");        }        SLPDDatabaseEnumEnd(eh);    }}#endif

⌨️ 快捷键说明

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