*/
void mutt_adv_mktemp (const char* dir, char *s, ssize_t l)
{
- char buf[_POSIX_PATH_MAX];
- char tmp[_POSIX_PATH_MAX];
- char *period;
- ssize_t sl;
- struct stat sb;
-
- m_strcpy(buf, sizeof(buf), m_strisempty(dir) ? NONULL(Tempdir) : dir);
- mutt_expand_path (buf, sizeof (buf));
- if (s[0] == '\0') {
- snprintf (s, l, "%s/muttXXXXXX", buf);
- mktemp (s);
- }
- else {
- m_strcpy(tmp, sizeof(tmp), s);
- mutt_sanitize_filename (tmp, 1);
- snprintf (s, l, "%s/%s", buf, tmp);
- if (lstat (s, &sb) == -1 && errno == ENOENT)
- return;
- if ((period = strrchr (tmp, '.')) != NULL)
- *period = 0;
- snprintf (s, l, "%s/%s.XXXXXX", buf, tmp);
- mktemp (s);
- if (period != NULL) {
- *period = '.';
- sl = m_strlen(s);
- m_strcpy(s + sl, l - sl, period);
+ int fd;
+
+ fd = m_tempfd(s, l, m_strisempty(dir) ? NONULL(Tempdir) : dir, s);
+ if (fd < 0) {
+ *s = '\0';
+ } else {
+ close(fd);
+ unlink(s);
}
- }
}
/* returns true if the header contained in "s" is in list "t" */
return m_strcpy(s, slen, tmp);
}
-void mutt_mktemp (char *s)
+void mutt_mktemp(char *s)
{
-
- snprintf (s, _POSIX_PATH_MAX, "%s/madmutt-%s-%d-%d-%d-%x%x", NONULL (Tempdir),
- NONULL (Hostname), (int) getuid (), (int) getpid (), Counter++,
- (unsigned int) rand(), (unsigned int) rand());
- unlink (s);
+ int fd = m_tempfd(s, _POSIX_PATH_MAX, NONULL(Tempdir), NULL);
+ if (fd < 0) {
+ *s = '\0';
+ } else {
+ close(fd);
+ unlink(s);
+ }
}
/* collapse the pathname using ~ or = when possible */
{
char tmp[LONG_STRING];
mutt_quote_filename(tmp, sizeof(tmp), src);
- m_snsubst(dst, n, fmt, tmp);
+ m_file_fmt(dst, n, fmt, tmp);
}
/* return 0 on success, -1 on abort, 1 on error */