-
-/*
- * folder_addmsg.c -- Link message into folder
+/* folder_addmsg.c -- Link message into folder
*
* 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/mh.h>
+#include "h/mh.h"
+#include "m_name.h"
+#include "cpydata.h"
+#include "m_atoi.h"
+#include "ext_hook.h"
+#include "folder_realloc.h"
+#include "folder_addmsg.h"
+#include "error.h"
#include <fcntl.h>
/*
* 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 {
- advise (NULL, "unable to allocate folder storage");
+ if (!(mp = folder_realloc (mp, mp->lowoff, msgnum + 100))) {
+ inform("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 {
- advise (NULL, "unable to allocate folder storage");
+ if (!(mp = folder_realloc (mp, msgnum, mp->hghoff))) {
+ inform("unable to allocate folder storage");
return -1;
- }
+ }
+ *mpp = mp;
}
/*
* 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);
(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.
- * 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;
- } else {
- 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;
- }
+ /*
+ * 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) {
+ inform("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;
}
}