You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

434 lines
15 KiB

/***************************************************************************/
/* */
/* 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