]> diplodocus.org Git - nmh/blobdiff - uip/mhstoresbr.c
lock_file.c: close(2) file descriptor on failure, avoiding leak.
[nmh] / uip / mhstoresbr.c
index 5a6f630c15538dce2d708591bdc1e810c445194a..0e9b94cd112d0e68f9eb25bf481d46a874889443 100644 (file)
@@ -1,6 +1,4 @@
-
-/*
- * mhstoresbr.c -- routines to save/store the contents of MIME messages
+/* mhstoresbr.c -- routines to save/store the contents of MIME messages
  *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
 #include <h/md5.h>
 #include <h/mts.h>
 #include <h/tws.h>
+#include <h/fmt_scan.h>
 #include <h/mime.h>
 #include <h/mhparse.h>
 #include <h/utils.h>
+#include "mhmisc.h"
+#include "mhshowsbr.h"
+#include "sbr/m_maildir.h"
+#include "sbr/m_mktemp.h"
 
 enum clobber_policy_t {
   NMH_CLOBBER_ALWAYS = 0,
@@ -24,7 +27,7 @@ enum clobber_policy_t {
   NMH_CLOBBER_NEVER
 };
 
-static enum clobber_policy_t clobber_policy (const char *);
+static enum clobber_policy_t clobber_policy (const char *) PURE;
 
 struct mhstoreinfo {
     CT *cts;                 /* Top-level list of contents to store. */
@@ -78,11 +81,6 @@ mhstoreinfo_files_not_clobbered (const mhstoreinfo_t info) {
 typedef int (*qsort_comp) (const void *, const void *);
 
 
-/* mhmisc.c */
-int part_ok (CT);
-int type_ok (CT, int);
-void flush_errors (void);
-
 /*
  * static prototypes
  */
@@ -343,7 +341,7 @@ store_partial (CT ct, mhstoreinfo_t info)
     }
 
     if (hi == 0) {
-       advise (NULL, "missing (at least) last part of multipart message");
+       inform("missing (at least) last part of multipart message");
        return NOTOK;
     }
 
