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

📄 libslp_findsrvs.c

📁 SLP协议在linux下的实现。此版本为1.2.1版。官方网站为www.openslp.org
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************//*                                                                         *//* Project:     OpenSLP - OpenSource implementation of Service Location    *//*              Protocol Version 2                                         *//*                                                                         *//* File:        slplib_findsrvs.c                                          *//*                                                                         *//* Abstract:    Implementation for SLPFindSrvs() call.                     *//*                                                                         *//*-------------------------------------------------------------------------*//*                                                                         *//*     Please submit patches to http://www.openslp.org                     *//*                                                                         *//*-------------------------------------------------------------------------*//*                                                                         *//* Copyright (C) 2000 Caldera Systems, Inc                                 *//* All rights reserved.                                                    *//*                                                                         *//* Redistribution and use in source and binary forms, with or without      *//* modification, are permitted provided that the following conditions are  *//* met:                                                                    */ /*                                                                         *//*      Redistributions of source code must retain the above copyright     *//*      notice, this list of conditions and the following disclaimer.      *//*                                                                         *//*      Redistributions in binary form must reproduce the above copyright  *//*      notice, this list of conditions and the following disclaimer in    *//*      the documentation and/or other materials provided with the         *//*      distribution.                                                      *//*                                                                         *//*      Neither the name of Caldera Systems nor the names of its           *//*      contributors may be used to endorse or promote products derived    *//*      from this software without specific prior written permission.      *//*                                                                         *//* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS     *//* `AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT      *//* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR   *//* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE CALDERA      *//* SYSTEMS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, *//* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT        *//* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE,  *//* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON       *//* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *//* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE   *//* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.    *//*                                                                         *//***************************************************************************/#include "slp.h"#include "libslp.h"/*-------------------------------------------------------------------------*/SLPBoolean ColateSLPSrvURLCallback(SLPHandle hSLP,                                   const char* pcSrvURL,                                   unsigned short sLifetime,                                   SLPError errCode,                                   void *pvCookie)/*-------------------------------------------------------------------------*/{    SLPSrvUrlColatedItem*   collateditem;    PSLPHandleInfo          handle;            handle = (PSLPHandleInfo) hSLP;    handle->callbackcount ++;    #ifdef ENABLE_ASYNC_API    /* Do not colate for async calls */    if(handle->isAsync)    {        return handle->params.findsrvs.callback(hSLP,                                                pcSrvURL,                                                sLifetime,                                                errCode,                                                pvCookie);    }#endif        if(errCode == SLP_LAST_CALL ||        handle->callbackcount > SLPPropertyAsInteger(SLPGetProperty("net.slp.maxResults")))    {        /* We are done so call the caller's callback for each      */        /* service URL colated item and clean up the colation list */        handle->params.findsrvs.callback((SLPHandle)handle,                                         NULL,                                         0,                                         SLP_LAST_CALL,                                         handle->params.findsrvs.cookie);        goto CLEANUP;    }    else if(errCode != SLP_OK)    {        return SLP_TRUE;    }    /* Add the service URL to the colation list */    collateditem = (SLPSrvUrlColatedItem*) handle->collatedsrvurls.head;    while(collateditem)    {        if(strcmp(collateditem->srvurl,pcSrvURL) == 0)        {            break;        }        collateditem = (SLPSrvUrlColatedItem*)collateditem->listitem.next;    }                                         /* create a new item if none was found */    if(collateditem == NULL)    {        collateditem = (SLPSrvUrlColatedItem*) xmalloc(sizeof(SLPSrvUrlColatedItem) + \                                                       strlen(pcSrvURL) + 1);        if(collateditem)        {            memset(collateditem,0,sizeof(SLPSrvUrlColatedItem));            collateditem->srvurl = (char*)(collateditem + 1);            strcpy(collateditem->srvurl,pcSrvURL);            collateditem->lifetime = sLifetime;            /* Add the new item to the collated list */            SLPListLinkTail(&(handle->collatedsrvurls),                            (SLPListItem*)collateditem);            /* Call the caller's callback */            if(handle->params.findsrvs.callback((SLPHandle)handle,                                                pcSrvURL,                                                sLifetime,                                                SLP_OK,                                                handle->params.findsrvs.cookie) == SLP_FALSE)            {                goto CLEANUP;            }        }    }        return SLP_TRUE;CLEANUP:    /* free the collation list */    while(handle->collatedsrvurls.count)    {        collateditem = (SLPSrvUrlColatedItem*)SLPListUnlink(&(handle->collatedsrvurls),                                                            handle->collatedsrvurls.head);        xfree(collateditem);    }       handle->callbackcount = 0;    return SLP_FALSE;}/*-------------------------------------------------------------------------*/SLPBoolean ProcessSrvRplyCallback(SLPError errorcode,                                  struct sockaddr_in* peerinfo,                                  SLPBuffer replybuf,                                  void* cookie)/*-------------------------------------------------------------------------*/{    int             i;    SLPUrlEntry*    urlentry;    SLPMessage      replymsg;    PSLPHandleInfo  handle      = (PSLPHandleInfo) cookie;    SLPBoolean      result      = SLP_TRUE;#ifdef ENABLE_SLPv2_SECURITY      int             securityenabled;    securityenabled = SLPPropertyAsBoolean(SLPGetProperty("net.slp.securityEnabled"));#endif    /*-------------------------------------------*/    /* Check the errorcode and bail if it is set */    /*-------------------------------------------*/    if(errorcode != SLP_OK)    {        return ColateSLPSrvURLCallback((SLPHandle)handle,                                       0,                                       0,                                       errorcode,                                       handle->params.findsrvs.cookie);    }    /*--------------------*/    /* Parse the replybuf */    /*--------------------*/    replymsg = SLPMessageAlloc();    if(replymsg)    {        if(SLPMessageParseBuffer(peerinfo,replybuf,replymsg) == 0)        {            if(replymsg->header.functionid == SLP_FUNCT_SRVRPLY &&               replymsg->body.srvrply.errorcode == 0)            {                urlentry = replymsg->body.srvrply.urlarray;                            for(i=0;i<replymsg->body.srvrply.urlcount;i++)                {                    #ifdef ENABLE_SLPv2_SECURITY                    /*-------------------------------*/                    /* Validate the authblocks       */                    /*-------------------------------*/                    if(securityenabled &&                       SLPAuthVerifyUrl(handle->hspi,                                        1,                                        &(urlentry[i])))                    {                        /* authentication failed skip this URLEntry */                        continue;                    }#endif                    /*--------------------------------*/                    /* Send the URL to the API caller */                    /*--------------------------------*/                    /* TRICKY: null terminate the url by setting the authcount to 0 */                    ((char*)(urlentry[i].url))[urlentry[i].urllen] = 0;                        result = ColateSLPSrvURLCallback((SLPHandle)handle,                                                     urlentry[i].url,                                                     (unsigned short)urlentry[i].lifetime,                                                     SLP_OK,                                                     handle->params.findsrvs.cookie);                    if(result == SLP_FALSE)                    {                        break;                    }                }             }            else if(replymsg->header.functionid == SLP_FUNCT_DAADVERT &&                    replymsg->body.daadvert.errorcode == 0)            {#ifdef ENABLE_SLPv2_SECURITY                if(securityenabled &&                   SLPAuthVerifyDAAdvert(handle->hspi,                                         1,                                         &(replymsg->body.daadvert)))                {                    /* Verification failed. Ignore message */                    SLPMessageFree(replymsg);                    return SLP_TRUE;                }#endif                ((char*)(replymsg->body.daadvert.url))[replymsg->body.daadvert.urllen] = 0;                result = ColateSLPSrvURLCallback((SLPHandle)handle,                                                 replymsg->body.daadvert.url,                                                 SLP_LIFETIME_MAXIMUM,                                                 SLP_OK,                                                 handle->params.findsrvs.cookie);            }            else if(replymsg->header.functionid == SLP_FUNCT_SAADVERT)            {#ifdef ENABLE_SLPv2_SECURITY                if(securityenabled &&                   SLPAuthVerifySAAdvert(handle->hspi,                                         1,                                         &(replymsg->body.saadvert)))                {                    /* Verification failed. Ignore message */                    SLPMessageFree(replymsg);                    return SLP_TRUE;                }#endif                ((char*)(replymsg->body.saadvert.url))[replymsg->body.saadvert.urllen] = 0;                result = ColateSLPSrvURLCallback((SLPHandle)handle,                                                 replymsg->body.saadvert.url,                                                 SLP_LIFETIME_MAXIMUM,                                                 SLP_OK,                                                 handle->params.findsrvs.cookie);            }        }                SLPMessageFree(replymsg);    }        return result;}/*-------------------------------------------------------------------------*/SLPError ProcessSrvRqst(PSLPHandleInfo handle)/*-------------------------------------------------------------------------*/{    struct sockaddr_in  peeraddr;    int                 sock        = -1;    int                 bufsize     = 0;    char*               buf         = 0;    char*               curpos      = 0;    SLPError            result      = 0;#ifdef ENABLE_SLPv2_SECURITY    int                 spistrlen   = 0;    char*               spistr      = 0;#endif    /*------------------------------------------*/    /* Is this a special attempt to locate DAs? */    /*------------------------------------------*/    if(strncasecmp(handle->params.findsrvs.srvtype,                   SLP_DA_SERVICE_TYPE,                   handle->params.findsrvs.srvtypelen) == 0)    {        KnownDAProcessSrvRqst(handle);        goto FINISHED;    }

⌨️ 快捷键说明

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