X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Frefile.c;h=e50253af5f5ebffba89ba603974a02cb4345ae83;hp=f484ccb8eb7195657ab9b2c1d40c614b20f7a9aa;hb=008837e090c008e3afe7a9c8667070bafa091e62;hpb=017a82124bf2ea39ced5aa4c8f969c18b3c2fb90 diff --git a/uip/refile.c b/uip/refile.c index f484ccb..e50253a 100644 --- a/uip/refile.c +++ b/uip/refile.c @@ -4,9 +4,14 @@ * -- into one or more destination folders * * $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 +#include #include #include @@ -47,8 +52,6 @@ static struct swit switches[] = { { NULL, 0 } }; -extern int errno; - static char maildir[BUFSIZ]; struct st_fold { @@ -62,7 +65,7 @@ struct st_fold { static void opnfolds (struct st_fold *, int); static void clsfolds (struct st_fold *, int); static void remove_files (int, char **); -static int m_file (char *, struct st_fold *, int, int); +static int m_file (char *, struct st_fold *, int, int, int); int @@ -95,8 +98,7 @@ main (int argc, char **argv) */ nummsgs = 0; maxmsgs = MAXMSGS; - if (!(msgs = (char **) malloc ((size_t) (maxmsgs * sizeof(*msgs))))) - adios (NULL, "unable to allocate storage"); + msgs = (char **) mh_xmalloc ((size_t) (maxmsgs * sizeof(*msgs))); /* * Parse arguments @@ -183,9 +185,8 @@ main (int argc, char **argv) */ if (nummsgs >= maxmsgs) { maxmsgs += MAXMSGS; - if (!(msgs = (char **) realloc (msgs, - (size_t) (maxmsgs * sizeof(*msgs))))) - adios (NULL, "unable to reallocate msgs storage"); + msgs = (char **) mh_xrealloc (msgs, + (size_t) (maxmsgs * sizeof(*msgs))); } msgs[nummsgs++] = cp; } @@ -209,7 +210,7 @@ main (int argc, char **argv) adios (NULL, "use -file or some messages, not both"); opnfolds (folders, foldp); for (i = 0; i < filep; i++) - if (m_file (files[i], folders, foldp, preserve)) + if (m_file (files[i], folders, foldp, preserve, 0)) done (1); /* If -nolink, then "remove" files */ if (!linkf) @@ -243,11 +244,16 @@ main (int argc, char **argv) /* create folder structures for each destination folder */ opnfolds (folders, foldp); - /* Link all the selected messages into destination folders */ + /* Link all the selected messages into destination folders. + * + * This causes the add hook to be run for messages that are + * linked into another folder. The refile hook is run for + * messages that are moved to another folder. + */ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (is_selected (mp, msgnum)) { cp = getcpy (m_name (msgnum)); - if (m_file (cp, folders, foldp, preserve)) + if (m_file (cp, folders, foldp, preserve, !linkf)) done (1); free (cp); } @@ -265,9 +271,13 @@ main (int argc, char **argv) fflush (stdout); } - /* If -nolink, then "remove" messages from source folder */ + /* If -nolink, then "remove" messages from source folder. + * + * Note that folder_delmsgs does not call the delete hook + * because the message has already been handled above. + */ if (!linkf) { - folder_delmsgs (mp, unlink_msgs); + folder_delmsgs (mp, unlink_msgs, 1); } clsfolds (folders, foldp); @@ -383,13 +393,13 @@ remove_files (int filep, char **files) */ static int -m_file (char *msgfile, struct st_fold *folders, int nfolders, int preserve) +m_file (char *msgfile, struct st_fold *folders, int nfolders, int preserve, int refile) { int msgnum; struct st_fold *fp, *ep; for (fp = folders, ep = folders + nfolders; fp < ep; fp++) { - if ((msgnum = folder_addmsg (&fp->f_mp, msgfile, 1, 0, preserve)) == -1) + if ((msgnum = folder_addmsg (&fp->f_mp, msgfile, 1, 0, preserve, nfolders == 1 && refile, maildir)) == -1) return 1; } return 0;