@@ -366,22 +364,21 @@ store_partial (CT ct, mhstoreinfo_t info)
     for (ctq = base; *ctq; ctq++) {
        p = *ctq;
        pm = (struct partial *) p->c_ctparams;
-       if (pm->pm_marked != cur) {
-           if (pm->pm_marked == cur - 1) {
-               admonish (NULL,
-                         "duplicate part %d of %d part multipart message",
-                         pm->pm_marked, hi);
-               continue;
-           }
+       if (pm->pm_marked == cur) {
+           cur++;
+            continue;
+        }
+
+        if (pm->pm_marked == cur - 1) {
+            inform("duplicate part %d of %d part multipart message, continuing...",
+                      pm->pm_marked, hi);
+            continue;
+        }
 
 missing_part:
-           advise (NULL,
-                   "missing %spart %d of %d part multipart message",
-                   cur != hi ? "(at least) " : "", cur, hi);
-           goto losing;
-       }
-        else
-           cur++;
+        inform("missing %spart %d of %d part multipart message",
+            cur != hi ? "(at least) " : "", cur, hi);
+        goto losing;
     }
     if (hi != --cur) {
        cur = hi;
@@ -530,7 +527,7 @@ store_content (CT ct, CT p, mhstoreinfo_t info)
        if (p) {
            appending = 1;
             if (! ct->c_storage) {
-               ct->c_storage = add (p->c_storage, NULL);
+               ct->c_storage = mh_xstrdup(FENDNULL(p->c_storage));
 
                /* record the folder name */
                if (p->c_folder) {
@@ -584,7 +581,7 @@ store_content (CT ct, CT p, mhstoreinfo_t info)
            create_folder(m_mailpath(folder), 0, exit);
 
            /* Record the folder name */
-           ct->c_folder = add (folder, NULL);
+           ct->c_folder = mh_xstrdup(folder);
 
            if (cp[1])
                free (folder);
@@ -706,7 +703,7 @@ output_content_file (CT ct, int appending)
        int cc, fd;
 
        if (!ct->c_ceopenfnx) {
-           advise (NULL, "don't know how to decode part %s of message %s",
+           inform("don't know how to decode part %s of message %s",
                    ct->c_partno, ct->c_file);
            return NOTOK;
        }
@@ -901,13 +898,12 @@ output_content_folder (char *folder, char *filename)
     struct msgs *mp;
 
     /* Read the folder. */
-    if ((mp = folder_read (folder, 0))) {
-       /* Link file into folder */
-       msgnum = folder_addmsg (&mp, filename, 0, 0, 0, 0, NULL);
-    } else {
-       advise (NULL, "unable to read folder %s", folder);
+    if (!(mp = folder_read(folder, 0))) {
+       inform("unable to read folder %s", folder);
        return NOTOK;
     }
+    /* Link file into folder */
+    msgnum = folder_addmsg(&mp, filename, 0, 0, 0, 0, NULL);
 
     /* free folder structure */
     folder_free (mp);
@@ -950,7 +946,9 @@ parse_format_string (CT ct, char *cp, char *buffer, int buflen, char *dir)
      * appropriate directory.
      */
     if (*cp != '/' && *cp != '|' && *cp != '!') {
-       snprintf (bp, buflen, "%s/", dir[1] ? dir : "");
+        if (!strcmp(dir, "/"))
+            dir = ""; /* Don't start with "//". */
+       snprintf (bp, buflen, "%s/", dir);
        len = strlen (bp);
        bp += len;
        buflen -= len;
@@ -971,7 +969,8 @@ parse_format_string (CT ct, char *cp, char *buffer, int buflen, char *dir)
                        *bp = '\0';
                        buflen--;
                        continue;
-                   } else {
+                   }
+                    {
                        PM pm;
                        char *s = "";
 
@@ -998,7 +997,7 @@ parse_format_string (CT ct, char *cp, char *buffer, int buflen, char *dir)
                    break;
 
                case 'p':
-                   /* insert part number withouth leading dot */
+                   /* insert part number without leading dot */
                    if (ct->c_partno)
                        strncpy (bp, ct->c_partno, buflen);
                    break;
@@ -1071,7 +1070,7 @@ get_storeproc (CT ct)
                free(cp);
                return;
        }
-        mh_xfree(cp);
+        free(cp);
     }
 
     /*
@@ -1085,7 +1084,7 @@ get_storeproc (CT ct)
            ct->c_storeproc = mh_xstrdup(cp);
 
     }
-    mh_xfree(cp);
+    free(cp);
 }
 
 
@@ -1175,7 +1174,7 @@ next_version (char *file, enum clobber_policy_t clobber_policy) {
 
       default:
         /* Should never get here. */
-        advise (NULL, "will not overwrite %s, invalid clobber policy", buffer);
+        inform("will not overwrite %s, invalid clobber policy", buffer);
         free (buffer);
         return NULL;
     }
@@ -1196,7 +1195,7 @@ next_version (char *file, enum clobber_policy_t clobber_policy) {
   free (file);
 
   if (version >= max_versions) {
-    advise (NULL, "will not overwrite %s, too many versions", buffer);
+    inform("will not overwrite %s, too many versions", buffer);
     free (buffer);
     buffer = NULL;
   }
@@ -1278,7 +1277,7 @@ clobber_check (char *original_file, mhstoreinfo_t info) {
             free (prompt);
           } else {
             /* Overwrite, that's what nmh used to do.  And warn. */
-            advise (NULL, "-clobber ask but no tty, so overwrite %s", file);
+            inform("-clobber ask but no tty, so overwrite %s", file);
             break;
           }
 
@@ -1298,7 +1297,7 @@ clobber_check (char *original_file, mhstoreinfo_t info) {
                 file = NULL;
                 ++info->files_not_clobbered;
               } else {
-                TrimSuffixC(buf, '\n');
+                trim_suffix_c(buf, '\n');
               }
 
               free (file);
@@ -1322,7 +1321,7 @@ clobber_check (char *original_file, mhstoreinfo_t info) {
         if (stat (file, &st) == OK) {
           /* Keep count of files that would have been clobbered,
              and return that as process exit status. */
-          advise (NULL, "will not overwrite %s with -clobber never", file);
+          inform("will not overwrite %s with -clobber never", file);
           free (file);
           file = NULL;
           ++info->files_not_clobbered;