#include <h/mh.h>
#include <fcntl.h>
-#include <h/fmt_scan.h>
#include <h/tws.h>
#include <h/utils.h>
{ "file file", 4 }, /* interface from msh */
#define BILDSW 25
{ "build", 5 }, /* interface from 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;
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 (!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
- in = open_form(&form, forwcomps);
+ } else {
+ 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);
+ anot ? "Forwarded" : NULL, inplace, cwd, 0);
done (1);
return 1;
}
* 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];
- FILE *tmp;
- register struct comp *cptr;
- struct format *fmt;
- int dat[5];
- char *cp = NULL;
-
- /* 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;
-
- cp = m_mktemp2(NULL, invo_name, NULL, &tmp);
- if (cp == NULL) adios("forw", "unable to create temporary file");
- strncpy (tmpfil, cp, sizeof(tmpfil));
- unlink (tmpfil);
- if ((in = dup (fileno (tmp))) == NOTOK)
- adios ("dup", "unable to");
-
- line = mh_xmalloc ((unsigned) fmtsize);
- 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;
-}