/*
* forw.c -- forward a message, or group of messages.
*
- * $Id$
+ * This code is Copyright (c) 2002, by the authors of nmh. See the
+ * COPYRIGHT file in the root directory of the nmh distribution for
+ * complete copyright information.
*/
#include <h/mh.h>
#include <fcntl.h>
-#include <h/fmt_scan.h>
-#include <zotnet/tws/tws.h>
+#include <h/tws.h>
+#include <h/utils.h>
#define IFORMAT "digest-issue-%s"
#define VERSIONSW 22
{ "version", 0 },
#define HELPSW 23
- { "help", 4 },
+ { "help", 0 },
#define FILESW 24
{ "file file", 4 }, /* interface from msh */
-
-#ifdef MHE
#define BILDSW 25
{ "build", 5 }, /* interface from mhe */
-#endif /* MHE */
-
+#define FROMSW 26
+ { "from address", 0 },
+#define TOSW 27
+ { "to address", 0 },
+#define CCSW 28
+ { "cc address", 0 },
+#define SUBJECTSW 29
+ { "subject text", 0 },
+#define FCCSW 30
+ { "fcc mailbox", 0 },
+#define WIDTHSW 31
+ { "width columns", 0 },
{ NULL, 0 }
};
static void mhl_draft (int, char *, int, int, char *, char *, int);
static void copy_draft (int, char *, char *, int, int, int);
static void copy_mime_draft (int);
-static int build_form (char *, char *, int, int);
int
int msgp = 0, anot = 0, inplace = 1, mime = 0;
int issue = 0, volume = 0, dashstuff = 0;
int nedit = 0, nwhat = 0, i, in;
- int out, isdf = 0, msgnum;
+ int out, isdf = 0, msgnum = 0;
+ int outputlinelen = OUTPUTLINELEN;
+ int dat[5];
char *cp, *cwd, *maildir, *dfolder = NULL;
char *dmsg = NULL, *digest = NULL, *ed = NULL;
- char *file = NULL, *filter = NULL, *folder = NULL;
+ char *file = NULL, *filter = NULL, *folder = NULL, *fwdmsg = NULL;
+ char *from = NULL, *to = NULL, *cc = NULL, *subject = NULL, *fcc = NULL;
char *form = NULL, buf[BUFSIZ], value[10];
char **argp, **arguments, *msgs[MAXARGS];
struct stat st;
-#ifdef MHE
int buildsw = 0;
-#endif /* MHE */
#ifdef LOCALE
setlocale(LC_ALL, "");
adios (NULL, "missing argument to %s", argp[-2]);
nwhat = 0;
continue;
-#ifdef MHE
case BILDSW:
buildsw++; /* fall... */
-#endif /* MHE */
case NWHATSW:
nwhat++;
continue;
continue;
case DGSTSW:
- if (!(digest = *argp++) || *digest == '-')
+ if (!(cp = *argp++) || *cp == '-')
adios (NULL, "missing argument to %s", argp[-2]);
+ digest = getcpy(cp);
mime = 0;
continue;
case ISSUESW:
case NBITSTUFFSW:
dashstuff = -1; /* trinary logic */
continue;
+
+ case FROMSW:
+ if (!(cp = *argp++) || *cp == '-')
+ adios (NULL, "missing argument to %s", argp[-2]);
+ from = addlist(from, cp);
+ continue;
+ case TOSW:
+ if (!(cp = *argp++) || *cp == '-')
+ adios (NULL, "missing argument to %s", argp[-2]);
+ to = addlist(to, cp);
+ continue;
+ case CCSW:
+ if (!(cp = *argp++) || *cp == '-')
+ adios (NULL, "missing argument to %s", argp[-2]);
+ cc = addlist(cc, cp);
+ continue;
+ case FCCSW:
+ if (!(cp = *argp++) || *cp == '-')
+ adios (NULL, "missing argument to %s", argp[-2]);
+ fcc = addlist(fcc, cp);
+ continue;
+ case SUBJECTSW:
+ if (!(cp = *argp++) || *cp == '-')
+ adios (NULL, "missing argument to %s", argp[-2]);
+ subject = getcpy(cp);
+ continue;
+
+ case WIDTHSW:
+ if (!(cp = *argp++) || *cp == '-')
+ adios (NULL, "missing argument to %s", argp[-2]);
+ if ((outputlinelen = atoi(cp)) < 10)
+ adios (NULL, "impossible width %d", outputlinelen);
+ continue;
}
}
if (*cp == '+' || *cp == '@') {
if (folder)
adios (NULL, "only one folder at a time!");
else
- folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
+ folder = pluspath (cp);
} else {
msgs[msgp++] = cp;
}
try_it_again:
-#ifdef MHE
strncpy (drft, buildsw ? m_maildir ("draft")
: m_draft (dfolder, NULL, NOUSE, &isdf), sizeof(drft));
/* Check if a draft already exists */
if (!buildsw && stat (drft, &st) != NOTOK) {
-#else
- strncpy (drft, m_draft (dfolder, dmsg, NOUSE, &isdf), sizeof(drft));
-
- /* Check if a draft already exists */
- if (stat (drft, &st) != NOTOK) {
-#endif /* MHE */
printf ("Draft \"%s\" exists (%ld bytes).", drft, (long) st.st_size);
for (i = LISTDSW; i != YESW;) {
if (!(argp = getans ("\nDisposition? ", isdf ? aqrnl : aqrl)))
if (!m_convert (mp, msgs[msgnum]))
done (1);
seq_setprev (mp); /* set the previous sequence */
+
+ /*
+ * Find the first message in our set and use it as the input
+ * for the component scanner
+ */
+
+ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++)
+ if (is_selected (mp, msgnum)) {
+ fwdmsg = strdup(m_name(msgnum));
+ break;
+ }
+
+ if (! fwdmsg)
+ adios (NULL, "Unable to find input message");
}
if (filter && access (filter, R_OK) == NOTOK)
issue = 0;
issue++;
}
- if (volume == 0)
+ if (volume == 0) {
snprintf (buf, sizeof(buf), VFORMAT, digest);
- if ((cp = context_find (buf)) == NULL || (volume = atoi (cp)) <= 0)
- volume = 1;
+ if ((cp = context_find (buf)) == NULL || (volume = atoi (cp)) <= 0)
+ volume = 1;
+ }
if (!form)
form = digestcomps;
- in = build_form (form, digest, volume, issue);
} else {
- if (form) {
- if ((in = open (etcpath (form), O_RDONLY)) == NOTOK)
- adios (form, "unable to open form file");
- } else {
- if ((in = open (etcpath (forwcomps), O_RDONLY)) == NOTOK)
- adios (forwcomps, "unable to open default components file");
- form = forwcomps;
- }
+ if (!form)
+ form = forwcomps;
}
+ dat[0] = digest ? issue : msgnum;
+ dat[1] = volume;
+ dat[2] = 0;
+ dat[3] = outputlinelen;
+ dat[4] = 0;
+
+
+ in = build_form (form, digest, dat, from, to, cc, fcc, subject,
+ file ? file : fwdmsg);
+
if ((out = creat (drft, m_gmprot ())) == NOTOK)
adios (drft, "unable to create");
if (nwhat)
done (0);
what_now (ed, nedit, NOUSE, drft, NULL, 0, mp,
- anot ? "Forwarded" : NULL, inplace, cwd);
- return done (1);
+ anot ? "Forwarded" : NULL, inplace, cwd, 0);
+ done (1);
+ return 1;
}
if (mp->numsel >= MAXARGS - i)
adios (NULL, "more than %d messages for %s exec",
- vec[0], MAXARGS - i);
+ MAXARGS - i, vec[0]);
/*
* Now add the message names to filter. We can only
* handle about 995 messages (because vec is fixed size),
* but that should be plenty.
*/
- for (msgnum = mp->lowsel; msgnum <= mp->hghsel && i < sizeof(vec) - 1;
- msgnum++)
+ for (msgnum = mp->lowsel;
+ msgnum <= mp->hghsel && i < (int) sizeof(vec) - 1;
+ msgnum++)
if (is_selected (mp, msgnum))
vec[i++] = getcpy (m_name (msgnum));
vec[i] = NULL;
if (digest) {
strncpy (buffer, delim4, sizeof(buffer));
} else {
- snprintf (buffer, sizeof(buffer), "\n------- End of Forwarded Message%s\n\n",
+ snprintf (buffer, sizeof(buffer), "\n------- End of Forwarded Message%s\n",
mp->numsel > 1 ? "s" : "");
}
write (out, buffer, strlen (buffer));
}
write (out, "\n", 1);
}
-
-
-static int
-build_form (char *form, char *digest, int volume, int issue)
-{
- int in;
- int fmtsize;
- register char *nfs;
- char *line, tmpfil[BUFSIZ];
- register FILE *tmp;
- register struct comp *cptr;
- struct format *fmt;
- int dat[5];
-
- /* Get new format string */
- nfs = new_fs (form, NULL, NULL);
- fmtsize = strlen (nfs) + 256;
-
- /* Compile format string */
- fmt_compile (nfs, &fmt);
-
- FINDCOMP (cptr, "digest");
- if (cptr)
- cptr->c_text = digest;
- FINDCOMP (cptr, "date");
- if (cptr)
- cptr->c_text = getcpy(dtimenow (0));
-
- dat[0] = issue;
- dat[1] = volume;
- dat[2] = 0;
- dat[3] = fmtsize;
- dat[4] = 0;
-
- strncpy (tmpfil, m_tmpfil (invo_name), sizeof(tmpfil));
- if ((tmp = fopen (tmpfil, "w+")) == NULL)
- adios (tmpfil, "unable to create");
- unlink (tmpfil);
- if ((in = dup (fileno (tmp))) == NOTOK)
- adios ("dup", "unable to");
-
- if ((line = malloc ((unsigned) fmtsize)) == NULL)
- adios (NULL, "unable to allocate format line storage");
- fmt_scan (fmt, line, fmtsize, dat);
- fputs (line, tmp);
- free (line);
- if (fclose (tmp))
- adios (tmpfil, "error writing");
-
- lseek (in, (off_t) 0, SEEK_SET);
- return in;
-}