- int i, j, mode;
- char *msgnam;
- char f1[BUFSIZ], f2[BUFSIZ], f3[BUFSIZ];
- FILE *in, *out;
- struct stat st;
- struct msgs *mp;
-
- if ((in = fopen (msgnam = m_name (msgnum), "r")) == NULL)
- adios (msgnam, "unable to read message");
-
- mode = fstat (fileno(in), &st) != NOTOK ? (st.st_mode & 0777) : m_gmprot();
- mp = *mpp;
-
- /*
- * See if we have enough space in the folder
- * structure for all the new messages.
- */
- if ((mp->hghmsg + numburst > mp->hghoff) &&
- !(mp = folder_realloc (mp, mp->lowoff, mp->hghmsg + numburst)))
- adios (NULL, "unable to allocate folder storage");
- *mpp = mp;
-
- j = mp->hghmsg; /* old value */
- mp->hghmsg += numburst;
- mp->nummsg += numburst;
-
- /*
- * If this is not the highest SELECTED message, then
- * increment mp->hghsel by numburst, since the highest
- * SELECTED is about to be slid down by that amount.
- */
- if (msgnum < mp->hghsel)
- mp->hghsel += numburst;
-
- /*
- * If -inplace is given, renumber the messages after the
- * source message, to make room for each of the messages
- * contained within the digest.
- *
- * This is equivalent to refiling a message from the point
- * of view of the external hooks.
- */
- if (inplace) {
- for (i = mp->hghmsg; j > msgnum; i--, j--) {
- strncpy (f1, m_name (i), sizeof(f1));
- strncpy (f2, m_name (j), sizeof(f2));
- if (does_exist (mp, j)) {
- if (verbosw)
- printf ("message %d becomes message %d\n", j, i);
-
- if (rename (f2, f1) == NOTOK)
- admonish (f1, "unable to rename %s to", f2);
-
- (void)snprintf(f1, sizeof (f1), "%s/%d", maildir, i);
- (void)snprintf(f2, sizeof (f2), "%s/%d", maildir, j);
- ext_hook("ref-hook", f1, f2);
-
- copy_msg_flags (mp, i, j);
- clear_msg_flags (mp, j);
- mp->msgflags |= SEQMOD;
- }
- }
- }
-
- unset_selected (mp, msgnum);
-
- /* new hghmsg is hghmsg + numburst
- *
- * At this point, there is an array of numburst smsgs, each element of
- * which contains the starting and stopping offsets (seeks) of the message
- * in the digest. The inplace flag is set if the original digest is replaced
- * by a message containing the table of contents. smsgs[0] is that table of
- * contents. Go through the message numbers in reverse order (high to low).
- *
- * Set f1 to the name of the destination message, f2 to the name of a scratch
- * file. Extract a message from the digest to the scratch file. Move the
- * original message to a backup file if the destination message number is the
- * same as the number of the original message, which only happens if the
- * inplace flag is set. Then move the scratch file to the destination message.
- *
- * Moving the original message to the backup file is equivalent to deleting the
- * message from the point of view of the external hooks. And bursting each
- * message is equivalent to adding a new message.
- */
-
- i = inplace ? msgnum + numburst : mp->hghmsg;
- for (j = numburst; j >= (inplace ? 0 : 1); i--, j--) {
- strncpy (f1, m_name (i), sizeof(f1));
- strncpy (f2, m_mktemp(invo_name, NULL, &out), sizeof(f2));
-
- if (verbosw && i != msgnum)
- printf ("message %d of digest %d becomes message %d\n", j, msgnum, i);
-
- chmod (f2, mode);
- fseek (in, smsgs[j].s_start, SEEK_SET);
- cpybrst (in, out, msgnam, f2,
- (int) (smsgs[j].s_stop - smsgs[j].s_start));
- fclose (out);
-
- if (i == msgnum) {
- strncpy (f3, m_backup (f1), sizeof(f3));
- if (rename (f1, f3) == NOTOK)
- admonish (f3, "unable to rename %s to", f1);
-
- (void)snprintf(f3, sizeof (f3), "%s/%d", maildir, i);
- ext_hook("del-hook", f3, (char *)0);
+ int i, j, mode;
+ char *msgnam;
+ char f1[BUFSIZ], f2[BUFSIZ], f3[BUFSIZ];
+ FILE *in, *out;
+ struct stat st;
+ struct msgs *mp;
+
+ if ((in = fopen(msgnam = m_name(msgnum), "r")) == NULL)
+ adios(msgnam, "unable to read message");
+
+ mode = fstat(fileno(in), &st) != NOTOK ?
+ (int)(st.st_mode & 0777) : m_gmprot();
+ mp = *mpp;
+
+ /*
+ ** See if we have enough space in the folder
+ ** structure for all the new messages.
+ */
+ if ((mp->hghmsg + numburst > mp->hghoff) &&
+ !(mp = folder_realloc(mp, mp->lowoff, mp->hghmsg + numburst)))
+ adios(NULL, "unable to allocate folder storage");
+ *mpp = mp;
+
+ j = mp->hghmsg; /* old value */
+ mp->hghmsg += numburst;
+ mp->nummsg += numburst;
+
+ /*
+ ** If this is not the highest SELECTED message, then
+ ** increment mp->hghsel by numburst, since the highest
+ ** SELECTED is about to be slid down by that amount.
+ */
+ if (msgnum < mp->hghsel)
+ mp->hghsel += numburst;
+
+ /*
+ ** If -inplace is given, renumber the messages after the
+ ** source message, to make room for each of the messages
+ ** contained within the digest.
+ **
+ ** This is equivalent to refiling a message from the point
+ ** of view of the external hooks.
+ */
+ if (inplace) {
+ for (i = mp->hghmsg; j > msgnum; i--, j--) {
+ strncpy(f1, m_name(i), sizeof(f1));
+ strncpy(f2, m_name(j), sizeof(f2));
+ if (does_exist(mp, j)) {
+ if (verbosw)
+ printf("message %d becomes message %d\n", j, i);
+
+ if (rename(f2, f1) == NOTOK)
+ admonish(f1, "unable to rename %s to", f2);
+
+ snprintf(f1, sizeof (f1), "%s/%d", maildir, i);
+ snprintf(f2, sizeof (f2), "%s/%d", maildir, j);
+ ext_hook("ref-hook", f1, f2);
+
+ copy_msg_flags(mp, i, j);
+ clear_msg_flags(mp, j);
+ mp->msgflags |= SEQMOD;
+ }
+ }