slp_property.c

来自「SLP协议在linux下的实现。此版本为1.2.1版。官方网站为www.open」· C语言 代码 · 共 434 行

C
434
字号
/***************************************************************************//*                                                                         *//* Project:     OpenSLP - OpenSource implementation of Service Location    *//*              Protocol                                                   *//*                                                                         *//* File:        slplib_property.c                                          *//*                                                                         *//* Abstract:    Implementation for SLPGetProperty() and SLPSetProperty()   *//*                                                                         *//*-------------------------------------------------------------------------*//*                                                                         *//*     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 <stdlib.h>#include <stdio.h>#include <string.h>#include <errno.h>#ifndef _WIN32# ifdef HAVE_CONFIG_H#  include "config.h"#  define SLP_VERSION VERSION# endif#endif#include "slp_property.h"#include "slp_xmalloc.h"/*=========================================================================*//* Global Variables                                                        *//*=========================================================================*/SLPList G_SLPPropertyList = {0,0,0};/*-------------------------------------------------------------------------*/SLPProperty* Find(const char* pcName)/* Finds the property in the property list with the specified name.        *//*                                                                         *//* pcName   pointer to the property name                                   *//*                                                                         *//* Returns: pointer to the requested property or null if the requested     *//*          property was not found.                                        *//*-------------------------------------------------------------------------*/{    SLPProperty*  curProperty;    curProperty = (SLPProperty*)G_SLPPropertyList.head;    while(curProperty != 0)    {        if(strcmp(curProperty->propertyName,pcName) == 0)        {            break;        }        curProperty = (SLPProperty*)curProperty->listitem.next;    }    return curProperty;}/*=========================================================================*/const char* SLPPropertyGet(const char* pcName)/*=========================================================================*/{    SLPProperty* existingProperty = Find(pcName);    if(existingProperty)    {        return existingProperty->propertyValue;    }    return 0;}/*=========================================================================*/int SLPPropertySet(const char *pcName,                   const char *pcValue)/*=========================================================================*/{    int             pcNameSize;     int             pcValueSize;    SLPProperty*    newProperty;     if(pcValue == 0)    {       /* Bail for right now */       return 0;    }        newProperty = Find(pcName);    pcNameSize = strlen(pcName) + 1;    pcValueSize = strlen(pcValue) + 1;    if(newProperty == 0)    {        /* property does not exist in the list */        newProperty = (SLPProperty*)xmalloc(sizeof(SLPProperty) + pcNameSize + pcValueSize);        if(newProperty == 0)        {            /* out of memory */            errno = ENOMEM;            return -1;        }        /* set the pointers in the SLPProperty structure to point to areas of    */        /* the previously allocated block of memory                              */        newProperty->propertyName   = ((char*)newProperty) + sizeof(SLPProperty);         newProperty->propertyValue  = newProperty->propertyName + pcNameSize;        /* copy the passed in name and value */        memcpy(newProperty->propertyName,pcName,pcNameSize);        memcpy(newProperty->propertyValue,pcValue,pcValueSize);        /* Link the new property into the list */        SLPListLinkHead(&G_SLPPropertyList,(SLPListItem*)newProperty);    }    else    {        SLPListUnlink(&G_SLPPropertyList,(SLPListItem*)newProperty);        /* property already exists in the list */        newProperty = (SLPProperty*)xrealloc(newProperty,sizeof(SLPProperty) + pcNameSize + pcValueSize);            if(newProperty == 0)        {            /* out of memory */            errno = ENOMEM;            return -1;        }        /* set the pointers in the SLPProperty structure to point to areas of    */        /* the previously allocated block of memory                              */        newProperty->propertyName   = ((char*)newProperty) + sizeof(SLPProperty);         newProperty->propertyValue  = newProperty->propertyName + pcNameSize;        /* copy the passed in name and value */        memcpy(newProperty->propertyName,pcName,pcNameSize);        memcpy(newProperty->propertyValue,pcValue,pcValueSize);        SLPListLinkHead(&G_SLPPropertyList,(SLPListItem*)newProperty);    }    return 0;}/*-------------------------------------------------------------------------*/int SetDefaultValues()/*-------------------------------------------------------------------------*/{    int result = 0;                                    result |= SLPPropertySet("net.slp.isBroadcastOnly","false");    result |= SLPPropertySet("net.slp.multicastTimeouts","500,750,1000,1500,2000,3000");    result |= SLPPropertySet("net.slp.multicastMaximumWait","5000");    result |= SLPPropertySet("net.slp.unicastTimeouts","500,750,1000,1500,2000,3000");    result |= SLPPropertySet("net.slp.unicastMaximumWait","5000");    result |= SLPPropertySet("net.slp.datagramTimeouts","");    result |= SLPPropertySet("net.slp.maxResults","256");    result |= SLPPropertySet("net.slp.DADiscoveryTimeouts","500,750,1000,1500,2000,3000");    result |= SLPPropertySet("net.slp.DADiscoveryMaximumWait","2000");    result |= SLPPropertySet("net.slp.DAActiveDiscoveryInterval","1");    result |= SLPPropertySet("net.slp.DAAddresses","");    result |= SLPPropertySet("net.slp.watchRegistrationPID","true");    result |= SLPPropertySet("net.slp.activeDADetection","true");    result |= SLPPropertySet("net.slp.passiveDADetection","true");    result |= SLPPropertySet("net.slp.useScopes","default");    result |= SLPPropertySet("net.slp.locale","en");    result |= SLPPropertySet("net.slp.randomWaitBound","5000");    result |= SLPPropertySet("net.slp.interfaces","");    result |= SLPPropertySet("net.slp.securityEnabled","false");    result |= SLPPropertySet("net.slp.multicastTTL","8");    result |= SLPPropertySet("net.slp.MTU","1400");    result |= SLPPropertySet("net.slp.traceMsg","false");    result |= SLPPropertySet("net.slp.traceReg","false");    result |= SLPPropertySet("net.slp.traceDrop","false");    result |= SLPPropertySet("net.slp.traceDATraffic","false");    result |= SLPPropertySet("net.slp.isDA","false");    result |= SLPPropertySet("net.slp.DAHeartBeat","10800");    result |= SLPPropertySet("net.slp.securityEnabled","false");    result |= SLPPropertySet("net.slp.checkSourceAddr","true");    result |= SLPPropertySet("net.slp.OpenSLPVersion", SLP_VERSION);    return result;}/*=========================================================================*/int SLPPropertyReadFile(const char* conffile)/* Reads and sets properties from the specified configuration file         *//*                                                                         *//* conffile     (IN) the path of the config file to read.                  *//*                                                                         *//* Returns  -   zero on success. non-zero on error.  Properties will be set*//*              to default on error.                                       *//*=========================================================================*/{    char*   line;    char*   alloced;    FILE*   fp;    char*   namestart;    char*   nameend;    char*   valuestart;    char*   valueend;     if(SetDefaultValues())    {        return -1;    }    alloced = xmalloc(4096);    if(alloced == 0)    {        /* out of memory */        errno = ENOMEM;        return -1;    }    fp = fopen(conffile,"r");    if(!fp)    {        goto CLEANUP;    }    /* Set the property that keeps track of conffile */    SLPPropertySet("net.slp.OpenSLPConfigFile",conffile);    while(fgets(alloced,4096,fp))    {        line = alloced;        /* trim whitespace */        while(*line && *line <= 0x20)        {            line++;        }        if(*line == 0)        {            continue;        }        /* skip commented lines */        if(*line == '#' || *line == ';')        {            continue;        }        /* parse out the property name*/        namestart = line;        nameend = line;        nameend = strchr(nameend,'=');        if(nameend == 0)        {            continue;        }        valuestart = nameend + 1;  /* start of value for later*/        while(*nameend <= 0x20 || *nameend == '=')        {            *nameend = 0;            nameend --;        }        /* parse out the property value */        while(*valuestart && *valuestart <= 0x20)        {            valuestart++;        }        valueend = valuestart;        /* Seek to the end of the value */        while(*valueend)        {            valueend++;        }                /* Remove any whitespace that might be present */        while(valueend != valuestart && *valueend <= 0x20)        {            *valueend = 0;            valueend --;        }        /* set the property */        if(valuestart && *valuestart)        {            SLPPropertySet(namestart, valuestart);        }    }       CLEANUP:    if(fp)    {        fclose(fp);    }    if(alloced)    {        xfree(alloced);    }    return 0;}/*=========================================================================*/int SLPPropertyAsBoolean(const char* property)/*=========================================================================*/{    if(property)    {        if(*property == 't' ||           *property == 'T' ||           *property == 'y' ||           *property == 'Y' ||           *property == '1')        {            return 1;        }    }    return 0;}/*=========================================================================*/int SLPPropertyAsInteger(const char* property)/*=========================================================================*/{    return atoi(property);}/*=========================================================================*/int SLPPropertyAsIntegerVector(const char* property,                                int* vector,                                int vectorsize)/*=========================================================================*/{    int         i;    char*       slider1;    char*       slider2;    char*       temp;    char*       end;    memset(vector,0,sizeof(int)*vectorsize);    temp = xstrdup(property);    if(temp == 0)    {        return 0;    }    end = temp + strlen(property);    slider1 = slider2 = temp;    for(i=0;i<vectorsize;i++)    {        while(*slider2 && *slider2 != ',') slider2++;        *slider2 = 0;        vector[i] = SLPPropertyAsInteger(slider1);        slider2++;        if(slider2 >= end)        {            break;        }        slider1 = slider2;    }    xfree(temp);    return i;}#ifdef DEBUG/*=========================================================================*/void SLPPropertyFreeAll()/*=========================================================================*/{    SLPProperty* property;    SLPProperty* del;    property = (SLPProperty*)G_SLPPropertyList.head;    while(property)    {        del = property;        property = (SLPProperty*)property->listitem.next;        xfree(del);    }    memset(&G_SLPPropertyList,0,sizeof(G_SLPPropertyList));}#endif

⌨️ 快捷键说明

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