diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2017-06-11 00:29:06 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2017-06-11 00:29:06 +0300 |
commit | fe90e86dac8c9c91a35347ee5bb4513195263ee2 (patch) | |
tree | 2fdb185baa9e0807641147881adf302e5aa39ea6 | |
parent | 263e2e9f9fcf721c11a61a16dca4cb38d6385fe9 (diff) | |
download | mailutils-fe90e86dac8c9c91a35347ee5bb4513195263ee2.tar.gz mailutils-fe90e86dac8c9c91a35347ee5bb4513195263ee2.tar.bz2 |
Fix the -nodraftfolder and -nowhatnowproc options.
The commit 744c4a9c didn't take into account the -nodraftfolder
and -nowhatnowproc options, which can be used to cancel the
effect of the corresponding facilities. This commit fixes it.
* mh/mh_getopt.c (mh_getopt_ext): New function.
* mh/mh_getopt.h (mh_getopt_ext): New prototype.
(mh_optinit): New struct.
* mh/tests/comp.at: Test the use of Draft-Folder
* mh/tests/forw.at: Likewise.
* mh/tests/repl.at: Likewise.
* mh/comp.c (main): use mh_getopt_ext to properly process draftfolder
and whatnowproc.
* mh/forw.c: Likewise.
* mh/repl.c: Likewise.
* mh/mh.h (mh_whom): Remove.
(mh_whom_header, mh_whom_file, mh_whom_message): New protos.
* mh/mh_alias.y (mh_read_aliases): Don't read aliases twice.
* mh/mh_whatnow.c (whom): Use mh_whom_file.
* mh/mh_whom.c (mh_whom): Rewrite and rename to mh_whom_file.
(mh_whom_header, mh_whom_message): New functions.
* mh/whom.c: Use mh_getopt_ext. Interpret command line
arguments, depending on whether the draftfile facility is in use.
-rw-r--r-- | mh/comp.c | 13 | ||||
-rw-r--r-- | mh/forw.c | 14 | ||||
-rw-r--r-- | mh/mh.h | 6 | ||||
-rw-r--r-- | mh/mh_alias.l | 2 | ||||
-rw-r--r-- | mh/mh_alias.y | 3 | ||||
-rw-r--r-- | mh/mh_getopt.c | 44 | ||||
-rw-r--r-- | mh/mh_getopt.h | 13 | ||||
-rw-r--r-- | mh/mh_whatnow.c | 7 | ||||
-rw-r--r-- | mh/mh_whom.c | 86 | ||||
-rw-r--r-- | mh/repl.c | 16 | ||||
-rw-r--r-- | mh/tests/comp.at | 43 | ||||
-rw-r--r-- | mh/tests/forw.at | 123 | ||||
-rw-r--r-- | mh/tests/repl.at | 64 | ||||
-rw-r--r-- | mh/whom.c | 63 |
14 files changed, 424 insertions, 73 deletions
@@ -124,21 +124,22 @@ copy_message (mu_mailbox_t mbox, size_t n, const char *file) mu_error (_("error copying to \"%s\": %s"), file, mu_strerror (rc)); } 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"; if (!formfile) mh_find_file ("components", &formfile); @@ -374,23 +374,25 @@ finish_draft () rc = mu_stream_write (stream, "\n\n", 2, NULL); } mu_stream_close (stream); 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); if (input_file) { if (encap == encap_mime) @@ -339,13 +339,17 @@ int mh_whatnowproc (struct mh_whatnow_env *wh, int initial_edit, int mh_disposition (const char *filename); 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 *); int mh_alias_read (char const *name, int fail); int mh_alias_get (const char *name, mu_list_t *return_list); diff --git a/mh/mh_alias.l b/mh/mh_alias.l index df81ce30f..0deb7c99b 100644 --- a/mh/mh_alias.l +++ b/mh/mh_alias.l @@ -419,13 +419,13 @@ yywrap () /* Parses the named alias file */ int mh_alias_read (char const *name, int fail) { extern int yydebug; - char *p = getenv("ALI_YYDEBUG"); + char *p = getenv ("ALI_YYDEBUG"); if (p && *p > '0' && *p < '9') yydebug = 1; if (push_source (name, fail)) return 1; diff --git a/mh/mh_alias.y b/mh/mh_alias.y index 0d6bffcc2..54e3cd1c6 100644 --- a/mh/mh_alias.y +++ b/mh/mh_alias.y @@ -489,12 +489,15 @@ unix_passwd_to_list () } int mh_read_aliases () { const char *p; + + if (alias_list) + return 0; p = mh_global_profile_get ("Aliasfile", NULL); if (p) { struct mu_wordsplit ws; diff --git a/mh/mh_getopt.c b/mh/mh_getopt.c index 65fe3e8c7..16a6e5c55 100644 --- a/mh/mh_getopt.c +++ b/mh/mh_getopt.c @@ -176,16 +176,45 @@ has_folder_option (struct mu_option *opt) return 1; ++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; struct mu_parseopt po; struct mu_option *optv[3]; struct getopt_data getopt_data; @@ -253,12 +282,13 @@ mh_getopt (int *pargc, char ***pargv, struct mu_option *options, i = 0; if (mhflags & MH_GETOPT_DEFAULT_FOLDER) optv[i++] = folder_option; 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); argc -= po.po_arg_start; argv += po.po_arg_start; @@ -282,12 +312,20 @@ mh_getopt (int *pargc, char ***pargv, struct mu_option *options, *pargv = argv; mh_init2 (); } 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); exit (1); } diff --git a/mh/mh_getopt.h b/mh/mh_getopt.h index 2aa90b669..684ace678 100644 --- a/mh/mh_getopt.h +++ b/mh/mh_getopt.h @@ -17,15 +17,24 @@ #include <mailutils/nls.h> #include <mailutils/opt.h> #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); void mh_opt_notimpl_warning (struct mu_parseopt *po, struct mu_option *opt, char const *arg); void mh_opt_clear_string (struct mu_parseopt *po, struct mu_option *opt, diff --git a/mh/mh_whatnow.c b/mh/mh_whatnow.c index 5dc15b553..0bd2acabe 100644 --- a/mh/mh_whatnow.c +++ b/mh/mh_whatnow.c @@ -541,15 +541,16 @@ call_send (struct mh_whatnow_env *wh, int argc, char **argv, int *status) static int 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; } /* Help table for whatnow */ static struct helpdata whatnow_helptab[] = { { "display [<>]", diff --git a/mh/mh_whom.c b/mh/mh_whom.c index bbdef7ac5..f3067d1ab 100644 --- a/mh/mh_whom.c +++ b/mh/mh_whom.c @@ -258,65 +258,93 @@ read_header (mu_stream_t stream) exit (1); } return hdr; } 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; if (access (filename, R_OK)) { mu_error ("%s: %s", filename, mu_strerror (errno)); rc = -1; } 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) { mu_diag_funcall (MU_DIAG_ERROR, "mu_file_stream_create", filename, rc); exit (1); } 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; } + @@ -286,25 +286,25 @@ make_draft (mu_mailbox_t mbox, int disp, struct mh_whatnow_env *wh) wh->msg = mu_strdup (p+1); free (msgname); } } } +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; if (mh_format_parse (format_str, &format)) { diff --git a/mh/tests/comp.at b/mh/tests/comp.at index 563310cca..7a63e5ff7 100644 --- a/mh/tests/comp.at +++ b/mh/tests/comp.at @@ -190,11 +190,54 @@ To: root Subject: test input 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]) # End of comp.at diff --git a/mh/tests/forw.at b/mh/tests/forw.at index e0566dfe7..f668a3389 100644 --- a/mh/tests/forw.at +++ b/mh/tests/forw.at @@ -394,10 +394,133 @@ Subject: test input message body -- Input file end 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]) # End of forw.at diff --git a/mh/tests/repl.at b/mh/tests/repl.at index bd58e9f33..f8a194c08 100644 --- a/mh/tests/repl.at +++ b/mh/tests/repl.at @@ -76,9 +76,73 @@ To: <gray@example.com> Subject: Re: test input 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 @@ -18,13 +18,13 @@ #include <mh.h> 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 add_alias (struct mu_parseopt *po, struct mu_option *opt, char const *arg) { mh_alias_read (arg, 1); @@ -42,13 +42,13 @@ set_draftmessage (struct mu_parseopt *po, struct mu_option *opt, static struct mu_option options[] = { { "alias", 0, N_("FILE"), MU_OPTION_DEFAULT, N_("specify additional alias file"), 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 }, { "nodraftfolder", 0, NULL, MU_OPTION_DEFAULT, N_("undo the effect of the last -draftfolder option"), mu_c_string, &draft_folder, mh_opt_clear_string }, @@ -57,25 +57,60 @@ static struct mu_option options[] = { mu_c_string, NULL, set_draftmessage }, { "check", 0, NULL, MU_OPTION_DEFAULT, N_("check if addresses are deliverable"), 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; } |