Commit c1f2442c c1f2442cd53e43cf11cc8f5b649b454b3f2cb03f by Sergey Poznyakoff Committed by Sergey Poznyakoff

Merge branch 'master' into locus

2 parents 8b5715db fe90e86d
GNU mailutils NEWS -- history of user-visible changes. 2017-06-01
GNU mailutils NEWS -- history of user-visible changes. 2017-06-16
Copyright (C) 2002-2017 Free Software Foundation, Inc.
See the end of file for copying conditions.
......@@ -75,6 +75,13 @@ value is anything but "no", the settings from the global "tls" section
will be used. In this case, it is an error if the global "tls"
section is not defined.
* Source location API
Libmailutils provides functions for keeping track of locations in
source files for diagnostic purposes.
* Improve error reporting
* AM_GNU_MAILUTILS autoconf macro
Required version must be literal string.
......
......@@ -127,15 +127,16 @@ copy_message (mu_mailbox_t mbox, size_t n, const char *file)
return rc;
}
static struct mh_optinit optinit[] = {
{ "draftfolder", "Draft-Folder" },
{ "whatnowproc", "whatnowproc" },
{ NULL }
};
int
main (int argc, char **argv)
{
mh_getopt (&argc, &argv, options, 0, args_doc, prog_doc, NULL);
if (!draftfolder)
draftfolder = mh_global_profile_get ("Draft-Folder", NULL);
if (!whatnowproc)
whatnowproc = mh_global_profile_get ("whatnowproc", NULL);
mh_getopt_ext (&argc, &argv, options, 0, optinit, args_doc, prog_doc, NULL);
if (use_draft)
draftmessage = "cur";
......
......@@ -377,17 +377,19 @@ finish_draft ()
mu_stream_destroy (&stream);
}
static struct mh_optinit optinit[] = {
{ "draftfolder", "Draft-Folder" },
{ "whatnowproc", "whatnowproc" },
{ NULL }
};
int
main (int argc, char **argv)
{
int rc;
mh_getopt (&argc, &argv, options, MH_GETOPT_DEFAULT_FOLDER,
args_doc, prog_doc, NULL);
if (!draftfolder)
draftfolder = mh_global_profile_get ("Draft-Folder", NULL);
if (!whatnowproc)
whatnowproc = mh_global_profile_get ("whatnowproc", NULL);
mh_getopt_ext (&argc, &argv, options, MH_GETOPT_DEFAULT_FOLDER, optinit,
args_doc, prog_doc, NULL);
if (!formfile)
mh_find_file ("forwcomps", &formfile);
......
......@@ -342,7 +342,11 @@ int mh_usedraft (const char *filename);
int mh_file_copy (const char *from, const char *to);
char *mh_draft_name (void);
char *mh_create_message_id (int);
int mh_whom (const char *filename, int check);
int mh_whom_header (mu_header_t hdr);
int mh_whom_file (const char *filename, int check);
int mh_whom_message (mu_message_t msg, int check);
void mh_set_reply_regex (const char *str);
int mh_decode_2047 (char *text, char **decoded_text);
const char *mh_charset (const char *);
......
......@@ -502,6 +502,9 @@ int
mh_read_aliases (void)
{
const char *p;
if (alias_list)
return 0;
p = mh_global_profile_get ("Aliasfile", NULL);
if (p)
......
......@@ -179,10 +179,39 @@ has_folder_option (struct mu_option *opt)
return 0;
}
static void
opt_init (struct mu_parseopt *po,
struct mu_option **optv, struct mh_optinit *optinit)
{
if (!optinit)
return;
for (; optinit->opt; optinit++)
{
size_t i;
for (i = 0; optv[i]; i++)
{
struct mu_option *opt;
for (opt = optv[i]; !MU_OPTION_IS_END (opt); opt++)
{
if (strcmp (opt->opt_long, optinit->opt) == 0)
{
char const *val = mh_global_profile_get (optinit->var, NULL);
if (val)
{
(opt->opt_set ?
opt->opt_set : mu_option_set_value) (po, opt, val);
}
break;
}
}
}
}
}
void
mh_getopt (int *pargc, char ***pargv, struct mu_option *options,
int mhflags,
char *argdoc, char *progdoc, char *extradoc)
mh_getopt_ext (int *pargc, char ***pargv, struct mu_option *options,
int mhflags, struct mh_optinit *optinit,
char *argdoc, char *progdoc, char *extradoc)
{
int argc = *pargc;
char **argv = *pargv;
......@@ -256,6 +285,7 @@ mh_getopt (int *pargc, char ***pargv, struct mu_option *options,
if (options)
optv[i++] = options;
optv[i] = NULL;
opt_init (&po, optv, optinit);
if (mu_parseopt (&po, argc, argv, optv, flags))
exit (po.po_exit_error);
......@@ -285,6 +315,14 @@ mh_getopt (int *pargc, char ***pargv, struct mu_option *options,
}
void
mh_getopt (int *pargc, char ***pargv, struct mu_option *options,
int mhflags, char *argdoc, char *progdoc, char *extradoc)
{
mh_getopt_ext (pargc, pargv, options, mhflags, NULL, argdoc, progdoc,
extradoc);
}
void
mh_opt_notimpl (struct mu_parseopt *po, struct mu_option *opt, char const *arg)
{
mu_error (_("option is not yet implemented: %s"), opt->opt_long);
......
......@@ -20,9 +20,18 @@
#define MH_GETOPT_DEFAULT_FOLDER 0x1
struct mh_optinit
{
char const *opt; /* Option name */
char const *var; /* mh_property name */
};
void mh_getopt_ext (int *pargc, char ***pargv, struct mu_option *options,
int mhflags, struct mh_optinit *optinit,
char *argdoc, char *progdoc, char *extradoc);
void mh_getopt (int *pargc, char ***pargv, struct mu_option *options,
int flags,
char *argdoc, char *progdoc, char *extradoc);
int flags, char *argdoc, char *progdoc, char *extradoc);
void mh_opt_notimpl (struct mu_parseopt *po, struct mu_option *opt,
char const *arg);
......
......@@ -544,9 +544,10 @@ whom (struct mh_whatnow_env *wh, int argc, char **argv, int *status)
if (!wh->file)
mu_error (_("no draft file to display"));
else
mh_whom (wh->file, (argc == 2
&& (strcmp (argv[1], "-check") == 0
|| strcmp (argv[1], "--check") == 0)));
mh_whom_file (wh->file,
(argc == 2
&& (strcmp (argv[1], "-check") == 0
|| strcmp (argv[1], "--check") == 0)));
return 0;
}
......
......@@ -261,7 +261,46 @@ read_header (mu_stream_t stream)
}
int
mh_whom (const char *filename, int check)
mh_whom_header (mu_header_t hdr)
{
size_t count = 0;
int rc;
const char *val;
mh_read_aliases ();
if (mu_header_sget_value (hdr, MU_HEADER_TO, &val) == 0)
scan_addrs (val, 0);
if (mu_header_sget_value (hdr, MU_HEADER_CC, &val) == 0)
scan_addrs (val, 0);
if (mu_header_sget_value (hdr, MU_HEADER_BCC, &val) == 0)
scan_addrs (val, 1);
if (local_rcp)
{
printf (" %s\n", _("-- Local Recipients --"));
mu_list_foreach (local_rcp, _print_local_recipient, &count);
}
if (network_rcp)
{
printf (" %s\n", _("-- Network Recipients --"));
mu_list_foreach (network_rcp, _print_recipient, &count);
}
if (count == 0)
{
mu_error(_("no recipients"));
rc = -1;
}
destroy_addrs (&network_rcp);
destroy_addrs (&local_rcp);
return rc;
}
int
mh_whom_file (const char *filename, int check)
{
int rc = 0;
......@@ -272,11 +311,9 @@ mh_whom (const char *filename, int check)
}
else
{
size_t count = 0;
mu_header_t hdr;
mu_stream_t str;
int rc;
const char *val;
rc = mu_file_stream_create (&str, filename, MU_STREAM_READ);
if (rc)
......@@ -288,35 +325,26 @@ mh_whom (const char *filename, int check)
hdr = read_header (str);
mu_stream_unref (str);
mh_read_aliases ();
if (mu_header_sget_value (hdr, MU_HEADER_TO, &val) == 0)
scan_addrs (val, 0);
if (mu_header_sget_value (hdr, MU_HEADER_CC, &val) == 0)
scan_addrs (val, 0);
if (mu_header_sget_value (hdr, MU_HEADER_BCC, &val) == 0)
scan_addrs (val, 1);
if (local_rcp)
{
printf (" %s\n", _("-- Local Recipients --"));
mu_list_foreach (local_rcp, _print_local_recipient, &count);
}
rc = mh_whom_header (hdr);
mu_header_destroy (&hdr);
}
return rc;
}
if (network_rcp)
{
printf (" %s\n", _("-- Network Recipients --"));
mu_list_foreach (network_rcp, _print_recipient, &count);
}
int
mh_whom_message (mu_message_t msg, int check)
{
mu_header_t hdr;
int rc;
if (count == 0)
{
mu_error(_("no recipients"));
rc = -1;
}
rc = mu_message_get_header (msg, &hdr);
if (rc)
mu_error (_("can't get headers: %s"), mu_strerror (rc));
else
{
rc = mh_whom_header (hdr);
mu_header_destroy (&hdr);
}
destroy_addrs (&network_rcp);
destroy_addrs (&local_rcp);
return rc;
}
......
......@@ -289,19 +289,19 @@ make_draft (mu_mailbox_t mbox, int disp, struct mh_whatnow_env *wh)
}
}
static struct mh_optinit optinit[] = {
{ "draftfolder", "Draft-Folder" },
{ "whatnowproc", "whatnowproc" },
{ NULL }
};
int
main (int argc, char **argv)
{
int rc;
mh_getopt (&argc, &argv, options, MH_GETOPT_DEFAULT_FOLDER,
args_doc, prog_doc, NULL);
if (!draftfolder)
draftfolder = mh_global_profile_get ("Draft-Folder", NULL);
if (!whatnowproc)
whatnowproc = mh_global_profile_get ("whatnowproc", NULL);
mh_getopt_ext (&argc, &argv, options, MH_GETOPT_DEFAULT_FOLDER, optinit,
args_doc, prog_doc, NULL);
if (!format_str)
format_str = default_format_str;
......
......@@ -193,6 +193,49 @@ message body
Seen by mhed
])
MH_CHECK([use Draft-Folder],[comp07 draftfolder],
[mkdir Mail/drafts
echo "Draft-Folder: +drafts" >> $MH
echo 'quit' | compcmd | cwdrepl
sed 's/ *$//' Mail/drafts/1
],
[0],
[-- Editor invocation: ./Mail/drafts/1
-- Input file:
To:
cc:
Subject:
--------
-- Input file end
What now? draft left on "./Mail/drafts/1".
To:
cc:
Subject:
--------
Seen by mhed
])
MH_CHECK([-nodraftfolder],[comp08 nodraftfolder draftfolder],
[mkdir Mail/drafts
echo "Draft-Folder: +drafts" >> $MH
echo 'quit' | compcmd -nodraftfolder | cwdrepl
sed 's/ *$//' Mail/draft
],
[0],
[-- Editor invocation: ./Mail/draft
-- Input file:
To:
cc:
Subject:
--------
-- Input file end
What now? draft left on "./Mail/draft".
To:
cc:
Subject:
--------
Seen by mhed
])
m4_popdef([compcmd])
m4_popdef([MH_KEYWORDS])
......
......@@ -397,6 +397,129 @@ message body
What now? draft left on "./Mail/draft".
])
MH_CHECK([Draft-Folder],[forw07 forw-draftfolder draftfolder],[
mkdir Mail/inbox
mkdir Mail/drafts
echo "Draft-Folder: +drafts" >> $MH
AT_DATA([Mail/inbox/1],[From: gray
To: root
Subject: test input
message body
])
echo "quit" | forwcmd 1 | cwdrepl
echo == Mail/drafts/1 ==
cat Mail/drafts/1
echo == Message ==
sed '/^X-IMAPbase/d' Mail/inbox/1
],
[0],
[-- Editor invocation: ./Mail/drafts/1
-- Input file:
To:
cc:
Subject:
--------
------- Forwarded message
From: gray
To: root
Subject: test input
message body
------- End of Forwarded message
-- Input file end
What now? draft left on "./Mail/drafts/1".
== Mail/drafts/1 ==
To:
cc:
Subject:
--------
------- Forwarded message
From: gray
To: root
Subject: test input
message body
------- End of Forwarded message
Seen by mhed
== Message ==
From: gray
To: root
Subject: test input
message body
])
MH_CHECK([-nodraftfolder],[forw08 forw-nodraftfolder nodraftfolder draftfolder],[
mkdir Mail/inbox
mkdir Mail/drafts
echo "Draft-Folder: +drafts" >> $MH
AT_DATA([Mail/inbox/1],[From: gray
To: root
Subject: test input
message body
])
echo "quit" | forwcmd -nodraftfolder 1 | cwdrepl
echo == Mail/draft ==
cat Mail/draft
echo == Message ==
sed '/^X-IMAPbase/d' Mail/inbox/1
],
[0],
[-- Editor invocation: ./Mail/draft
-- Input file:
To:
cc:
Subject:
--------
------- Forwarded message
From: gray
To: root
Subject: test input
message body
------- End of Forwarded message
-- Input file end
What now? draft left on "./Mail/draft".
== Mail/draft ==
To:
cc:
Subject:
--------
------- Forwarded message
From: gray
To: root
Subject: test input
message body
------- End of Forwarded message
Seen by mhed
== Message ==
From: gray
To: root
Subject: test input
message body
])
m4_popdef([forwcmd])
m4_popdef([MH_KEYWORDS])
......
......@@ -79,6 +79,70 @@ X-Mailer: MH (AT_PACKAGE_NAME AT_PACKAGE_VERSION)
Seen by mhed
])
MH_CHECK([Draft-Folder],[repl02 repl-draftfolder draftfolder],[
mkdir Mail/inbox
mkdir Mail/drafts
echo "Draft-Folder: +drafts" >> $MH
AT_DATA([Mail/inbox/1],[From: gray@example.com
To: root@example.com
Subject: test input
message body
])
echo "quit" | replcmd +inbox 1 | cwdrepl
echo == Mail/drafts/1 ==
cat Mail/drafts/1
],
[0],
[-- Editor invocation: ./Mail/drafts/1
-- Input file:
To: <gray@example.com>
Subject: Re: test input
X-Mailer: MH (AT_PACKAGE_NAME AT_PACKAGE_VERSION)
--------
-- Input file end
What now? draft left on "./Mail/drafts/1".
== Mail/drafts/1 ==
To: <gray@example.com>
Subject: Re: test input
X-Mailer: MH (AT_PACKAGE_NAME AT_PACKAGE_VERSION)
--------
Seen by mhed
])
MH_CHECK([-nodraftfolder],[repl03 repl-nodraftfolder nodraftfolder draftfolder],[
mkdir Mail/inbox
mkdir Mail/drafts
echo "Draft-Folder: +drafts" >> $MH
AT_DATA([Mail/inbox/1],[From: gray@example.com
To: root@example.com
Subject: test input
message body
])
echo "quit" | replcmd -nodraftfolder +inbox 1 | cwdrepl
echo == Mail/draft ==
cat Mail/draft
],
[0],
[-- Editor invocation: ./Mail/draft
-- Input file:
To: <gray@example.com>
Subject: Re: test input
X-Mailer: MH (AT_PACKAGE_NAME AT_PACKAGE_VERSION)
--------
-- Input file end
What now? draft left on "./Mail/draft".
== Mail/draft ==
To: <gray@example.com>
Subject: Re: test input
X-Mailer: MH (AT_PACKAGE_NAME AT_PACKAGE_VERSION)
--------
Seen by mhed
])
m4_popdef([replcmd])
m4_popdef([MH_KEYWORDS])
# End of repl.at
......
......@@ -21,7 +21,7 @@ static char prog_doc[] = N_("Report to whom a message would go");
static char args_doc[] = "[FILE]";
static int check_recipients;
static int use_draft; /* Use the prepared draft */
static char *message;
static const char *draft_folder; /* Use this draft folder */
static void
......@@ -45,7 +45,7 @@ static struct mu_option options[] = {
mu_c_string, NULL, add_alias },
{ "draft", 0, NULL, MU_OPTION_DEFAULT,
N_("use prepared draft"),
mu_c_bool, &use_draft },
mu_c_string, &message, NULL, "draft" },
{ "draftfolder", 0, N_("FOLDER"), MU_OPTION_DEFAULT,
N_("specify the folder for message drafts"),
mu_c_string, &draft_folder },
......@@ -60,22 +60,57 @@ static struct mu_option options[] = {
mu_c_bool, &check_recipients },
MU_OPTION_END
};
static struct mh_optinit optinit[] = {
{ "draftfolder", "Draft-Folder" },
{ NULL }
};
int
main (int argc, char **argv)
{
char *name = "draft";
mh_getopt (&argc, &argv, options, 0, args_doc, prog_doc, NULL);
int rc;
mh_getopt_ext (&argc, &argv, options, 0, optinit, args_doc, prog_doc, NULL);
if (!use_draft && argc > 0)
name = argv[0];
if (draft_folder)
{
mu_mailbox_t mbox = mh_open_folder (draft_folder, MU_STREAM_READ);
mu_msgset_t msgset;
size_t msgno;
mu_message_t msg;
mh_msgset_parse (&msgset, mbox, argc, argv, "cur");
if (!mh_msgset_single_message (msgset))
{
mu_error (_("only one message at a time!"));
return 1;
}
msgno = mh_msgset_first (msgset, RET_MSGNO);
rc = mu_mailbox_get_message (mbox, msgno, &msg);
if (rc)
{
mu_error (_("can't read message: %s"), mu_strerror (rc));
exit (1);
}
rc = mh_whom_message (msg, check_recipients);
}
else
{
if (argc > 0)
{
if (message || argc > 1)
{
mu_error (_("only one file at a time!"));
exit (1);
}
message = argv[0];
}
else
message = "draft";
rc = mh_whom_file (mh_expand_name (draft_folder, message, NAME_ANY),
check_recipients);
}
if (!draft_folder)
draft_folder = mh_global_profile_get ("Draft-Folder",
mu_folder_directory ());
return mh_whom (mh_expand_name (draft_folder, name, NAME_ANY),
check_recipients) ? 1 : 0;
return rc ? 1 : 0;
}
......