X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/7c3407bbf1b38da8ed77363e734f5304f11b2061..ac1e36dc09f4092f4e9fa9ed66003bb585f790ed:/sbr/folder_addmsg.c diff --git a/sbr/folder_addmsg.c b/sbr/folder_addmsg.c index 1a1c8b10..5a78a124 100644 --- a/sbr/folder_addmsg.c +++ b/sbr/folder_addmsg.c @@ -1,6 +1,4 @@ - -/* - * 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 @@ -9,7 +7,6 @@ #include #include -#include /* * Link message into a folder. Return the new number @@ -52,19 +49,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 { - 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; } /* @@ -129,81 +124,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. - * 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, (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) { + 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; } }