Use good m_ functions, because it smell like a flower, version 2.
[apps/madmutt.git] / muttlib.c
index 4b13526..9afd5cd 100644 (file)
--- a/muttlib.c
+++ b/muttlib.c
@@ -12,7 +12,6 @@
 
 #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" */
@@ -190,13 +170,15 @@ ssize_t _mutt_expand_path(char *s, ssize_t slen, int rx)
     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 */
@@ -216,7 +198,7 @@ void mutt_pretty_mailbox (char *s)
   /* 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');
@@ -250,14 +232,6 @@ void mutt_pretty_mailbox (char *s)
   }
 }
 
-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,
@@ -630,29 +604,6 @@ void mutt_sleep (short s)
     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];
@@ -667,48 +618,6 @@ const char *mutt_make_version (int full)
   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)
 {
@@ -921,7 +830,7 @@ int mutt_extract_token(BUFFER *dest, BUFFER *tok, int flags)
             /* 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
@@ -937,7 +846,7 @@ int mutt_extract_token(BUFFER *dest, BUFFER *tok, int flags)
                 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;