X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Frefile.c;h=e50253af5f5ebffba89ba603974a02cb4345ae83;hp=83e56395b6be6b3cdf0d3428366c8a6ba887c820;hb=008837e090c008e3afe7a9c8667070bafa091e62;hpb=1691e80890e5d8ba258c51c214a3e91880e1db2b diff --git a/uip/refile.c b/uip/refile.c index 83e5639..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 @@ -43,12 +48,10 @@ static struct swit switches[] = { #define VERSIONSW 11 { "version", 0 }, #define HELPSW 12 - { "help", 4 }, + { "help", 0 }, { 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); @@ -280,7 +290,7 @@ main (int argc, char **argv) context_replace (pfolder, folder); /* update current folder */ context_save (); /* save the context file */ folder_free (mp); /* free folder structure */ - done (0); + return done (0); } @@ -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;