+ /*
+ ** check if message is coming from file
+ */
+ if (file) {
+ if (!(cts = (CT *) calloc((size_t) 2, sizeof(*cts))))
+ adios(NULL, "out of memory");
+ ctp = cts;
+
+ if ((ct = parse_mime(file)))
+ *ctp++ = ct;
+ } else {
+ /*
+ ** message(s) are coming from a folder
+ */
+ if (!msgs.size) {
+ switch (mode) {
+ case NEXT:
+ app_msgarg(&msgs, seq_next);
+ break;
+ case PREV:
+ app_msgarg(&msgs, seq_prev);
+ break;
+ default:
+ app_msgarg(&msgs, seq_cur);
+ break;
+ }
+ }
+ if (!folder)
+ folder = getcurfol();
+ maildir = toabsdir(folder);
+
+ if (chdir(maildir) == NOTOK)
+ adios(maildir, "unable to change directory to");
+
+ /* read folder and create message structure */
+ if (!(mp = folder_read(folder)))
+ adios(NULL, "unable to read folder %s", folder);
+
+ /* check for empty folder */
+ if (mp->nummsg == 0)
+ adios(NULL, "no messages in %s", folder);
+
+ /* parse all the message ranges/sequences and set SELECTED */
+ for (msgnum = 0; msgnum < msgs.size; msgnum++)
+ if (!m_convert(mp, msgs.msgs[msgnum]))
+ done(1);
+
+ /*
+ ** Set the SELECT_UNSEEN bit for all the SELECTED messages,
+ ** since we will use that as a tag to know which messages
+ ** to remove from the "unseen" sequence.
+ */
+ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++)
+ if (is_selected(mp, msgnum))
+ set_unseen(mp, msgnum);
+
+ seq_setprev(mp); /* set the Previous-Sequence */
+ seq_setunseen(mp, 0); /* unset unseen seqs for shown msgs */
+
+ if (!(cts = (CT *) calloc((size_t) (mp->numsel + 1),
+ sizeof(*cts))))
+ adios(NULL, "out of memory");
+ ctp = cts;
+
+ /*
+ ** Parse all the SELECTED messages.
+ */
+ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
+ if (is_selected(mp, msgnum)) {
+ char *msgnam;
+
+ msgnam = m_name(msgnum);
+ if ((ct = parse_mime(msgnam)))
+ *ctp++ = ct;
+ }
+ }
+ }
+
+ if (!*cts)
+ done(1);
+
+ userrs = 1;
+ SIGNAL(SIGQUIT, quitser);
+ SIGNAL(SIGPIPE, pipeser);
+
+ /*
+ ** Get the associated umask for the relevant contents.
+ */
+ for (ctp = cts; *ctp; ctp++) {
+ struct stat st;
+
+ ct = *ctp;
+ if (type_ok(ct, 1) && !ct->c_umask) {
+ if (stat(ct->c_file, &st) != NOTOK)
+ ct->c_umask = ~(st.st_mode & 0777);
+ else
+ ct->c_umask = ~m_gmprot();
+ }
+ }