whatnow cooks up strings for executing external commands, and then
[mmh] / uip / dropsbr.c
index 6089a22..7771b6b 100644 (file)
@@ -2,25 +2,19 @@
 /*
  * dropsbr.c -- create/read/manipulate mail drops
  *
- * $Id$
+ * This code is Copyright (c) 2002, by the authors of nmh.  See the
+ * COPYRIGHT file in the root directory of the nmh distribution for
+ * complete copyright information.
  */
 
 #include <h/nmh.h>
+#include <h/utils.h>
 
-#ifndef        MMDFONLY
-# include <h/mh.h>
-# include <h/dropsbr.h>
-# include <zotnet/mts/mts.h>
-# include <h/tws.h>
-#else
-# include "dropsbr.h"
-# include "strings.h"
-# include "mmdfonly.h"
-#endif
-
-#ifdef HAVE_ERRNO_H
-# include <errno.h>
-#endif
+#include <h/mh.h>
+#include <h/dropsbr.h>
+#include <h/mts.h>
+#include <h/tws.h>
+#include <errno.h>
 
 #ifdef NTOHLSWAP
 # include <netinet/in.h>
 
 #include <fcntl.h>
 
-extern int errno;
-
 /*
  * static prototypes
  */
 static int mbx_chk_mbox (int);
 static int mbx_chk_mmdf (int);
-static int map_open (char *, int *, int);
+static int map_open (char *, int);
 
 
 /*
@@ -148,13 +140,12 @@ mbx_chk_mbox (int fd)
 static int
 mbx_chk_mmdf (int fd)
 {
-    size_t count;
+    ssize_t count;
     char ldelim[BUFSIZ];
 
     count = strlen (mmdlm2);
 
-    /* casting -count to off_t, seem to break FreeBSD 2.2.6 */
-    if (lseek (fd, (long) (-count), SEEK_END) == (off_t) NOTOK)
+    if (lseek (fd, -count, SEEK_END) == (off_t) NOTOK)
        return NOTOK;
     if (read (fd, ldelim, count) != count)
        return NOTOK;
@@ -222,14 +213,8 @@ mbx_read (FILE *fp, long pos, struct drop **drops, int noisy)
        if (dp >= ep) {
            register int    curlen = dp - pp;
 
-           cp = (struct drop *) realloc ((char *) pp,
+           cp = (struct drop *) mh_xrealloc ((char *) pp,
                                    (size_t) (len += MAXFOLDER) * sizeof(*pp));
-           if (cp == NULL) {
-               if (noisy)
-                   admonish (NULL, "unable to allocate drop storage");
-               free ((char *) pp);
-               return 0;
-           }
            dp = cp + curlen, ep = (pp = cp) + len - 1;
        }
     }
@@ -385,7 +370,7 @@ mbx_copy (char *mailbox, int mbx_style, int md, int fd,
                            fp = strchr(ep + 1, '\n');
                        tp = dctime(dlocaltimenow());
                        snprintf (buffer, sizeof(buffer), "From %.*s  %s",
-                               fp - ep, ep, tp);
+                               (int)(fp - ep), ep, tp);
                    } else if (!strncmp (buffer, "X-Envelope-From:", 16)) {
                        /*
                         * Change the "X-Envelope-From:" field
@@ -478,8 +463,9 @@ mbx_size (int md, off_t start, off_t stop)
 int
 mbx_close (char *mailbox, int md)
 {
-    lkclose (md, mailbox);
-    return OK;
+    if (lkclose (md, mailbox) == 0)
+        return OK;
+    return NOTOK;
 }
 
 
@@ -497,10 +483,10 @@ map_name (char *file)
     if ((dp = strchr(cp = r1bindex (file, '/'), '.')) == NULL)
        dp = cp + strlen (cp);
     if (cp == file)
-       snprintf (buffer, sizeof(buffer), ".%.*s%s", dp - cp, cp, ".map");
+       snprintf (buffer, sizeof(buffer), ".%.*s%s", (int)(dp - cp), cp, ".map");
     else
        snprintf (buffer, sizeof(buffer), "%.*s.%.*s%s",
-               cp - file, file, dp - cp, cp, ".map");
+               (int)(cp - file), file, (int)(dp - cp), cp, ".map");
 
     return buffer;
 }
@@ -531,7 +517,8 @@ map_read (char *file, long pos, struct drop **drops, int noisy)
     memcpy((char *) dp, (char *) mp, sizeof(*dp));
 
     lseek (md, (off_t) sizeof(*mp), SEEK_SET);
-    if ((i = read (md, (char *) (dp + 1), msgp * sizeof(*dp))) < sizeof(*dp)) {
+    if ((i = read (md, (char *) (dp + 1), msgp * sizeof(*dp))) <
+        (int) sizeof(*dp)) {
        i = 0;
        free ((char *) dp);
     } else {
@@ -565,14 +552,20 @@ map_write (char *mailbox, int md, int id, long last, off_t start,
     register struct drop *dp;
     struct drop d1, d2, *rp;
     register FILE *fp;
+    struct stat st;
 
-    if ((fd = map_open (file = map_name (mailbox), &clear, md)) == NOTOK)
+    if ((fd = map_open (file = map_name (mailbox), md)) == NOTOK)
        return NOTOK;
 
+    if ((fstat (fd, &st) == OK) && (st.st_size > 0))
+       clear = 0;
+    else
+       clear = 1;
+
     if (!clear && map_chk (file, fd, &d1, pos, noisy)) {
        unlink (file);
        mbx_close (file, fd);
-       if ((fd = map_open (file, &clear, md)) == NOTOK)
+       if ((fd = map_open (file, md)) == NOTOK)
            return NOTOK;
        clear++;
     }
@@ -594,6 +587,7 @@ map_write (char *mailbox, int md, int id, long last, off_t start,
                return NOTOK;
 
            case OK:
+               fclose (fp);
                break;
 
            default:
@@ -611,6 +605,7 @@ map_write (char *mailbox, int md, int id, long last, off_t start,
                    }
                }
                free ((char *) rp);
+               fclose (fp);
                break;
        }
     }
@@ -651,12 +646,12 @@ map_write (char *mailbox, int md, int id, long last, off_t start,
 
 
 static int
-map_open (char *file, int *clear, int md)
+map_open (char *file, int md)
 {
     mode_t mode;
     struct stat st;
 
-    mode = fstat (md, &st) != NOTOK ? (mode_t) (st.st_mode & 0777) : m_gmprot ();
+    mode = fstat (md, &st) != NOTOK ? (int) (st.st_mode & 0777) : m_gmprot ();
     return mbx_open (file, OTHER_FORMAT, st.st_uid, st.st_gid, mode);
 }
 
@@ -664,7 +659,7 @@ map_open (char *file, int *clear, int md)
 int
 map_chk (char *file, int fd, struct drop *dp, long pos, int noisy)
 {
-    long count;
+    ssize_t count;
     struct drop d, tmpd;
     register struct drop *dl;
 
@@ -705,7 +700,7 @@ map_chk (char *file, int fd, struct drop *dp, long pos, int noisy)
     }
 
     dl = &d;
-    count = (long) strlen (mmdlm2);
+    count = strlen (mmdlm2);
     lseek (fd, (off_t) (dp->d_id * sizeof(*dp)), SEEK_SET);
     if (read (fd, (char *) dl, sizeof(*dl)) != sizeof(*dl)
            || (ntohl(dl->d_stop) != dp->d_stop