/* This file is part of Mailfromd. Copyright (C) 2007-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 char ** config_array_to_argv (mu_config_value_t *val) { int i, j; int argc; char **argv; argc = val->v.arg.c; argv = mu_calloc (argc + 1, sizeof (argv[0])); for (i = j = 0; i < argc; i++) { if (mu_cfg_assert_value_type (&val->v.arg.v[i], MU_CFG_STRING) == 0) argv[j++] = mu_strdup (val->v.arg.v[i].v.string); } argv[j] = NULL; return argv; } char * config_array_to_string (mu_config_value_t *val) { size_t len = 0; int i; char *str, *p; for (i = 0; i < val->v.arg.c; i++) { if (mu_cfg_assert_value_type (&val->v.arg.v[i], MU_CFG_STRING)) return NULL; len += strlen (val->v.arg.v[i].v.string) + 1; } str = mu_alloc (len); p = str; for (i = 0; i < val->v.arg.c; i++) { size_t n = strlen (val->v.arg.v[i].v.string); memcpy (p, val->v.arg.v[i].v.string, n); p += n; *p++ = ' '; } str[len-1] = 0; return str; } int config_cb_timeout (struct timeval *pt, mu_config_value_t *val) { int rc; const char *endp; time_t t; const char *str; char *alloc_str = NULL; switch (val->type) { case MU_CFG_STRING: str = val->v.string; break; case MU_CFG_ARRAY: str = alloc_str = config_array_to_string (val); if (!str) return 1; break; case MU_CFG_LIST: mu_error (_("unexpected list")); return 1; default: mu_error (_("INTERNAL ERROR at %s:%d: please report"), __FILE__, __LINE__); abort(); } rc = parse_time_interval (str, &t, &endp); if (rc) mu_error (_("unrecognized time format (near `%s')"), endp); else { pt->tv_usec = 0; pt->tv_sec = t; } free (alloc_str); return 0; } int config_cb_ignore(void *data, mu_config_value_t *val) { mu_diag_output (MU_DIAG_WARNING, _("this statement has no effect in %s"), PACKAGE_STRING); return 0; } int config_cb_lock_retry_count(void *data, mu_config_value_t *val) { int rc; char *errmsg; size_t v; if (mu_cfg_assert_value_type(val, MU_CFG_STRING)) return 1; rc = mu_str_to_c(val->v.string, mu_c_size, &v, &errmsg); if (rc) { mu_error(_("%s: not a valid number"), val->v.string); free(errmsg); return 1; } mu_locker_set_default_retry_count(v); return 0; } int config_cb_lock_retry_timeout(void *data, mu_config_value_t *val) { int rc; char *errmsg; time_t v; rc = mu_str_to_c(val->v.string, mu_c_time, &v, &errmsg); if (rc) { mu_error(_("%s: not a valid interval"), val->v.string); free(errmsg); return 1; } mu_locker_set_default_retry_timeout(v); return 0; } int stderr_closed_p() { int fd = dup(0); if (fd < 0) return 1; close(fd); return fd <= 2; } int mf_list_compare_string(const void *item, const void *value) { return strcmp(item, value); }