]> diplodocus.org Git - nmh/blobdiff - sbr/folder_addmsg.c
Change "servers" mts.conf entry to only support a single SMTP server.
[nmh] / sbr / folder_addmsg.c
index 1af116cb71fe580316ceb4543d060998c3ba0cfa..806cf929e796641dcbc9dff2b3eaf4dcf941b5b3 100644 (file)
@@ -2,8 +2,6 @@
 /*
  * folder_addmsg.c -- Link message into folder
  *
- * $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.
@@ -11,7 +9,6 @@
 
 #include <h/mh.h>
 #include <fcntl.h>
-#include <errno.h>
 
 /*
  * Link message into a folder.  Return the new number
@@ -22,39 +19,30 @@ int
 folder_addmsg (struct msgs **mpp, char *msgfile, int selected,
                int unseen, int preserve, int deleting, char *from_dir)
 {
-    int infd, outfd, linkerr, first_time, msgnum;
+    int infd, outfd, linkerr, msgnum;
     char *nmsg, newmsg[BUFSIZ];
     char oldmsg[BUFSIZ];
     struct msgs *mp;
     struct stat st1, st2;
 
-    first_time = 1;    /* this is first attempt */
     mp = *mpp;
 
+    /* should we preserve the numbering of the message? */
+    if (preserve && (msgnum = m_atoi (msgfile)) > 0) {
+       ;
+    } else if (mp->nummsg == 0) {
+       /* check if we are adding to empty folder */
+       msgnum = 1;
+    } else {
+       /* else use highest message number + 1 */
+       msgnum = mp->hghmsg + 1;
+    }
+     
     /*
      * We might need to make several attempts
      * in order to add the message to the folder.
      */
