Default it to use $TMPDIR, and if unset to /var/tmp, so that files
will survive an unfortunately timed computer reboot.
Create two new functions for generating temp filenames in $tmpdraftdir:
- mutt_adv_mktemp_draft() for template-style naming
- mutt_buffer_mktemp_draft() for random naming with a "mutt" prefix.
Modify compose temp files to use $tmpdraftdir functions.
Handle the most common cases:
- compose and compose with $edit_headers
- postponed messages
- resend-message
- -H draft files via command line argument
- -i include body files via command line argument.
Also change attachment menu forwarding and replying, which generate a
tempfile passed in as the body, to use $tmpdraftdir.
Thanks for Raf and Rene Kita for suggesting $tmpdraftdir default to
$TMPDIR, and also to Raf for the man page suggested updates.
---
doc/manual.xml.head | 3 ++-
doc/mutt.man | 6 +++---
globals.h | 1 +
headers.c | 2 +-
init.c | 1 +
init.h | 14 +++++++++++++-
main.c | 2 +-
muttlib.c | 13 +++++++------
postpone.c | 2 +-
protos.h | 13 +++++++++----
recvcmd.c | 6 +++---
send.c | 2 +-
12 files changed, 43 insertions(+), 22 deletions(-)
diff --git a/doc/manual.xml.head b/doc/manual.xml.head
index d7c1d0a1..87f6ecf7 100644
--- a/doc/manual.xml.head
+++ b/doc/manual.xml.head
@@ -11122,7 +11122,8 @@ Mutt uses many temporary files for viewing messages,
verifying digital
signatures, etc. As long as being used, these files are visible by other
users and maybe even readable in case of misconfiguration. Also, a
different location for these files may be desired which can be changed
-via the <link linkend="tmpdir">$tmpdir</link> variable.
+via the <link linkend="tmpdir">$tmpdir</link> and
+<link linkend="tmpdraftdir">$tmpdraftdir</link> variables.
</para>
</sect1>
diff --git a/doc/mutt.man b/doc/mutt.man
index 4dc884c5..a7b619b8 100644
--- a/doc/mutt.man
+++ b/doc/mutt.man
@@ -241,9 +241,9 @@ rely on this being set.
.IP "REPLYTO"
Default Reply-To address.
.IP "TMPDIR"
-Directory in which temporary files are created.
-If unset, \fI/tmp\fP is used.
-See also $tmpdir configuration variable.
+Directory in which temporary files are created. If unset, \fI/tmp\fP
+is used for $tmpdir, and \fI/var/tmp\fP is used for $tmpdraftdir. See
+also the $tmpdir and $tmpdraftdir configuration variables.
.IP "LC_ALL, LC_CTYPE, LANG"
Used to determine charset and locale to use.
.IP TEXTDOMAINDIR
diff --git a/globals.h b/globals.h
index 0675348f..03e43c02 100644
--- a/globals.h
+++ b/globals.h
@@ -171,6 +171,7 @@ WHERE char *SslVerifyHostOverride;
WHERE mbchar_table *StChars;
WHERE char *Status;
WHERE char *Tempdir;
+WHERE char *TempDraftDir;
WHERE mbchar_table *Tochars;
WHERE char *TrashPath;
WHERE char *TSStatusFormat;
diff --git a/headers.c b/headers.c
index dbec2f1d..09202742 100644
--- a/headers.c
+++ b/headers.c
@@ -47,7 +47,7 @@ int mutt_edit_headers (const char *editor,
if (flags != MUTT_EDIT_HEADERS_RESUME)
{
sctx->tempfile = mutt_buffer_new ();
- mutt_buffer_mktemp (sctx->tempfile);
+ mutt_buffer_mktemp_draft (sctx->tempfile);
if ((ofp = safe_fopen (mutt_b2s (sctx->tempfile), "w")) == NULL)
{
mutt_perror (mutt_b2s (sctx->tempfile));
diff --git a/init.c b/init.c
index 4a297a6e..7cd8b233 100644
--- a/init.c
+++ b/init.c
@@ -3852,6 +3852,7 @@ void mutt_init (int skip_sys_rc, LIST *commands)
}
Tempdir = safe_strdup ((p = getenv ("TMPDIR")) ? p : "/tmp");
+ TempDraftDir = safe_strdup ((p = getenv ("TMPDIR")) ? p : "/var/tmp");
p = getenv ("VISUAL");
if (!p)
diff --git a/init.h b/init.h
index 29d54b34..5bd66e02 100644
--- a/init.h
+++ b/init.h
@@ -4696,10 +4696,22 @@ struct option_t MuttVars[] = {
/*
** .pp
** This variable allows you to specify where Mutt will place its
- ** temporary files needed for displaying and composing messages. If
+ ** temporary files needed for displaying messages. If
** this variable is not set, the environment variable \fC$$$TMPDIR\fP is
** used. If \fC$$$TMPDIR\fP is not set then ``\fC/tmp\fP'' is used.
*/
+ { "tmpdraftdir", DT_PATH, R_NONE, {.p=&TempDraftDir}, {.p=0} },
+ /*
+ ** .pp
+ ** This variable allows you to specify where Mutt will place its
+ ** temporary files when composing messages. If this variable is not set,
+ ** the environment variable \fC$$$TMPDIR\fP is used. If \fC$$$TMPDIR\fP
+ ** is not set then ``\fC/var/tmp\fP'' is used.
+ ** .pp
+ ** It's suggested that this be set to a directory whose contents
+ ** won't be removed during an unanticipated reboot, so that the files
+ ** will survive a crash or other unplanned computer shutdown.
+ */
{ "to_chars", DT_MBCHARTBL, R_BOTH, {.p=&Tochars}, {.p=" +TCFL"} },
/*
** .pp
diff --git a/main.c b/main.c
index d4bc77d4..cb32f93e 100644
--- a/main.c
+++ b/main.c
@@ -1093,7 +1093,7 @@ int main (int argc, char **argv, char **environ)
if (!edit_infile)
{
tempfile = mutt_buffer_new ();
- mutt_buffer_mktemp (tempfile);
+ mutt_buffer_mktemp_draft (tempfile);
if ((fout = safe_fopen (mutt_b2s (tempfile), "w")) == NULL)
{
diff --git a/muttlib.c b/muttlib.c
index 2022ee61..494c27d0 100644
--- a/muttlib.c
+++ b/muttlib.c
@@ -64,7 +64,7 @@ BODY *mutt_new_body (void)
* Renamed to mutt_adv_mktemp so I only have to change where it's
* called, and not all possible cases.
*/
-void mutt_adv_mktemp (BUFFER *buf)
+void _mutt_adv_mktemp (BUFFER *buf, const char *tempdir)
{
BUFFER *prefix = NULL;
char *suffix;
@@ -72,14 +72,14 @@ void mutt_adv_mktemp (BUFFER *buf)
if (!(buf->data && buf->data[0]))
{
- mutt_buffer_mktemp (buf);
+ _mutt_buffer_mktemp_pfx_sfx (buf, tempdir, "mutt", NULL);
}
else
{
prefix = mutt_buffer_pool_get ();
mutt_buffer_strcpy (prefix, buf->data);
mutt_sanitize_filename (prefix->data, MUTT_SANITIZE_ALLOW_8BIT);
- mutt_buffer_printf (buf, "%s/%s", NONULL (Tempdir), mutt_b2s (prefix));
+ mutt_buffer_printf (buf, "%s/%s", NONULL (tempdir), mutt_b2s (prefix));
if (lstat (mutt_b2s (buf), &sb) == -1 && errno == ENOENT)
goto out;
@@ -88,21 +88,22 @@ void mutt_adv_mktemp (BUFFER *buf)
*suffix = 0;
++suffix;
}
- _mutt_buffer_mktemp_pfx_sfx (buf, mutt_b2s (prefix), suffix);
+ _mutt_buffer_mktemp_pfx_sfx (buf, tempdir, mutt_b2s (prefix), suffix);
out:
mutt_buffer_pool_release (&prefix);
}
}
-void _mutt_buffer_mktemp (BUFFER *buf, const char *prefix, const char *suffix,
+void _mutt_buffer_mktemp (BUFFER *buf, const char *tempdir,
+ const char *prefix, const char *suffix,
const char *src, int line)
{
RANDOM64 random64;
mutt_random_bytes(random64.char_array, sizeof(random64));
mutt_buffer_printf (buf, "%s/%s-%s-%d-%d-%"PRIu64"%s%s",
- NONULL (Tempdir), NONULL (prefix), NONULL (Hostname),
+ NONULL (tempdir), NONULL (prefix), NONULL (Hostname),
(int) getuid (), (int) getpid (), random64.int_64,
suffix ? "." : "", NONULL (suffix));
muttdbg(3, "%s:%d: mutt_mktemp returns \"%s\".", src, line, mutt_b2s (buf));
diff --git a/postpone.c b/postpone.c
index 44b31db7..4c38234a 100644
--- a/postpone.c
+++ b/postpone.c
@@ -729,7 +729,7 @@ int mutt_prepare_template (FILE *fp, CONTEXT *ctx, HEADER
*newhdr, HEADER *hdr,
mutt_delete_parameter ("x-mutt-noconv", &b->parameter);
}
- mutt_adv_mktemp (file);
+ mutt_adv_mktemp_draft (file);
if ((s.fpout = safe_fopen (mutt_b2s (file), "w")) == NULL)
goto bail;
diff --git a/protos.h b/protos.h
index 2c6b1aef..90a28b67 100644
--- a/protos.h
+++ b/protos.h
@@ -172,10 +172,15 @@ group_t *mutt_pattern_group (const char *);
REGEXP *mutt_compile_regexp (const char *, int);
-void mutt_adv_mktemp (BUFFER *);
-#define mutt_buffer_mktemp(a) _mutt_buffer_mktemp_pfx_sfx (a, "mutt", NULL)
-#define _mutt_buffer_mktemp_pfx_sfx(a,b,c) _mutt_buffer_mktemp (a, b, c,
__FILE__, __LINE__)
-void _mutt_buffer_mktemp (BUFFER *, const char *, const char *, const char *,
int);
+#define mutt_adv_mktemp(a) _mutt_adv_mktemp (a, Tempdir)
+#define mutt_adv_mktemp_draft(a) _mutt_adv_mktemp (a, TempDraftDir)
+void _mutt_adv_mktemp (BUFFER *, const char *);
+
+#define mutt_buffer_mktemp(a) _mutt_buffer_mktemp_pfx_sfx (a, Tempdir, "mutt",
NULL)
+#define mutt_buffer_mktemp_draft(a) _mutt_buffer_mktemp_pfx_sfx (a,
TempDraftDir, "mutt", NULL)
+
+#define _mutt_buffer_mktemp_pfx_sfx(a,b,c,d) _mutt_buffer_mktemp (a, b, c, d,
__FILE__, __LINE__)
+void _mutt_buffer_mktemp (BUFFER *, const char *, const char *, const char *,
const char *, int);
void mutt_account_hook (const char* url);
void mutt_alias_menu (char *, size_t, ALIAS *);
diff --git a/recvcmd.c b/recvcmd.c
index c319a7ab..9f696348 100644
--- a/recvcmd.c
+++ b/recvcmd.c
@@ -486,7 +486,7 @@ static void attach_forward_bodies (FILE * fp, HEADER * hdr,
mutt_make_forward_subject (tmphdr->env, Context, parent_hdr);
tmpbody = mutt_buffer_pool_get ();
- mutt_buffer_mktemp (tmpbody);
+ mutt_buffer_mktemp_draft (tmpbody);
if ((tmpfp = safe_fopen (mutt_b2s (tmpbody), "w")) == NULL)
{
mutt_error (_("Can't open temporary file %s."), mutt_b2s (tmpbody));
@@ -667,7 +667,7 @@ static void attach_forward_msgs (FILE * fp, HEADER * hdr,
/* no MIME encapsulation */
- mutt_buffer_mktemp (tmpbody);
+ mutt_buffer_mktemp_draft (tmpbody);
if (!(tmpfp = safe_fopen (mutt_b2s (tmpbody), "w")))
{
mutt_error (_("Can't create %s."), mutt_b2s (tmpbody));
@@ -969,7 +969,7 @@ void mutt_attach_reply (FILE * fp, HEADER * hdr,
goto cleanup;
tmpbody = mutt_buffer_pool_get ();
- mutt_buffer_mktemp (tmpbody);
+ mutt_buffer_mktemp_draft (tmpbody);
if ((tmpfp = safe_fopen (mutt_b2s (tmpbody), "w")) == NULL)
{
mutt_error (_("Can't create %s."), mutt_b2s (tmpbody));
diff --git a/send.c b/send.c
index 6658fe7d..bb267d03 100644
--- a/send.c
+++ b/send.c
@@ -1931,7 +1931,7 @@ static int send_message_setup (SEND_CONTEXT *sctx, const
char *tempfile,
if (!tempfile)
{
tmpbuffer = mutt_buffer_pool_get ();
- mutt_buffer_mktemp (tmpbuffer);
+ mutt_buffer_mktemp_draft (tmpbuffer);
tempfp = safe_fopen (mutt_b2s (tmpbuffer), "w+");
sctx->msg->content->filename = safe_strdup (mutt_b2s (tmpbuffer));
mutt_buffer_pool_release (&tmpbuffer);
--
2.53.0