summaryrefslogtreecommitdiff
path: root/mail/mailvar.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/mailvar.c')
-rw-r--r--mail/mailvar.c112
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;

Return to:

Send suggestions and report system problems to the System administrator.