-    for (;;) {
-       /*
-        * Get the message number we will attempt to add.
-        */
-       if (first_time) {
-           /* should we preserve the numbering of the message? */
-           if (preserve && (msgnum = m_atoi (msgfile)) > 0) {
-               ;
-           } else if (mp->nummsg == 0) {
-               /* check if we are adding to empty folder */
-               msgnum = 1;
-           } else {
-               /* else use highest message number + 1 */
-               msgnum = mp->hghmsg + 1;
-           }
-           first_time = 0;
-       } else {
-           /* another attempt, so try next higher message number */
-           msgnum++;
-       }
+    for (;; msgnum++) {
 
        /*
         * See if we need more space.  If we need space at the
@@ -63,19 +51,17 @@ folder_addmsg (struct msgs **mpp, char *msgfile, int selected,
         * extend message status range to cover this message number.
          */
        if (msgnum > mp->hghoff) {
-           if ((mp = folder_realloc (mp, mp->lowoff, msgnum + 100)))
-               *mpp = mp;
-           else {
+           if (!(mp = folder_realloc (mp, mp->lowoff, msgnum + 100))) {
                advise (NULL, "unable to allocate folder storage");
                return -1;
-           }
+            }
+            *mpp = mp;
        } else if (msgnum < mp->lowoff) {
-           if ((mp = folder_realloc (mp, msgnum, mp->hghoff)))
-               *mpp = mp;
-           else {
+           if (!(mp = folder_realloc (mp, msgnum, mp->hghoff))) {
                advise (NULL, "unable to allocate folder storage");
                return -1;
-           }
+            }
+            *mpp = mp;
        }
 
        /*
@@ -140,80 +126,78 @@ folder_addmsg (struct msgs **mpp, char *msgfile, int selected,
         * Run the add hook if the message is getting copied or linked somewhere else.
         */
        if (link (msgfile, newmsg) != -1) {
-
            if (deleting) {
                (void)snprintf(oldmsg, sizeof (oldmsg), "%s/%s", from_dir, msgfile);
                (void)ext_hook("ref-hook", oldmsg, newmsg);
            }
            else
-               (void)ext_hook("add-hook", newmsg, (char *)0);
+               (void)ext_hook("add-hook", newmsg, NULL);
 
            return msgnum;
-       } else {
-           linkerr = errno;
+       }
+        linkerr = errno;
 
 #ifdef EISREMOTE
-           if (linkerr == EISREMOTE)
-               linkerr = EXDEV;
+        if (linkerr == EISREMOTE)
+            linkerr = EXDEV;
 #endif /* EISREMOTE */
 
-           /*
-            * Check if the file in our desired location is the same
-            * as the source file.  If so, then just leave it alone
-            * and return.  Otherwise, we will continue the main loop
-            * and try again at another slot (hghmsg+1).
-            */
-           if (linkerr == EEXIST) {
-               if (stat (msgfile, &st2) == 0 && stat (newmsg, &st1) == 0
-                   && st2.st_ino == st1.st_ino) {
-                   return msgnum;
-               } else {
-                   continue;
-               }
-           }
-
-           /*
-            * If link failed because we are trying to link
-            * across devices, then check if there is a message
-            * already in the desired location.  If so, then return
-            * error, else just copy the message.
-            */
-           if (linkerr == EXDEV) {
-               if (stat (newmsg, &st1) == 0) {
-                   advise (NULL, "message %s:%s already exists", newmsg);
-                   return -1;
-               } else {
-                   if ((infd = open (msgfile, O_RDONLY)) == -1) {
-                       advise (msgfile, "unable to open message %s");
-                       return -1;
-                   }
-                   fstat (infd, &st1);
-                   if ((outfd = creat (newmsg, (int) st1.st_mode & 0777)) == -1) {
-                       advise (newmsg, "unable to create");
-                       close (infd);
-                       return -1;
-                   }
-                   cpydata (infd, outfd, msgfile, newmsg);
-                   close (infd);
-                   close (outfd);
-
-                   if (deleting) {
-                       (void)snprintf(oldmsg, sizeof (oldmsg), "%s/%s", from_dir, msgfile);
-                       (void)ext_hook("ref-hook", oldmsg, newmsg);
-                   }
-                   else
-                       (void)ext_hook("add-hook", newmsg, (char *)0);
-
-                   return msgnum;
-               }
-           }
-
-           /*
-            * Else, some other type of link error,
-            * so just return error.
-            */
-           advise (newmsg, "error linking %s to", msgfile);
-           return -1;
-       }
+        /*
+         * Check if the file in our desired location is the same
+         * as the source file.  If so, then just leave it alone
+         * and return.  Otherwise, we will continue the main loop
+         * and try again at another slot (hghmsg+1).
+         */
+        if (linkerr == EEXIST) {
+            if (stat (msgfile, &st2) == 0 && stat (newmsg, &st1) == 0
+                && st2.st_ino == st1.st_ino) {
+                return msgnum;
+            }
+            continue;
+        }
+
+        /*
+         * If link failed because we are trying to link
+         * across devices, then check if there is a message
+         * already in the desired location.  If so, then return
+         * error, else just copy the message.
+         * Cygwin with FAT32 filesystem produces EPERM.
+         */
+        if (linkerr == EXDEV  ||  linkerr == EPERM) {
+            if (stat (newmsg, &st1) == 0) {
+                advise (NULL, "message %s:%s already exists", mp->foldpath, newmsg);
+                return -1;
+            }
+
+            if ((infd = open (msgfile, O_RDONLY)) == -1) {
+                advise (msgfile, "unable to open message %s", msgfile);
+                return -1;
+            }
+            fstat (infd, &st1);
+            if ((outfd = creat (newmsg, (int) st1.st_mode & 0777)) == -1) {
+                advise (newmsg, "unable to create");
+                close (infd);
+                return -1;
+            }
+            cpydata (infd, outfd, msgfile, newmsg);
+            close (infd);
+            close (outfd);
+
+            if (deleting) {
+                (void)snprintf(oldmsg, sizeof (oldmsg), "%s/%s", from_dir, msgfile);
+                (void)ext_hook("ref-hook", oldmsg, newmsg);
+            }
+            else
+                (void)ext_hook("add-hook", newmsg, NULL);
+
+            return msgnum;
+        }
+
+        /*
+         * Else, some other type of link error,
+         * so just return error.
+         */
+        advise (newmsg, "error linking %s to", msgfile);
+        return -1;
     }
 }