summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mh/Makefile.am1
-rw-r--r--mh/folder.c11
-rw-r--r--mh/mh.h40
-rw-r--r--mh/mh_ctx.c231
-rw-r--r--mh/mh_global.c145
-rw-r--r--mh/mh_whom.c22
-rw-r--r--mh/send.c71
-rw-r--r--po/POTFILES.in1
8 files changed, 153 insertions, 369 deletions
diff --git a/mh/Makefile.am b/mh/Makefile.am
index 5ddf5fd3a..07bc60c93 100644
--- a/mh/Makefile.am
+++ b/mh/Makefile.am
@@ -68,7 +68,6 @@ libmh_a_SOURCES= \
mh_alias_gram.c\
mh_alias_lex.c\
mh_argp.c\
- mh_ctx.c\
mh_getopt.c\
mh_global.c\
mh_format.c\
diff --git a/mh/folder.c b/mh/folder.c
index 0df51c369..d38bc4b1d 100644
--- a/mh/folder.c
+++ b/mh/folder.c
@@ -272,18 +272,15 @@ static void
read_seq_file (struct folder_info *info, const char *prefix, const char *name)
{
char *pname = NULL;
- mh_context_t *ctx;
+ mu_property_t prop;
const char *p;
pname = mh_safe_make_file_name (prefix, name);
- ctx = mh_context_create (pname, 1);
- mh_context_read (ctx);
+ prop = mh_read_property_file (pname, 1);
- p = mh_context_get_value (ctx, "cur", NULL);
- if (p)
+ if (mu_property_sget_value (prop, "cur", &p) == 0)
info->cur = strtoul (p, NULL, 0);
- free (pname);
- free (ctx);
+ mu_property_destroy (&prop);
}
static void
diff --git a/mh/mh.h b/mh/mh.h
index b9b89ef1f..b2873f3f9 100644
--- a/mh/mh.h
+++ b/mh/mh.h
@@ -56,6 +56,7 @@
#include <mailutils/mime.h>
#include <mailutils/io.h>
#include <mailutils/property.h>
+#include <mailutils/mh.h>
#include <mu_umaxtostr.h>
@@ -228,9 +229,6 @@ struct mh_whatnow_env /* whatnow shell environment */
#define DISP_USE 1
#define DISP_REPLACE 2
-typedef int (*mh_context_iterator) (const char *field, const char *value,
- void *data);
-
#define SEQ_PRIVATE 1
#define SEQ_ZERO 2
@@ -246,10 +244,23 @@ mu_message_t mh_file_to_message (const char *folder, const char *file_name);
mu_message_t mh_stream_to_message (mu_stream_t stream);
void mh_install (char *name, int automode);
-const char *mh_global_profile_get (const char *name, const char *defval);
-int mh_global_profile_set (const char *name, const char *value);
-const char *mh_global_context_get (const char *name, const char *defval);
-int mh_global_context_set (const char *name, const char *value);
+mu_property_t mh_read_property_file (char *name, int ro);
+void mh_property_merge (mu_property_t dst, mu_property_t src);
+
+#define mh_global_profile_get(name, defval) \
+ mu_mhprop_get_value (mu_mh_profile, name, defval)
+#define mh_global_profile_set(name, value) \
+ mu_property_set_value (mu_mh_profile, name, value, 1))
+#define mh_global_profile_iterate(fp, data) \
+ mu_mhprop_iterate (mu_mh_profile, fp, data)
+
+#define mh_global_context_get(name, defval) \
+ mu_mhprop_get_value (mu_mh_context, name, defval)
+#define mh_global_context_set(name, value) \
+ mu_property_set_value (mu_mh_context, name, value, 1)
+#define mh_global_context_iterate(fp, data) \
+ mu_mhprop_iterate (mu_mh_context, fp, data)
+
const char *mh_set_current_folder (const char *val);
const char *mh_current_folder (void);
@@ -259,12 +270,10 @@ const char *mh_global_sequences_get (mu_mailbox_t mbox,
void mh_global_sequences_set (mu_mailbox_t mbox,
const char *name, const char *value);
void mh_global_sequences_iterate (mu_mailbox_t mbox,
- mh_context_iterator fp, void *data);
+ mu_mhprop_iterator_t fp, void *data);
void mh_global_sequences_drop (mu_mailbox_t mbox);
void mh_global_save_state (void);
-int mh_global_profile_iterate (mh_context_iterator fp, void *data);
-int mh_global_context_iterate (mh_context_iterator fp, void *data);
int mh_interactive_mode_p (void);
int mh_getyn (const char *fmt, ...) MU_PRINTFLIKE(1,2);
@@ -287,17 +296,6 @@ void mh_err_memory (int fatal);
FILE *mh_audit_open (char *name, mu_mailbox_t mbox);
void mh_audit_close (FILE *fp);
-mh_context_t *mh_context_create (const char *name, int copy);
-int mh_context_read (mh_context_t *ctx);
-int mh_context_write (mh_context_t *ctx);
-const char *mh_context_get_value (mh_context_t *ctx, const char *name,
- const char *defval);
-int mh_context_set_value (mh_context_t *ctx, const char *name,
- const char *value);
-int mh_context_iterate (mh_context_t *ctx, mh_context_iterator fp, void *data);
-void mh_context_destroy (mh_context_t **pctx);
-void mh_context_merge (mh_context_t *dst, mh_context_t *src);
-
int mh_message_number (mu_message_t msg, size_t *pnum);
mu_mailbox_t mh_open_folder (const char *folder, int create);
diff --git a/mh/mh_ctx.c b/mh/mh_ctx.c
deleted file mode 100644
index ca497f219..000000000
--- a/mh/mh_ctx.c
+++ /dev/null
@@ -1,231 +0,0 @@
-/* GNU Mailutils -- a suite of utilities for electronic mail
- Copyright (C) 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2009,
- 2010 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 <http://www.gnu.org/licenses/>. */
-
-/* MH context functions. */
-
-#include <mh.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-mh_context_t *
-mh_context_create (const char *name, int copy)
-{
- mh_context_t *ctx;
- ctx = malloc (sizeof (*ctx));
- if (!ctx)
- mh_err_memory (1);
- if (copy)
- ctx->name = name;
- else
- {
- ctx->name = strdup (name);
- if (!ctx->name)
- mh_err_memory (1);
- }
- ctx->header = NULL;
- return ctx;
-}
-
-void
-mh_context_destroy (mh_context_t **pctx)
-{
- mh_context_t *ctx = *pctx;
-
- free ((char*) ctx->name);
- if (ctx->header)
- mu_header_destroy (&ctx->header);
- free (ctx);
- *pctx = NULL;
-}
-
-void
-mh_context_merge (mh_context_t *dst, mh_context_t *src)
-{
- if (!dst->header)
- {
- dst->header = src->header;
- src->header = NULL;
- }
- else
- {
- size_t i, count;
-
- mu_header_get_field_count (src->header, &count);
- for (i = 1; i <= count; i++)
- {
- const char *name = NULL;
- const char *value = NULL;
-
- mu_header_sget_field_name (src->header, i, &name);
- mu_header_sget_field_value (src->header, i, &value);
- mu_header_set_value (dst->header, name, value, 1);
- }
- }
-}
-
-int
-mh_context_read (mh_context_t *ctx)
-{
- int rc;
- char *blurb, *p;
- mu_stream_t stream;
- mu_off_t stream_size;
- char *buf = NULL;
- size_t size = 0, n;
-
- if (!ctx)
- return MU_ERR_OUT_NULL;
-
- rc = mu_file_stream_create (&stream, ctx->name, MU_STREAM_READ);
- if (rc)
- return rc;
-
- rc = mu_stream_size (stream, &stream_size);
- if (rc)
- {
- mu_stream_destroy (&stream);
- return rc;
- }
-
- blurb = malloc (stream_size + 1);
- if (!blurb)
- {
- mu_stream_destroy (&stream);
- return ENOMEM;
- }
-
- p = blurb;
- while (mu_stream_getline (stream, &buf, &size, &n) == 0 && n > 0)
- {
- char *q = mu_str_skip_class (buf, MU_CTYPE_SPACE);
- if (!*q || *q == '#')
- continue;
- for (q = buf; *q;)
- *p++ = *q++;
- }
- mu_stream_destroy (&stream);
- rc = mu_header_create (&ctx->header, blurb, p - blurb);
- free (blurb);
-
- return rc;
-}
-
-int
-mh_context_write (mh_context_t *ctx)
-{
- int rc;
- mu_stream_t instream, outstream;
- mu_off_t size;
-
- if (!ctx)
- return MU_ERR_OUT_NULL;
-
- rc = mu_file_stream_create (&outstream, ctx->name,
- MU_STREAM_WRITE|MU_STREAM_CREAT);
- if (rc)
- {
- mu_error (_("cannot open context file %s for writing: %s"),
- ctx->name, mu_strerror (rc));
- return MU_ERR_FAILURE;
- }
-
- mu_header_get_streamref (ctx->header, &instream);
- rc = mu_stream_copy (outstream, instream, 0, &size);
- if (rc)
- {
- mu_error (_("error writing to context file %s: %s"),
- ctx->name, mu_strerror (rc));
- return MU_ERR_FAILURE;
- }
- else
- rc = mu_stream_truncate (outstream, size);
- mu_stream_destroy (&instream);
- mu_stream_destroy (&outstream);
- return 0;
-}
-
-const char *
-mh_context_get_value (mh_context_t *ctx, const char *name, const char *defval)
-{
- const char *p;
-
- if (!ctx || mu_header_sget_value (ctx->header, name, &p))
- p = defval;
- return p;
-}
-
-int
-mh_context_set_value (mh_context_t *ctx, const char *name, const char *value)
-{
- if (!ctx)
- return EINVAL;
- if (!ctx->header)
- {
- int rc;
- if ((rc = mu_header_create (&ctx->header, NULL, 0)) != 0)
- {
- mu_error (_("cannot create context %s: %s"),
- ctx->name,
- mu_strerror (rc));
- return 1;
- }
- }
- return mu_header_set_value (ctx->header, name, value, 1);
-}
-
-int
-mh_context_iterate (mh_context_t *ctx, mh_context_iterator fp, void *data)
-{
- size_t i, nfields;
- int rc = 0;
-
- if (!ctx)
- return EINVAL;
- if (!ctx->header)
- return 0;
- rc = mu_header_get_field_count (ctx->header, &nfields);
- if (rc)
- {
- mu_error (_("cannot obtain field count for context %s"), ctx->name);
- return rc;
- }
-
- for (i = 1; i <= nfields && rc == 0; i++)
- {
- const char *name, *value;
-
- rc = mu_header_sget_field_name (ctx->header, i, &name);
- if (rc)
- {
- mu_error (_("cannot obtain field name for context %s:%d: %s"),
- ctx->name,i,mu_strerror (rc));
- break;
- }
-
- rc = mu_header_sget_field_value (ctx->header, i, &value);
- if (rc)
- {
- mu_error (_("cannot obtain field value for context %s:%d: %s"),
- ctx->name,i,mu_strerror (rc));
- break;
- }
-
- rc = fp (name, value, data);
- }
-
- return rc;
-}
diff --git a/mh/mh_global.c b/mh/mh_global.c
index 229447731..7de44b87c 100644
--- a/mh/mh_global.c
+++ b/mh/mh_global.c
@@ -20,29 +20,70 @@
#include <mh.h>
static const char *current_folder = NULL;
-mh_context_t *context;
-mh_context_t *profile;
int rcpt_mask = RCPT_DEFAULT;
int mh_auto_install = 1;
-/* Global profile */
+mu_property_t
+mh_read_property_file (char *name, int ro)
+{
+ mu_property_t prop;
+ struct mu_mh_prop *mhprop;
+ int rc;
+
+ mhprop = xzalloc (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;
+}
-const char *
-mh_global_profile_get (const char *name, const char *defval)
+static int
+prop_merger (const char *field, const char *value, void *data)
{
- return mh_context_get_value (profile, name, defval);
+ mu_property_t dst;
+ return mu_property_set_value (dst, field, value, 1);
}
-int
-mh_global_profile_set (const char *name, const char *value)
+void
+mh_property_merge (mu_property_t dst, mu_property_t src)
{
- return mh_context_set_value (profile, name, value);
+ 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 */
-int
-mh_global_profile_iterate (mh_context_iterator fp, void *data)
+void
+_mh_init_global_context ()
{
- return mh_context_iterate (profile, fp, data);
+ 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, 0);
+
+ 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
@@ -66,8 +107,7 @@ mh_read_profile ()
if (mh_auto_install && access (p, R_OK))
mh_install (p, 1);
- profile = mh_context_create (p, 1);
- mh_context_read (profile);
+ mu_mh_profile = mh_read_property_file (p, 0);
mu_set_folder_directory (mh_get_dir ());
@@ -75,55 +115,15 @@ mh_read_profile ()
fallback = mh_global_profile_get ("Decode-Fallback", NULL);
if (fallback && mu_set_default_fallback (fallback))
mu_error (_("Incorrect value for decode-fallback"));
-}
-
-/* Global context */
-void
-_mh_init_global_context ()
-{
- char *p, *ctx_name;
-
- if (context)
- return;
- p = getenv ("CONTEXT");
- if (!p)
- p = MH_CONTEXT_FILE;
- ctx_name = mh_expand_name (NULL, p, 0);
- context = mh_context_create (ctx_name, 1);
- mh_context_read (context);
-
- if (!current_folder)
- current_folder = mh_context_get_value (context, "Current-Folder",
- mh_global_profile_get ("Inbox",
- "inbox"));
-}
-
-const char *
-mh_global_context_get (const char *name, const char *defval)
-{
- _mh_init_global_context ();
- return mh_context_get_value (context, name, defval);
-}
-
-int
-mh_global_context_set (const char *name, const char *value)
-{
_mh_init_global_context ();
- return mh_context_set_value (context, name, value);
}
-int
-mh_global_context_iterate (mh_context_iterator fp, void *data)
-{
- _mh_init_global_context ();
- return mh_context_iterate (context, fp, data);
-}
+/* Global context */
const char *
mh_current_folder ()
{
- _mh_init_global_context ();
return mh_global_context_get ("Current-Folder",
mh_global_profile_get ("Inbox", "inbox"));
}
@@ -131,7 +131,13 @@ mh_current_folder ()
const char *
mh_set_current_folder (const char *val)
{
- mh_global_context_set ("Current-Folder", 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;
}
@@ -192,10 +198,9 @@ mh_global_sequences_set (mu_mailbox_t mbox, const char *name,
}
}
-/* FIXME: Rewrite using mu_mhprop_iterate */
void
mh_global_sequences_iterate (mu_mailbox_t mbox,
- mh_context_iterator fp, void *data)
+ mu_mhprop_iterator_t fp, void *data)
{
int rc;
mu_iterator_t itr;
@@ -207,16 +212,7 @@ mh_global_sequences_iterate (mu_mailbox_t mbox,
mu_diag_funcall (MU_DIAG_ERROR, "mu_property_get_iterator", NULL, rc);
exit (1);
}
- for (mu_iterator_first (itr); !mu_iterator_is_done (itr);
- mu_iterator_next (itr))
- {
- const char *name, *val;
-
- mu_iterator_current_kv (itr, (const void **)&name, (void**)&val);
- if (fp (name, val, data))
- break;
- }
- mu_iterator_destroy (&itr);
+ mu_mhprop_iterate (prop, fp, data);
}
/* Global state */
@@ -224,6 +220,15 @@ mh_global_sequences_iterate (mu_mailbox_t mbox,
void
mh_global_save_state ()
{
- mh_context_set_value (context, "Current-Folder", current_folder);
- mh_context_write (context);
+ 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_profile_save", "context", rc);
+ exit (1);
+ }
}
+
+
diff --git a/mh/mh_whom.c b/mh/mh_whom.c
index 4b70b25fd..a64e4b9c7 100644
--- a/mh/mh_whom.c
+++ b/mh/mh_whom.c
@@ -202,26 +202,22 @@ int
mh_whom (const char *filename, int check)
{
int rc = 0;
- mh_context_t *ctx;
- mh_read_aliases ();
- ctx = mh_context_create (filename, 1);
- if ((rc = mh_context_read (ctx)))
+ if (access (filename, R_OK))
{
- if (rc == ENOENT)
- mu_error ("%s: %s", filename, mu_strerror (rc));
- else
- mu_error ("%s: %s (%s)", filename, _("malformed message"),
- mu_strerror (rc));
+ mu_error ("%s: %s", filename, mu_strerror (rc));
rc = -1;
}
else
{
size_t count = 0;
+ mu_property_t prop;
- scan_addrs (mh_context_get_value (ctx, MU_HEADER_TO, NULL), 0);
- scan_addrs (mh_context_get_value (ctx, MU_HEADER_CC, NULL), 0);
- scan_addrs (mh_context_get_value (ctx, MU_HEADER_BCC, NULL), 1);
+ mh_read_aliases ();
+ prop = mh_read_property_file (xstrdup (filename), 1);
+ scan_addrs (mu_mhprop_get_value (prop, MU_HEADER_TO, NULL), 0);
+ scan_addrs (mu_mhprop_get_value (prop, MU_HEADER_CC, NULL), 0);
+ scan_addrs (mu_mhprop_get_value (prop, MU_HEADER_BCC, NULL), 1);
if (local_rcp)
{
@@ -240,8 +236,8 @@ mh_whom (const char *filename, int check)
mu_error(_("no recipients"));
rc = -1;
}
+ mu_property_destroy (&prop);
}
- free (ctx);
destroy_addrs (&network_rcp);
destroy_addrs (&local_rcp);
return rc;
diff --git a/mh/send.c b/mh/send.c
index d717bb9ec..f4b799f9b 100644
--- a/mh/send.c
+++ b/mh/send.c
@@ -283,7 +283,7 @@ struct list_elt /* Element of the send list */
};
static mu_list_t mesg_list;
-static mh_context_t *mts_profile;
+static mu_property_t mts_profile;
int
check_file (char *name)
@@ -313,36 +313,42 @@ check_file (char *name)
void
read_mts_profile ()
{
+ char *name;
const char *p;
char *hostname = NULL;
int rc;
- mh_context_t *local_profile;
+ mu_property_t local_profile;
- p = mh_expand_name (MHLIBDIR, "mtstailor", 0);
- mts_profile = mh_context_create (p, 1);
- mh_context_read (mts_profile);
+ name = mh_expand_name (MHLIBDIR, "mtstailor", 0);
+ mts_profile = mh_read_property_file (name, 1);
- p = mu_tilde_expansion ("~/.mtstailor", "/", NULL);
- local_profile = mh_context_create (p, 1);
- if (mh_context_read (local_profile) == 0)
- mh_context_merge (mts_profile, local_profile);
- mh_context_destroy (&local_profile);
+ name = mu_tilde_expansion ("~/.mtstailor", "/", NULL);
+ local_profile = mh_read_property_file (name, 1);
- if ((p = mh_context_get_value (mts_profile, "localname", NULL)))
+ mh_property_merge (mts_profile, local_profile);
+ mu_property_destroy (&local_profile);
+
+ rc = mu_property_aget_value (mts_profile, "localname", &hostname);
+ if (rc == MU_ERR_NOENT)
+ {
+ rc = mu_get_host_name (&hostname);
+ if (rc)
+ {
+ mu_error (_("cannot get system host name: %s"), mu_strerror (rc));
+ exit (1);
+ }
+ }
+ else
{
- hostname = xstrdup (p);
- mu_set_user_email_domain (p);
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_profile_aget_value", "localname", rc);
+ exit (1);
}
- else if ((rc = mu_get_host_name (&hostname)))
- mu_error (_("cannot get system host name: %s"), mu_strerror (rc));
- if ((p = mh_context_get_value (mts_profile, "localdomain", NULL)))
+ rc = mu_property_sget_value (mts_profile, "localdomain", &p);
+ if (rc == 0)
{
char *newdomain;
- if (!hostname)
- exit (1);
-
newdomain = xmalloc (strlen (hostname) + 1 + strlen (p) + 1);
strcpy (newdomain, hostname);
strcat (newdomain, ".");
@@ -355,8 +361,15 @@ read_mts_profile ()
exit (1);
}
}
-
- if ((p = mh_context_get_value (mts_profile, "username", NULL)))
+ else if (rc != MU_ERR_NOENT)
+ {
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_profile_sget_value",
+ "localdomain", rc);
+ exit (1);
+ }
+
+ rc = mu_property_sget_value (mts_profile, "username", &p);
+ if (rc == 0)
{
size_t len;
const char *domain;
@@ -385,15 +398,21 @@ read_mts_profile ()
free (newemail);
}
+ else if (rc != MU_ERR_NOENT)
+ {
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_profile_sget_value",
+ "username", rc);
+ exit (1);
+ }
}
mu_mailer_t
open_mailer ()
{
- const char *url = mh_context_get_value (mts_profile,
- "url",
- "sendmail:/usr/sbin/sendmail");
+ const char *url = mu_mhprop_get_value (mts_profile,
+ "url",
+ "sendmail:/usr/sbin/sendmail");
mu_mailer_t mailer;
int status;
@@ -667,8 +686,8 @@ _action_send (void *item, void *data)
if (mu_header_get_value (hdr, MU_HEADER_X_MAILER, NULL, 0, &n))
{
- const char *p = mh_context_get_value (mts_profile,
- "x-mailer", "yes");
+ const char *p = mu_mhprop_get_value (mts_profile,
+ "x-mailer", "yes");
if (!strcmp (p, "yes"))
mu_header_set_value (hdr, MU_HEADER_X_MAILER,
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 001f75452..d1ecf45a0 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -165,6 +165,7 @@ mh/forw.c
mh/inc.c
mh/install-mh.c
mh/mark.c
+mh/mboxprop.c
mh/mh_argp.c
mh/mh_ctx.c
mh/mh_fmtgram.y

Return to:

Send suggestions and report system problems to the System administrator.