if (fp && !use_mailcap && a->filename) {
/* recv case */
strfcpy (pagerfile, a->filename, sizeof (pagerfile));
- mutt_adv_mktemp (pagerfile, sizeof (pagerfile));
+ mutt_adv_mktemp (NULL, pagerfile, sizeof (pagerfile));
}
else
mutt_mktemp (pagerfile);
* Renamed to mutt_adv_mktemp so I only have to change where it's
* called, and not all possible cases.
*/
-void mutt_adv_mktemp (char *s, size_t l)
+void mutt_adv_mktemp (const char* dir, char *s, size_t l)
{
char buf[_POSIX_PATH_MAX];
char tmp[_POSIX_PATH_MAX];
size_t sl;
struct stat sb;
- strfcpy (buf, NONULL (Tempdir), sizeof (buf));
+ strfcpy (buf, dir && *dir ? dir : NONULL (Tempdir), sizeof (buf));
mutt_expand_path (buf, sizeof (buf));
if (s[0] == '\0') {
snprintf (s, l, "%s/muttXXXXXX", buf);
tmp[0] = '\0';
}
- mutt_adv_mktemp (tmp, sizeof (tmp));
+ mutt_adv_mktemp (NULL, tmp, sizeof (tmp));
if (mutt_save_attachment (fp, src, tmp, 0, NULL) == -1)
return -1;
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
+#include <libgen.h>
#include <sys/stat.h>
void nntp_add_to_list (NNTP_SERVER * s, NNTP_DATA * d)
FILE *ifp;
FILE *ofp;
char buf[HUGE_STRING];
- char tmpfile[_POSIX_PATH_MAX];
+ char tmpfile[_POSIX_PATH_MAX], link[_POSIX_PATH_MAX];
char *c;
- int ext = 0, done = 0, r = 0;
+ int ext = 0, done = 0, r = 0, l = 0;
/* if file not exist, create it */
if ((ifp = safe_fopen (filename, "a")))
mutt_error (_("Unable to lock %s"), filename);
return -1;
}
- snprintf (tmpfile, sizeof(tmpfile), "%s.tmp", filename);
+ /* use mutt_adv_mktemp() to get a tempfile in the same
+ * directory as filename is so that we can follow symlinks
+ * via rename(2); as dirname(2) may modify its argument,
+ * temporarily use buf as copy of it
+ */
+ strncpy (buf, filename, sizeof (buf));
+ strncpy (tmpfile, basename (filename), sizeof (tmpfile));
+ mutt_adv_mktemp ((const char*) dirname (buf), tmpfile, sizeof (tmpfile));
debug_print (1, ("Opening %s\n", tmpfile));
if (!(ofp = fopen (tmpfile, "w"))) {
fclose (ifp);
mutt_error (_("Can't write %s"), tmpfile);
return -1;
}
- if (rename (tmpfile, filename) < 0) {
+ link[0] = '\0';
+ if ((l = readlink (filename, link, sizeof (link)-1)) > 0)
+ link[l] = '\0';
+ debug_print (1, ("Renaming %s to %s\n",tmpfile, l > 0 ? link : filename));
+ if (rename (tmpfile, l > 0 ? link : filename) < 0) {
unlink (tmpfile);
- mutt_error (_("Can't rename %s to %s"), tmpfile, filename);
+ mutt_error (_("Can't rename %s to %s"), tmpfile, l > 0 ? link : filename);
return -1;
}
return 0;
mutt_delete_parameter ("x-mutt-noconv", &b->parameter);
}
- mutt_adv_mktemp (file, sizeof (file));
+ mutt_adv_mktemp (NULL, file, sizeof (file));
if ((s.fpout = safe_fopen (file, "w")) == NULL)
goto bail;
void mutt_account_hook (const char *url);
void mutt_add_to_reference_headers (ENVELOPE * env, ENVELOPE * curenv,
LIST *** pp, LIST *** qq);
-void mutt_adv_mktemp (char *, size_t);
+void mutt_adv_mktemp (const char*, char*, size_t);
void mutt_allow_interrupt (int);
void mutt_block_signals (void);
void mutt_block_signals_system (void);
}
}
- mutt_adv_mktemp (newfile, nflen);
+ mutt_adv_mktemp (NULL, newfile, nflen);
if (rmatch && lmatch)
return 0;