-
/*
* folder_delmsgs.c -- "remove" SELECTED messages from a folder
*
int
folder_delmsgs (struct msgs *mp, int unlink_msgs, int nohook)
{
- pid_t pid;
- int msgnum, vecp, retval = 0;
- char buf[100], *dp, **vec;
- char msgpath[BUFSIZ];
-
- /*
- * If "rmmproc" is defined, exec it to remove messages.
- */
- if (rmmproc) {
- /* Unset the EXISTS flag for each message to be removed */
- for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
- if (is_selected (mp, msgnum))
- unset_exists (mp, msgnum);
- }
-
- /* Mark that the sequence information has changed */
- mp->msgflags |= SEQMOD;
+ pid_t pid;
+ int msgnum, vecp, retval = 0;
+ char buf[100], *dp, **vec;
+ char msgpath[BUFSIZ];
+
+ /*
+ * If "rmmproc" is defined, exec it to remove messages.
+ */
+ if (rmmproc) {
+ /* Unset the EXISTS flag for each message to be removed */
+ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
+ if (is_selected (mp, msgnum))
+ unset_exists (mp, msgnum);
+ }
- if (mp->numsel > MAXARGS - 2)
- adios (NULL, "more than %d messages for %s exec", MAXARGS - 2,
- rmmproc);
- vec = (char **) calloc ((size_t) (mp->numsel + 2), sizeof(*vec));
- if (vec == NULL)
- adios (NULL, "unable to allocate exec vector");
- vecp = 1;
- for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
- if (is_selected (mp, msgnum) &&
- !(vec[vecp++] = strdup (m_name (msgnum))))
- adios (NULL, "strdup failed");
- }
- vec[vecp] = NULL;
+ /* Mark that the sequence information has changed */
+ mp->msgflags |= SEQMOD;
+
+ if (mp->numsel > MAXARGS - 2)
+ adios (NULL, "more than %d messages for %s exec", MAXARGS - 2,
+ rmmproc);
+ vec = (char **) calloc ((size_t) (mp->numsel + 2), sizeof(*vec));
+ if (vec == NULL)
+ adios (NULL, "unable to allocate exec vector");
+ vecp = 1;
+ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
+ if (is_selected (mp, msgnum) &&
+ !(vec[vecp++] = strdup (m_name (msgnum))))
+ adios (NULL, "strdup failed");
+ }
+ vec[vecp] = NULL;
- fflush (stdout);
- vec[0] = r1bindex (rmmproc, '/');
+ fflush (stdout);
+ vec[0] = r1bindex (rmmproc, '/');
- switch (pid = vfork()) {
- case -1:
- advise ("fork", "unable to");
- return -1;
+ switch (pid = vfork()) {
+ case -1:
+ advise ("fork", "unable to");
+ return -1;
- case 0:
- execvp (rmmproc, vec);
- fprintf (stderr, "unable to exec ");
- perror (rmmproc);
- _exit (-1);
+ case 0:
+ execvp (rmmproc, vec);
+ fprintf (stderr, "unable to exec ");
+ perror (rmmproc);
+ _exit (-1);
- default:
- return (pidwait (pid, -1));
- }
- }
-
- /*
- * Either unlink or rename the SELECTED messages
- */
- for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
- if (is_selected (mp, msgnum)) {
- /* unselect message */
- unset_selected (mp, msgnum);
- mp->numsel--;
-
- /*
- * Run the external hook on the message if one was specified in the context.
- * All we have is the message number; we have changed to the directory
- * containing the message. So, we need to extract that directory to form
- * the complete path. Note that the caller knows the directory, but has
- * no way of passing that to us.
- */
-
- if (!nohook) {
- (void)snprintf(msgpath, sizeof (msgpath), "%s/%d", mp->foldpath, msgnum);
- (void)ext_hook("del-hook", msgpath, (char *)0);
+ default:
+ return (pidwait (pid, -1));
}
+ }
- dp = m_name (msgnum);
-
- if (unlink_msgs) {
- /* just unlink the messages */
- if (unlink (dp) == -1) {
- admonish (dp, "unable to unlink");
- retval = -1;
- continue;
- }
- } else {
- /* or rename messages with standard prefix */
- strncpy (buf, m_backup (dp), sizeof(buf));
- if (rename (dp, buf) == -1) {
- admonish (buf, "unable to rename %s to", dp);
- retval = -1;
- continue;
+ /*
+ * Either unlink or rename the SELECTED messages
+ */
+ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
+ if (is_selected (mp, msgnum)) {
+ /* unselect message */
+ unset_selected (mp, msgnum);
+ mp->numsel--;
+
+ /*
+ * Run the external hook on the message if one was specified in the context.
+ * All we have is the message number; we have changed to the directory
+ * containing the message. So, we need to extract that directory to form
+ * the complete path. Note that the caller knows the directory, but has
+ * no way of passing that to us.
+ */
+
+ if (!nohook) {
+ (void)snprintf(msgpath, sizeof (msgpath), "%s/%d", mp->foldpath, msgnum);
+ (void)ext_hook("del-hook", msgpath, (char *)0);
+ }
+
+ dp = m_name (msgnum);
+
+ if (unlink_msgs) {
+ /* just unlink the messages */
+ if (unlink (dp) == -1) {
+ admonish (dp, "unable to unlink");
+ retval = -1;
+ continue;
+ }
+ } else {
+ /* or rename messages with standard prefix */
+ strncpy (buf, m_backup (dp), sizeof(buf));
+ if (rename (dp, buf) == -1) {
+ admonish (buf, "unable to rename %s to", dp);
+ retval = -1;
+ continue;
+ }
+ }
+
+ /* If removal was successful, decrement message count */
+ unset_exists (mp, msgnum);
+ mp->nummsg--;
}
- }
-
- /* If removal was successful, decrement message count */
- unset_exists (mp, msgnum);
- mp->nummsg--;
}
- }
- /* Sanity check */
- if (mp->numsel != 0)
+ /* Sanity check */
+ if (mp->numsel != 0)
adios (NULL, "oops, mp->numsel should be 0");
- /* Mark that the sequence information has changed */
- mp->msgflags |= SEQMOD;
+ /* Mark that the sequence information has changed */
+ mp->msgflags |= SEQMOD;
- return retval;
+ return retval;
}