/* $Id: config_shared.c,v 1.9 2006/05/13 01:12:59 jonz Exp $ */
/*
DSPAM
COPYRIGHT (C) 2002-2006 JONATHAN A. ZDZIARSKI
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2
of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
* config_shared.c - attributes-based configuration functionsc
*
* DESCRIPTION
* Attribtues are used by the agent and libdspam to control configuration
* management. The included functions perform various operations on the
* configuration structures supplied.
*
* Because these functions are used by libdspam, they are prefixed with _ds_
*/
#ifdef HAVE_CONFIG_H
#include <auto-config.h>
#endif
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include "config_shared.h"
#include "error.h"
#include "language.h"
#include "libdspam.h"
attribute_t _ds_find_attribute(config_t config, const char *key) {
int i;
if (config == NULL) { return NULL; }
for(i=0;config[i];i++) {
attribute_t attr = config[i];
if (!strcasecmp(attr->key, key)) {
return attr;
}
}
return NULL;
}
int _ds_add_attribute(config_t config, const char *key, const char *val) {
attribute_t attr;
int i;
#ifdef VERBOSE
LOGDEBUG("attribute %s = %s", key, val);
#endif
attr = _ds_find_attribute(config, key);
if (!attr) {
for(i=0;config[i];i++) { }
config[i+1] = 0;
config[i] = malloc(sizeof(struct attribute));
if (!config[i]) {
LOG(LOG_CRIT, ERR_MEM_ALLOC);
return EUNKNOWN;
}
attr = config[i];
} else {
while(attr->next != NULL) {
attr = attr->next;
}
attr->next = malloc(sizeof(struct attribute));
if (!attr->next) {
LOG(LOG_CRIT, ERR_MEM_ALLOC);
return EUNKNOWN;
}
attr = attr->next;
}
attr->key = strdup(key);
attr->value = strdup(val);
attr->next = NULL;
return 0;
}
int _ds_overwrite_attribute(config_t config, const char *key, const char *val)
{
attribute_t attr;
#ifdef VERBOSE
LOGDEBUG("overwriting attribute %s with value '%s'", key, val);
#endif
attr = _ds_find_attribute(config, key);
if (attr == NULL) {
return _ds_add_attribute(config, key, val);
}
free(attr->value);
attr->value = strdup(val);
return 0;
}
char *_ds_read_attribute(config_t config, const char *key) {
attribute_t attr = _ds_find_attribute(config, key);
if (!attr)
return NULL;
return attr->value;
}
int _ds_match_attribute(config_t config, const char *key, const char *val) {
attribute_t attr;
attr = _ds_find_attribute(config, key);
if (!attr)
return 0;
while(strcasecmp(attr->value, val) && attr->next != NULL)
attr = attr->next;
if (!strcasecmp(attr->value, val))
return 1;
return 0;
}
void _ds_destroy_config(config_t config) {
attribute_t x, y;
int i;
for(i=0;config[i];i++) {
x = config[i];
while(x) {
y = x->next;
free(x->key);
free(x->value);
free(x);
x = y;
}
}
free(config);
return;
}
syntax highlighted by Code2HTML, v. 0.9.1