diff options
Diffstat (limited to 'mail/mailvar.c')
-rw-r--r-- | mail/mailvar.c | 112 |
1 files changed, 91 insertions, 21 deletions
diff --git a/mail/mailvar.c b/mail/mailvar.c index e39ea721a..141262b2e 100644 --- a/mail/mailvar.c +++ b/mail/mailvar.c @@ -1,5 +1,5 @@ /* GNU Mailutils -- a suite of utilities for electronic mail - Copyright (C) 2009-2019 Free Software Foundation, Inc. + Copyright (C) 2009-2024 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 @@ -15,6 +15,7 @@ along with GNU Mailutils. If not, see <http://www.gnu.org/licenses/>. */ #include "mail.h" +#include "mailutils/kwd.h" #define MAILVAR_ALIAS 0x0001 #define MAILVAR_RDONLY 0x0002 @@ -52,6 +53,10 @@ static int set_folder (enum mailvar_cmd cmd, struct mailvar_variable *); static int set_headline (enum mailvar_cmd, struct mailvar_variable *); +static int set_outfilename (enum mailvar_cmd, + struct mailvar_variable *); +static int set_escape (enum mailvar_cmd, + struct mailvar_variable *); struct mailvar_symbol mailvar_tab[] = { @@ -62,9 +67,11 @@ struct mailvar_symbol mailvar_tab[] = Never used, always true. */ { { mailvar_name_append, }, MAILVAR_TYPEMASK (mailvar_type_boolean) | MAILVAR_RDONLY, + /* TRANSLATORS: "mbox" is the name of a command. Don't translate it. */ N_("messages saved in mbox are appended to the end rather than prepended") }, { { mailvar_name_appenddeadletter, }, MAILVAR_TYPEMASK (mailvar_type_boolean), + /* TRANSLATORS: Don't translate "dead.letter". */ N_("append the contents of canceled letter to dead.letter file") }, { { mailvar_name_askbcc, }, MAILVAR_TYPEMASK (mailvar_type_boolean), @@ -81,11 +88,8 @@ struct mailvar_symbol mailvar_tab[] = N_("automatically incorporate newly arrived messages")}, { { mailvar_name_autoprint, }, MAILVAR_TYPEMASK (mailvar_type_boolean), + /* TRANSLATORS: "delete" and "dp" are command names. */ N_("delete command behaves like dp") }, - { { mailvar_name_byname }, - MAILVAR_TYPEMASK (mailvar_type_boolean), - N_("record outgoing messages in a file named after the first recipient; " - "overrides the `record' variable") }, { { mailvar_name_bang, }, MAILVAR_TYPEMASK (mailvar_type_boolean), N_("replace every occurrence of ! in arguments to the shell command" @@ -95,6 +99,7 @@ struct mailvar_symbol mailvar_tab[] = N_("output character set for decoded header fields") }, { { mailvar_name_cmd, }, MAILVAR_TYPEMASK (mailvar_type_string), + /* TRANSLATORS: "pipe" is the command name. */ N_("default shell command for pipe") }, { { mailvar_name_columns, }, MAILVAR_TYPEMASK (mailvar_type_number), @@ -129,7 +134,8 @@ struct mailvar_symbol mailvar_tab[] = N_("start interactive mode if the mailbox is empty") }, { { mailvar_name_escape, }, MAILVAR_TYPEMASK (mailvar_type_string), - N_("character denoting escapes") }, + N_("command escape character"), + set_escape }, { { mailvar_name_flipr, }, MAILVAR_TYPEMASK (mailvar_type_boolean), N_("swap the meaning of reply and Reply commands") }, @@ -200,8 +206,12 @@ struct mailvar_symbol mailvar_tab[] = MAILVAR_TYPEMASK (mailvar_type_string), N_("display this text when sending a message with empty body") }, { { mailvar_name_outfolder, }, - MAILVAR_TYPEMASK (mailvar_type_string), - N_("keep created files in this folder") }, + MAILVAR_TYPEMASK (mailvar_type_string) | + MAILVAR_TYPEMASK (mailvar_type_boolean), + N_("If boolean, causes the files used to record outgoing messages to" + " be located in the directory specified by the folder variable" + " (unless the pathname is absolute).\n" + "If string, names the directory where to store these files.") }, { { mailvar_name_page, }, MAILVAR_TYPEMASK (mailvar_type_boolean), N_("pipe command terminates each message with a formfeed") }, @@ -277,14 +287,29 @@ struct mailvar_symbol mailvar_tab[] = MAILVAR_TYPEMASK (mailvar_type_boolean), N_("verbosely trace the process of message delivery"), set_verbose }, - { { mailvar_name_xmailer, }, + + { { mailvar_name_useragent, }, MAILVAR_TYPEMASK (mailvar_type_boolean), - N_("add the `X-Mailer' header to the outgoing messages") }, + N_("add the `User-Agent' header to the outgoing messages") }, + { { mailvar_name_xmailer, }, MAILVAR_ALIAS }, { { mailvar_name_mime }, MAILVAR_TYPEMASK (mailvar_type_boolean), N_("always compose MIME messages") }, + { { mailvar_name_fullnames }, + MAILVAR_TYPEMASK (mailvar_type_boolean), + N_("when replying, preserve personal parts of recipient emails") }, + + { { mailvar_name_outfilename }, + MAILVAR_TYPEMASK (mailvar_type_string), + N_("how to create outgoing file name: local, domain, email"), + set_outfilename }, + + { { mailvar_name_PID }, + MAILVAR_TYPEMASK (mailvar_type_string) | MAILVAR_RDONLY, + N_("PID of this process") }, + /* These will be implemented later */ { { mailvar_name_onehop, }, MAILVAR_HIDDEN, NULL }, @@ -292,10 +317,6 @@ struct mailvar_symbol mailvar_tab[] = MAILVAR_TYPEMASK (mailvar_type_boolean) | MAILVAR_HIDDEN, N_("suppress the printing of the version when first invoked") }, - { { mailvar_name_PID }, - MAILVAR_TYPEMASK (mailvar_type_string) | MAILVAR_RDONLY, - N_("PID of this process") }, - { { NULL }, } }; @@ -339,10 +360,15 @@ print_descr (mu_stream_t out, const char *s, int n, mu_stream_write (out, " ", 1, NULL); for (p = s; *p && p < s + (rmargin - doc_col); p++) - if (mu_isspace (*p)) + if (*p == '\n') + { + space = p; + break; + } + else if (mu_isspace (*p)) space = p; - if (!space || p < s + (rmargin - doc_col)) + if (!space || (*space != '\n' && p < s + (rmargin - doc_col))) { mu_stream_printf (out, "%s", s); s += strlen (s); @@ -435,7 +461,7 @@ mailvar_get (void *ptr, const char *variable, enum mailvar_type type, int warn) { struct mailvar_variable *var = mailvar_find_variable (variable, 0); - if (!var->set || var->type != type) + if (!var->set || (type != mailvar_type_whatever && var->type != type)) { if (warn) mu_error (_("No value set for \"%s\""), variable); @@ -453,7 +479,7 @@ mailvar_get (void *ptr, const char *variable, enum mailvar_type type, int warn) break; case mailvar_type_boolean: - *(int*)ptr = var->value.bool; + *(int*)ptr = var->value.boolean; break; default: @@ -490,7 +516,7 @@ mailvar_variable_reset (struct mailvar_variable *var) var->set = 0; } -/* Set environement +/* Set environment The mailvar_set() function adds to the mailvar_list the VARIABLE with the given VALUE, if VARIABLE does not already exist. If it does exist in the mailvar_list, then its value is changed @@ -565,7 +591,7 @@ mailvar_set (const char *variable, void *value, enum mailvar_type type, break; case mailvar_type_boolean: - newvar.value.bool = *(int*)value; + newvar.value.boolean = *(int*)value; break; default: @@ -722,6 +748,50 @@ set_debug (enum mailvar_cmd cmd, struct mailvar_variable *var) return 0; } +static int +set_outfilename (enum mailvar_cmd cmd, struct mailvar_variable *var) +{ + static struct mu_kwd kwtab[] = { + { "local", outfilename_local }, + { "email", outfilename_email }, + { "domain", outfilename_domain }, + { NULL } + }; + + switch (cmd) + { + case mailvar_cmd_set: + if (mu_kwd_xlat_name (kwtab, var->value.string, &outfilename_mode)) + { + mu_error (_("unsupported value for %s"), var->name); + return 1; + } + break; + + default: + return 1; + } + return 0; +} + +static int +set_escape (enum mailvar_cmd cmd, struct mailvar_variable *var) +{ + if (cmd == mailvar_cmd_set) + { + if (var->value.string[0] == 0) + { + mu_error (_("escape character cannot be empty")); + return 1; + } + else if (var->value.string[1] != 0) + { + mu_error (_("escape value must be a single character")); + return 1; + } + } + return 0; +} size_t _mailvar_symbol_count (int set) @@ -899,7 +969,7 @@ mailvar_printer (void *item, void *data) break; case mailvar_type_boolean: - if (!vp->value.bool) + if (!vp->value.boolean) mu_stream_printf (clos->out, "no"); mu_stream_printf (clos->out, "%s", vp->name); break; |