/* $Id: config_api.c,v 1.21 2011/06/28 00:13:48 sbajic Exp $ */ /* DSPAM COPYRIGHT (C) 2002-2012 DSPAM PROJECT This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ /* * config_api.c - configuration functions for populating libdspam properties * * DESCRIPTION * The functions in this section are used to manipulate the libdspam * context using various APIs. Specifically, the properties API and the * storage attach API are used here. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #ifdef HAVE_STRINGS_H #include #endif #include #include "config_api.h" #include "read_config.h" #include "error.h" #include "language.h" #include "libdspam.h" #include "util.h" /* * set_libdspam_attributes(DSPAM_CTX *CTX) * * DESCRIPTION * populate libdspam properties with relevant configuration values from * dspam.conf. since dspam.conf is owned by the agent, libdspam doesn't read * it directly; we rely on this api to configure the context. * * INPUT ARGUMENTS * CTX dspam context to configure * * RETURN VALUES * returns 0 on success */ int set_libdspam_attributes(DSPAM_CTX *CTX) { attribute_t t; int i, ret = 0; char *profile; t = _ds_find_attribute(agent_config, "IgnoreHeader"); while(t) { ret += dspam_addattribute(CTX, t->key, t->value); t = t->next; } profile = _ds_read_attribute(agent_config, "DefaultProfile"); for(i=0;agent_config[i];i++) { t = agent_config[i]; while(t) { if (!strncasecmp(t->key, "MySQL", 5) || !strncasecmp(t->key, "PgSQL", 5) || !strncasecmp(t->key, "SQLite", 6) || !strcasecmp(t->key, "LocalMX") || !strncasecmp(t->key, "Storage", 7) || !strncasecmp(t->key, "Processor", 9) || !strncasecmp(t->key, "Hash", 4)) { if (profile == NULL || profile[0] == 0) { ret += dspam_addattribute(CTX, t->key, t->value); } else if (strchr(t->key, '.')) { if (!strcasecmp((strchr(t->key, '.')+1), profile)) { char *x = strdup(t->key); char *y = strchr(x, '.'); y[0] = 0; ret += dspam_addattribute(CTX, x, t->value); free(x); } } } t = t->next; } } ret += configure_algorithms(CTX); return ret; } /* * attach_context(DSPAM_CTX *CTX, void *dbh) * * DESCRIPTION * attach a database handle to an initialized dspam context * * INPUT ARGUMENTS * CTX dspam context * dbh database handle to attach * * RETURN VALUES * returns 0 on success */ int attach_context(DSPAM_CTX *CTX, void *dbh) { int maxtries = 1, tries = 0; int r; if (!_ds_read_attribute(agent_config, "DefaultProfile")) return dspam_attach(CTX, dbh); /* Perform failover if an attach fails */ if (_ds_read_attribute(agent_config, "FailoverAttempts")) maxtries = atoi(_ds_read_attribute(agent_config, "FailoverAttempts")); r = dspam_attach(CTX, dbh); while (r && tries < maxtries) { char key[128]; char *failover; snprintf(key, sizeof(key), "Failover.%s", _ds_read_attribute(agent_config, "DefaultProfile")); failover = _ds_read_attribute(agent_config, key); if (!failover) { LOG(LOG_ERR, ERR_AGENT_FAILOVER_OUT); return r; } LOG(LOG_WARNING, ERR_AGENT_FAILOVER, failover); _ds_overwrite_attribute(agent_config, "DefaultProfile", failover); if (dspam_clearattributes(CTX)) { LOG(LOG_ERR, ERR_AGENT_CLEAR_ATTRIB); return r; } set_libdspam_attributes(CTX); tries++; r = dspam_attach(CTX, dbh); } return r; }