+ } else if (inc_type == INC_FILE) { /* Maildir inbox to process */
+ char *sp;
+ FILE *sf;
+ int i;
+
+ hghnum = msgnum = mp->hghmsg;
+ for (i = 0; i < num_maildir_entries; i++) {
+ msgnum++;
+ /*
+ * Check if we need to allocate more space for message status.
+ * If so, then add space for an additional 100 messages.
+ */
+ if (msgnum >= mp->hghoff
+ && !(mp = folder_realloc (mp, mp->lowoff, mp->hghoff + 100))) {
+ advise (NULL, "unable to allocate folder storage");
+ incerr = NOTOK;
+ break;
+ }
+
+ sp = Maildir[i].filename;
+ cp = getcpy (m_name (msgnum));
+ pf = NULL;
+ if (!trnflag || link(sp, cp) == -1) {
+ static char buf[65536];
+ size_t nrd;
+
+ if ((sf = fopen (sp, "r")) == NULL)
+ adios (sp, "unable to read for copy");
+ if ((pf = fopen (cp, "w+")) == NULL)
+ adios (cp, "unable to write for copy");
+ while ((nrd = fread(buf, 1, sizeof(buf), sf)) > 0)
+ if (fwrite(buf, 1, nrd, pf) != nrd)
+ break;
+ if (ferror(sf) || fflush(pf) || ferror(pf)) {
+ int e = errno;
+ fclose(pf); fclose(sf); unlink(cp);
+ errno = e;
+ adios(cp, "copy error %s -> %s", sp, cp);
+ }
+ fclose (sf);
+ sf = NULL;
+ }
+ if (pf == NULL && (pf = fopen (cp, "r")) == NULL)
+ adios (cp, "not available");
+ chmod (cp, m_gmprot ());
+
+ fseek (pf, 0L, SEEK_SET);
+ switch (incerr = scan (pf, msgnum, 0, nfs, width,
+ msgnum == mp->hghmsg + 1 && chgflag,
+ 1, NULL, stop - start, noisy)) {
+ case SCNEOF:
+ printf ("%*d empty\n", DMAXFOLDER, msgnum);
+ break;
+
+ case SCNFAT:
+ trnflag = 0;
+ noisy++;
+ /* advise (cp, "unable to read"); already advised */
+ /* fall thru */
+
+ case SCNERR:
+ case SCNNUM:
+ break;
+
+ case SCNMSG:
+ case SCNENC:
+ default:
+ /*
+ * Run the external program hook on the message.
+ */
+
+ (void)snprintf(b, sizeof (b), "%s/%d", maildir_copy, msgnum + 1);
+ (void)ext_hook("add-hook", b, (char *)0);
+
+ if (aud)
+ fputs (scanl, aud);
+ if (noisy)
+ fflush (stdout);
+ if (!packfile) {
+ clear_msg_flags (mp, msgnum);
+ set_exists (mp, msgnum);
+ set_unseen (mp, msgnum);
+ mp->msgflags |= SEQMOD;
+ }
+ break;
+ }
+ if (ferror(pf) || fclose (pf)) {
+ int e = errno;
+ unlink (cp);
+ errno = e;
+ adios (cp, "write error on");
+ }
+ pf = NULL;
+ free (cp);
+
+ if (trnflag && unlink (sp) == NOTOK)
+ adios (sp, "couldn't unlink");
+ free (sp); /* Free Maildir[i]->filename */
+ }
+ free (Maildir); /* From now on Maildir is just a flag - don't dref! */