/* This file is part of Mailfromd. Copyright (C) 2005-2020 Sergey Poznyakoff 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; either version 3, 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "libmf.h" #include "mfdb.h" static int cb_db_expire_interval(void *data, mu_config_value_t *arg) { time_t *iptr = data; struct timeval tv; int rc; rc = config_cb_timeout(&tv, arg); *iptr = tv.tv_sec; return rc; } static int cb_db_positive_expire_interval(void *data, mu_config_value_t *arg) { struct db_format *fmt = data; struct timeval tv; int rc; if (fmt != cache_format) { mu_error (_("positive-expire-interval is valid only " "for cache database")); return 0; } rc = config_cb_timeout(&tv, arg); if (rc == 0) fmt->expire_interval = tv.tv_sec; return rc; } static int cb_db_negative_expire_interval(void *data, mu_config_value_t *arg) { struct db_format *fmt = data; struct timeval tv; int rc = config_cb_timeout(&tv, arg); if (fmt == cache_format) negative_expire_interval = tv.tv_sec; else mu_error(_("negative-expire-interval is valid only " "for cache database")); return rc; } int cb_database_file(void *data, mu_config_value_t *arg) { char **pname = data; if (mu_cfg_assert_value_type(arg, MU_CFG_STRING)) return 1; *pname = mu_strdup(arg->v.string); return 0; } struct mu_cfg_param database_section_param[] = { { "file", mu_cfg_callback, NULL, offsetof(struct db_format, dbname), cb_database_file, N_("Name of the database file"), N_("name: string") }, { "enable", mu_c_bool, NULL, offsetof(struct db_format, enabled), NULL, N_("Enable or disable the database") }, { "expire-interval", mu_cfg_callback, NULL, offsetof(struct db_format, expire_interval), cb_db_expire_interval, N_("Set database record expiration interval"), N_("arg: interval") }, { "positive-expire-interval", mu_cfg_callback, NULL, 0, cb_db_positive_expire_interval, N_("Set positive expiration interval (for database \"cache\" only)"), N_("arg: interval") }, { "negative-expire-interval", mu_cfg_callback, NULL, 0, cb_db_negative_expire_interval, N_("Set negative expiration interval " "(for database id \"cache\")"), N_("arg: interval") }, { NULL } }; static int database_section_parser (enum mu_cfg_section_stage stage, const mu_cfg_node_t *node, const char *section_label, void **section_data, void *call_data, mu_cfg_tree_t *tree) { switch (stage) { case mu_cfg_section_start: { struct db_format *fmt; if (mu_cfg_assert_value_type(node->label, MU_CFG_STRING)) return 0; fmt = db_format_lookup(node->label->v.string); if (fmt == NULL) { mu_error(_("unknown database format: %s"), node->label->v.string); return 0; } *section_data = fmt; } break; case mu_cfg_section_end: break; } return 0; } int cb_database_mode(void *data, mu_config_value_t *arg) { unsigned long mode; char *end; if (mu_cfg_assert_value_type(arg, MU_CFG_STRING)) return 1; mode = strtoul(arg->v.string, &end, 0); if (*end || (mode & ~0777)) { mu_error("%s", _("invalid file mode")); return 1; } else *(int*)data = mode; return 0; } void database_cfg_init() { struct mu_cfg_section *section; if (mu_create_canned_section("database", §ion) == 0) { section->label = N_("id"); section->parser = database_section_parser; section->docstring = N_("Define a database."); mu_cfg_section_add_params(section, database_section_param); } #if 0 // FIXME: If MU had canned params, I could've done something along these // lines. Unfortunately, it doesn't if (mu_create_canned_param ("database-mode", ¶m) == 0) { param->type = mu_cfg_callback; param->callback = cb_database_mode; param->docstring = N_("Configure file mode for database files"); param->argname = N_("mode: octal"); } #endif }