- }
-
- 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();
+
+ /* Check for public cache location */
+ if ((cache_public = context_find(nmhcache)) && *cache_public != '/')
+ cache_public = NULL;
+
+ /* Check for private cache location */
+ if (!(cache_private = context_find(nmhprivcache)))
+ cache_private = ".cache";
+ cache_private = getcpy(toabsdir(cache_private));
+
+ /*
+ ** Cache the current directory before we do any chdirs()'s.
+ */
+ cwd = getcpy(pwd());
+
+ /*
+ ** Check for storage directory. If specified,
+ ** then store temporary files there. Else we
+ ** store them in standard nmh directory.
+ */
+ if ((cp = context_find(nmhstorage)) && *cp)
+ tmp = concat(cp, "/", invo_name, NULL);
+ else
+ tmp = getcpy(toabsdir(invo_name));
+
+ if (file && msgs.size)
+ adios(NULL, "cannot specify msg and file at same time!");
+
+ /*
+ ** 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)
+ app_msgarg(&msgs, seq_cur);
+ 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);
+ seq_setprev(mp); /* set the previous-sequence */
+
+ if (!(cts = (CT *) calloc((size_t) (mp->numsel + 1),
+ sizeof(*cts))))
+ adios(NULL, "out of memory");
+ ctp = cts;
+
+ 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;
+ }
+ }