#include <grp.h>
#include <pwd.h>
-#include <utime.h>
#include <lib-mime/mime.h>
#include <lib-ui/curses.h>
*/
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 */
/* if s is an url, only collapse path component */
if (scheme != U_UNKNOWN) {
p = strchr (s, ':') + 1;
- if (!strncmp (p, "//", 2))
+ if (!m_strncmp (p, "//", 2))
q = strchr (p + 2, '/');
if (!q)
q = strchr (p, '\0');
}
}
-void
-mutt_expand_file_fmt(char *dst, ssize_t n, const char *fmt, const char *src)
-{
- char tmp[LONG_STRING];
- mutt_quote_filename(tmp, sizeof(tmp), src);
- m_snsubst(dst, n, fmt, tmp);
-}
-
/* return 0 on success, -1 on abort, 1 on error */
int mutt_check_overwrite (const char *attname, const char *path,
char *fname, ssize_t flen, int *append,
sleep(MAX(s, SleepTime));
}
-/* Decrease a file's modification time by 1 second */
-time_t mutt_decrease_mtime (const char *f, struct stat *st)
-{
- struct utimbuf utim;
- struct stat _st;
- time_t mtime;
-
- if (!st) {
- if (stat (f, &_st) == -1)
- return -1;
- st = &_st;
- }
-
- if ((mtime = st->st_mtime) == time (NULL)) {
- mtime -= 1;
- utim.actime = mtime;
- utim.modtime = mtime;
- utime (f, &utim);
- }
-
- return mtime;
-}
-
const char *mutt_make_version (int full)
{
static char vstring[STRING];
return vstring;
}
-int mutt_match_spam_list (const char *s, rx_t * l, char *text, int x)
-{
- static regmatch_t *pmatch = NULL;
- static int nmatch = 0;
- int i, n, tlen;
- char *p;
-
- if (!s)
- return 0;
-
- tlen = 0;
-
- for (; l; l = l->next) {
- /* If this pattern needs more matches, expand pmatch. */
- if (l->nmatch > nmatch) {
- p_realloc(&pmatch, l->nmatch);
- nmatch = l->nmatch;
- }
-
- /* Does this pattern match? */
- if (regexec(l->rx, s, l->nmatch, (regmatch_t *)pmatch, (int) 0) == 0) {
- /* Copy template into text, with substitutions. */
- for (p = l->template; *p;) {
- if (*p == '%') {
- n = atoi (++p); /* find pmatch index */
- while (isdigit ((unsigned char) *p))
- ++p; /* skip subst token */
- for (i = pmatch[n].rm_so; (i < pmatch[n].rm_eo) && (tlen < x); i++)
- text[tlen++] = s[i];
- }
- else {
- text[tlen++] = *p++;
- }
- }
- text[tlen] = '\0';
- return 1;
- }
- }
-
- return 0;
-}
-
/* return 1 if address lists are strictly identical */
static int mutt_cmp_addr (const address_t * a, const address_t * b)
{
/* read line */
p_clear(&expn, 1);
expn.data = mutt_read_line(NULL, &expn.dsize, fp, &line);
- fclose(fp);
+ m_fclose(&fp);
mutt_wait_filter(pid);
/* if we got output, make a new string consiting of the shell ouptput
tok->dsize = expnlen + m_strlen(tok->dptr) + 1;
ptr = xmalloc(tok->dsize);
memcpy(ptr, expn.data, expnlen);
- strcpy(ptr + expnlen, tok->dptr); /* __STRCPY_CHECKED__ */
+ m_strcpy(ptr + expnlen, tok->dsize - expnlen, tok->dptr);
if (tok->destroy)
p_delete(&tok->data);
tok->data = ptr;