/* GNU Mailutils -- a suite of utilities for electronic mail Copyright (C) 1999-2021 Free Software Foundation, Inc. GNU Mailutils 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. GNU Mailutils 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 GNU Mailutils. If not, see . */ /* Global MH state. */ #include static const char *current_folder = NULL; int rcpt_mask = RCPT_DEFAULT; int mh_auto_install = 1; mu_property_t mh_read_property_file (char *name, int ro) { mu_property_t prop; struct mu_mh_prop *mhprop; int rc; mhprop = mu_zalloc (sizeof (mhprop[0])); mhprop->filename = name; mhprop->ro = ro; rc = mu_property_create_init (&prop, mu_mh_property_init, mhprop); if (rc) { mu_diag_funcall (MU_DIAG_ERROR, "mu_property_create_init", name, rc); exit (1); } return prop; } static int prop_merger (const char *field, const char *value, void *data) { mu_property_t dst = data; return mu_property_set_value (dst, field, value, 1); } void mh_property_merge (mu_property_t dst, mu_property_t src) { int rc; if (!src) return; rc = mu_mhprop_iterate (src, prop_merger, dst); if (rc) { mu_diag_funcall (MU_DIAG_ERROR, "mu_mhprop_iterate", NULL, rc); exit (1); } } /* Global profile */ void _mh_init_global_context () { char *p, *ctx_name; if (mu_mh_context) return; p = getenv ("CONTEXT"); if (!p) p = MH_CONTEXT_FILE; ctx_name = mh_expand_name (NULL, p, NAME_ANY); mu_mh_context = mh_read_property_file (ctx_name, 0); if (!current_folder) current_folder = mh_global_context_get ("Current-Folder", mh_global_profile_get ("Inbox", "inbox")); } void mh_read_profile () { char *p; const char *fallback; p = getenv ("MH"); if (p) p = mu_tilde_expansion (p, MU_HIERARCHY_DELIMITER, NULL); else { char *home = mu_get_homedir (); if (!home) abort (); /* shouldn't happen */ p = mh_safe_make_file_name (home, MH_USER_PROFILE); free (home); } if (mh_auto_install && access (p, R_OK)) mh_install (p, 1); mu_mh_profile = mh_read_property_file (p, 0); mu_set_folder_directory (mh_get_dir ()); mh_set_reply_regex (mh_global_profile_get ("Reply-Regex", NULL)); fallback = mh_global_profile_get ("Decode-Fallback", NULL); if (fallback && mu_set_default_fallback (fallback)) mu_error (_("Incorrect value for decode-fallback")); _mh_init_global_context (); } /* Global context */ const char * mh_current_folder () { return mh_global_context_get ("Current-Folder", mh_global_profile_get ("Inbox", "inbox")); } const char * mh_set_current_folder (const char *val) { int rc = mh_global_context_set ("Current-Folder", val); if (rc) { mu_diag_funcall (MU_DIAG_ERROR, "mh_global_context_set", "Current-Folder", rc); exit (1); } current_folder = mh_current_folder (); return current_folder; } /* Global sequences */ mu_property_t mh_mailbox_get_property (mu_mailbox_t mbox) { mu_property_t prop; int rc = mu_mailbox_get_property (mbox, &prop); if (rc) { mu_diag_funcall (MU_DIAG_ERROR, "mu_mailbox_get_property", NULL, rc); exit (1); } return prop; } void mh_global_sequences_drop (mu_mailbox_t mbox) { mu_property_t prop = mh_mailbox_get_property (mbox); int rc = mu_property_clear (prop); if (rc) { mu_diag_funcall (MU_DIAG_ERROR, "mu_property_clear", NULL, rc); exit (1); } } const char * mh_global_sequences_get (mu_mailbox_t mbox, const char *name, const char *defval) { mu_property_t prop = mh_mailbox_get_property (mbox); const char *s; int rc = mu_property_sget_value (prop, name, &s); if (rc == MU_ERR_NOENT) s = defval; else if (rc) { mu_diag_funcall (MU_DIAG_ERROR, "mu_property_sget_value", name, rc); exit (1); } return s; } void mh_global_sequences_set (mu_mailbox_t mbox, const char *name, const char *value) { mu_property_t prop = mh_mailbox_get_property (mbox); int rc = mu_property_set_value (prop, name, value, 1); if (rc && !(!value && rc == MU_ERR_NOENT)) { mu_diag_funcall (MU_DIAG_ERROR, "mu_property_set_value", name, rc); exit (1); } } void mh_global_sequences_iterate (mu_mailbox_t mbox, mu_mhprop_iterator_t fp, void *data) { int rc; mu_iterator_t itr; mu_property_t prop = mh_mailbox_get_property (mbox); rc = mu_property_get_iterator (prop, &itr); if (rc) { mu_diag_funcall (MU_DIAG_ERROR, "mu_property_get_iterator", NULL, rc); exit (1); } mu_mhprop_iterate (prop, fp, data); } /* Global state */ void mh_global_save_state () { int rc; mh_global_context_set ("Current-Folder", current_folder); rc = mu_property_save (mu_mh_context); if (rc) { mu_diag_funcall (MU_DIAG_ERROR, "mu_property_save", "context", rc); exit (1); } }