📄 slpd_database.c
字号:
{ 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 + -