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 + -
显示快捷键?