#define QUOTE '\\'
-static struct swit mhlswitches[] = {
-#define BELLSW 0
- { "bell", 0 },
-#define NBELLSW 1
- { "nobell", 0 },
-#define CLRSW 2
- { "clear", 0 },
-#define NCLRSW 3
- { "noclear", 0 },
-#define FOLDSW 4
- { "folder +folder", 0 },
-#define FORMSW 5
+static struct swit switches[] = {
+#define FORMSW 0
{ "form formfile", 0 },
-#define PROGSW 6
- { "moreproc program", 0 },
-#define LENSW 7
- { "length lines", 0 },
-#define WIDTHSW 8
+#define WIDTHSW 1
{ "width columns", 0 },
-#define SLEEPSW 9
- { "sleep seconds", 0 },
-#define VERSIONSW 10
- { "version", 0 },
-#define HELPSW 11
+#define VERSIONSW 2
+ { "Version", 0 },
+#define HELPSW 3
{ "help", 0 },
-#define FORW1SW 12
+#define FORW1SW 4
{ "forward", -7 },
-#define FORW2SW 13
+#define FORW2SW 5
{ "forwall", -7 },
-#define DGSTSW 14
- { "digest list", -6 },
-#define VOLUMSW 15
- { "volume number", -6 },
-#define ISSUESW 16
- { "issue number", -5 },
-#define NBODYSW 17
+#define NBODYSW 6
{ "nobody", -6 },
{ NULL, 0 }
};
#define CLEARTEXT 0x000008 /* cleartext */
#define EXTRA 0x000010 /* an "extra" component */
#define HDROUTPUT 0x000020 /* already output */
-#define CLEARSCR 0x000040 /* clear screen */
-#define LEFTADJUST 0x000080 /* left justify multiple lines */
-#define COMPRESS 0x000100 /* compress text */
-#define ADDRFMT 0x000200 /* contains addresses */
-#define BELL 0x000400 /* sound bell at EOP */
-#define DATEFMT 0x000800 /* contains dates */
-#define FORMAT 0x001000 /* parse address/date/RFC-2047 field */
-#define INIT 0x002000 /* initialize component */
-#define SPLIT 0x004000 /* split headers (don't concatenate) */
-#define NONEWLINE 0x008000 /* don't write trailing newline */
-#define LBITS "\020\01NOCOMPONENT\02UPPERCASE\03CENTER\04CLEARTEXT\05EXTRA\06HDROUTPUT\07CLEARSCR\010LEFTADJUST\011COMPRESS\012ADDRFMT\013BELL\014DATEFMT\015FORMAT\016INIT\017SPLIT\020NONEWLINE"
+#define LEFTADJUST 0x000040 /* left justify multiple lines */
+#define COMPRESS 0x000080 /* compress text */
+#define ADDRFMT 0x000100 /* contains addresses */
+#define DATEFMT 0x000200 /* contains dates */
+#define FORMAT 0x000400 /* parse address/date/RFC-2047 field */
+#define INIT 0x000800 /* initialize component */
+#define SPLIT 0x001000 /* split headers (don't concatenate) */
+#define NONEWLINE 0x002000 /* don't write trailing newline */
+#define LBITS "\020\01NOCOMPONENT\02UPPERCASE\03CENTER\04CLEARTEXT\05EXTRA\06HDROUTPUT\07LEFTADJUST\010COMPRESS\011ADDRFMT\012DATEFMT\013FORMAT\014INIT\015SPLIT\016NONEWLINE"
#define GFLAGS (NOCOMPONENT | UPPERCASE | CENTER | LEFTADJUST | COMPRESS | SPLIT)
struct mcomp {
char *c_name; /* component name */
char *c_text; /* component text */
char *c_ovtxt; /* text overflow indicator */
- char *c_nfs; /* iff FORMAT */
+ char *c_fstr; /* iff FORMAT */
struct format *c_fmt; /* .. */
int c_offset; /* left margin indentation */
int c_ovoff; /* overflow indentation */
int c_width; /* width of field */
int c_cwidth; /* width of component */
- int c_length; /* length in lines */
long c_flags;
struct mcomp *c_next;
};
static struct mcomp *fmttl = NULL;
static struct mcomp global = {
- NULL, NULL, "", NULL, NULL, 0, -1, 80, -1, 40, BELL, 0
+ NULL, NULL, NULL, NULL, NULL, 0, -1, 80, -1, 0, NULL
};
static struct mcomp holder = {
- NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, NOCOMPONENT, 0
+ NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NOCOMPONENT, NULL
};
struct pair {
{ "nouppercase", 0, UPPERCASE },
{ "center", CENTER, 0 },
{ "nocenter", 0, CENTER },
- { "clearscreen", CLEARSCR, 0 },
- { "noclearscreen", 0, CLEARSCR },
- { "noclear", 0, CLEARSCR },
{ "leftadjust", LEFTADJUST, 0 },
{ "noleftadjust", 0, LEFTADJUST },
{ "compress", COMPRESS, 0 },
{ "split", SPLIT, 0 },
{ "nosplit", 0, SPLIT },
{ "addrfield", ADDRFMT, DATEFMT },
- { "bell", BELL, 0 },
- { "nobell", 0, BELL },
{ "datefield", DATEFMT, ADDRFMT },
{ "newline", 0, NONEWLINE },
{ "nonewline", NONEWLINE, 0 },
};
-static int bellflg = 0;
-static int clearflg = 0;
static int dobody = 1;
static int forwflg = 0;
static int forwall = 0;
-static int sleepsw = NOTOK;
-
-static char *digest = NULL;
-static int volume = 0;
-static int issue = 0;
-
static int exitstat = 0;
static int mhldebug = 0;
-#define PITTY (-1)
-#define NOTTY 0
-#define ISTTY 1
-static int ontty = NOTTY;
-
-static int row;
-static int column;
+static unsigned int column;
static int lm;
-static int llim;
static int ovoff;
static int term;
-static int wid;
+static unsigned int wid;
static char *ovtxt;
static jmp_buf env;
static jmp_buf mhlenv;
-static char delim3[] =
-"\n----------------------------------------------------------------------\n\n";
-static char delim4[] = "\n------------------------------\n\n";
-
static FILE *(*mhl_action) () = (FILE *(*) ()) 0;
/*
** prototypes
*/
-static void mhl_format(char *, int, int);
+static void mhl_format(char *, int);
static int evalvar(struct mcomp *);
static int ptoi(char *, int *);
static int ptos(char *, char **);
static char *parse(void);
-static void process(char *, char *, int, int);
+static void process(char *, int, int);
static void mhlfile(FILE *, char *, int, int);
static int mcomp_flags(char *);
static char *mcomp_add(long, char *, char *);
static char *oneline(char *, long);
static void putstr(char *);
static void putch(char);
-static RETSIGTYPE intrser(int);
-static RETSIGTYPE pipeser(int);
-static RETSIGTYPE quitser(int);
+static void intrser(int);
static void mhladios(char *, char *, ...);
static void mhldone(int);
-static void m_popen(char *);
-
-void m_pclose(void);
-void clear_screen(void); /* from termsbr.c */
-int SOprintf(char *, ...); /* from termsbr.c */
int sc_width(void); /* from termsbr.c */
-int sc_length(void); /* from termsbr.c */
int
main(int argc, char **argv)
{
- int length = 0;
int i, width = 0, vecp = 0;
- char *cp, *folder = NULL, *form = NULL;
+ char *cp, *form = NULL;
char buf[BUFSIZ], *files[MAXARGS];
char **argp, **arguments;
-#ifdef LOCALE
setlocale(LC_ALL, "");
-#endif
-
invo_name = mhbasename(argv[0]);
/* read user profile/context */
while ((cp = *argp++)) {
if (*cp == '-') {
- switch (smatch(++cp, mhlswitches)) {
+ switch (smatch(++cp, switches)) {
case AMBIGSW:
- ambigsw(cp, mhlswitches);
+ ambigsw(cp, switches);
done(1);
case UNKWNSW:
adios(NULL, "-%s unknown\n", cp);
case HELPSW:
snprintf(buf, sizeof(buf), "%s [switches] [files ...]", invo_name);
- print_help(buf, mhlswitches, 1);
+ print_help(buf, switches, 1);
done(1);
case VERSIONSW:
print_version(invo_name);
done(1);
- case BELLSW:
- bellflg = 1;
- continue;
- case NBELLSW:
- bellflg = -1;
- continue;
-
- case CLRSW:
- clearflg = 1;
- continue;
- case NCLRSW:
- clearflg = -1;
- continue;
-
- case FOLDSW:
- if (!(folder = *argp++) || *folder == '-')
- adios(NULL, "missing argument to %s",
- argp[-2]);
- continue;
case FORMSW:
if (!(form = *argp++) || *form == '-')
adios(NULL, "missing argument to %s",
argp[-2]);
continue;
- case SLEEPSW:
- if (!(cp = *argp++) || *cp == '-')
- adios(NULL, "missing argument to %s",
- argp[-2]);
- sleepsw = atoi(cp); /* ZERO ok! */
- continue;
-
- case PROGSW:
- if (!(moreproc = *argp++) || *moreproc == '-')
- adios(NULL, "missing argument to %s",
- argp[-2]);
- continue;
-
- case LENSW:
- if (!(cp = *argp++) || *cp == '-')
- adios(NULL, "missing argument to %s",
- argp[-2]);
- if ((length = atoi(cp)) < 1)
- adios(NULL, "bad argument %s %s",
- argp[-2], cp);
- continue;
case WIDTHSW:
if (!(cp = *argp++) || *cp == '-')
adios(NULL, "missing argument to %s",
argp[-2], cp);
continue;
- case DGSTSW:
- if (!(digest = *argp++) ||
- *digest == '-')
- adios(NULL, "missing argument to %s",
- argp[-2]);
- continue;
- case ISSUESW:
- if (!(cp = *argp++) || *cp == '-')
- adios(NULL, "missing argument to %s",
- argp[-2]);
- if ((issue = atoi(cp)) < 1)
- adios(NULL, "bad argument %s %s",
- argp[-2], cp);
- continue;
- case VOLUMSW:
- if (!(cp = *argp++) || *cp == '-')
- adios(NULL, "missing argument to %s",
- argp[-2]);
- if ((volume = atoi(cp)) < 1)
- adios(NULL, "bad argument %s %s",
- argp[-2], cp);
- continue;
-
case FORW2SW:
forwall++; /* fall */
case FORW1SW:
forwflg++;
- clearflg = -1;/* XXX */
continue;
case NBODYSW:
files[vecp++] = cp;
}
- if (!folder)
- folder = getenv("mhfolder");
-
- if (isatty(fileno(stdout))) {
- if (moreproc && *moreproc) {
- if (mhl_action) {
- SIGNAL(SIGINT, SIG_IGN);
- SIGNAL2(SIGQUIT, quitser);
- }
- SIGNAL2(SIGPIPE, pipeser);
- m_popen(moreproc);
- ontty = PITTY;
- } else {
- SIGNAL(SIGINT, SIG_IGN);
- SIGNAL2(SIGQUIT, quitser);
- ontty = ISTTY;
- }
- } else {
- ontty = NOTTY;
- }
-
- mhl_format(form ? form : mhlformat, length, width);
+ mhl_format(form ? form : mhlformat, width);
if (vecp == 0) {
- process(folder, NULL, 1, vecp = 1);
+ process(NULL, 1, vecp = 1);
} else {
for (i = 0; i < vecp; i++)
- process(folder, files[i], i + 1, vecp);
+ process(files[i], i + 1, vecp);
}
if (forwall) {
- if (digest) {
- printf("%s", delim4);
- if (volume == 0) {
- snprintf(buf, sizeof(buf),
- "End of %s Digest\n", digest);
- } else {
- snprintf(buf, sizeof(buf), "End of %s Digest [Volume %d Issue %d]\n", digest, volume, issue);
- }
- i = strlen(buf);
- for (cp = buf + i; i > 1; i--)
- *cp++ = '*';
- *cp++ = '\n';
- *cp = 0;
- printf("%s", buf);
- } else
- printf("\n------- End of Forwarded Message%s\n\n",
+ printf("\n------- End of Forwarded Message%s\n\n",
vecp > 1 ? "s" : "");
}
adios("output", "error writing");
}
- if (clearflg > 0 && ontty == NOTTY)
- clear_screen();
-
- if (ontty == PITTY)
- m_pclose();
-
return exitstat;
}
static void
-mhl_format(char *file, int length, int width)
+mhl_format(char *file, int width)
{
int i;
- char *bp, *cp, **ip;
+ char *bp, *cp;
char *ap, buffer[BUFSIZ], name[NAMESZ];
struct mcomp *c1;
struct stat st;
ino = st.st_ino;
}
- global.c_ovtxt = global.c_nfs = NULL;
+ global.c_ovtxt = global.c_fstr = NULL;
global.c_fmt = NULL;
global.c_offset = 0;
global.c_ovoff = -1;
if ((i = sc_width()) > 5)
global.c_width = i;
global.c_cwidth = -1;
- if ((i = sc_length()) > 5)
- global.c_length = i - 1;
- global.c_flags = BELL; /* BELL is default */
- *(ip = ignores) = NULL;
+ global.c_flags = 0;
+ *ignores = NULL;
while (vfgets(fp, &ap) == OK) {
bp = ap;
** it to the end of the current "ignores" list.
*/
if (!mh_strcasecmp(name, "ignores")) {
- char **tmparray, **p;
+ char **tmparray;
int n = 0;
/* split the fields */
tmparray = brkstring(getcpy(++parptr), ",",
NULL);
-
- /* count number of fields split */
- p = tmparray;
- while (*p++)
- n++;
-
/*
** copy pointers to split fields
** to ignores array
*/
- ip = copyip(tmparray, ip,
- MAXARGS - num_ignores);
- num_ignores += n;
+ while (tmparray[n] && num_ignores<MAXARGS-1) {
+ ignores[num_ignores++] = tmparray[n++];
+ }
+ ignores[num_ignores] = NULL;
continue;
}
parptr = bp;
if (evalvar(c1))
adios(NULL, "format file syntax error: %s", bp);
}
- if (!c1->c_nfs && global.c_nfs) {
+ if (!c1->c_fstr && global.c_fstr) {
if ((c1->c_flags & DATEFMT) &&
(global.c_flags & DATEFMT)) {
- c1->c_nfs = getcpy(global.c_nfs);
+ c1->c_fstr = getcpy(global.c_fstr);
} else if ((c1->c_flags & ADDRFMT) &&
(global.c_flags & ADDRFMT)) {
- c1->c_nfs = getcpy(global.c_nfs);
+ c1->c_fstr = getcpy(global.c_fstr);
}
}
continue;
if (mhldebug) {
for (c1 = fmthd; c1; c1 = c1->c_next) {
fprintf(stderr, "c1: name=\"%s\" text=\"%s\" ovtxt=\"%s\"\n", c1->c_name, c1->c_text, c1->c_ovtxt);
- fprintf(stderr, "\tnfs=0x%x fmt=0x%x\n", (unsigned int)(unsigned long) c1->c_nfs, (unsigned int)(unsigned long) c1->c_fmt);
- fprintf(stderr, "\toffset=%d ovoff=%d width=%d cwidth=%d length=%d\n", c1->c_offset, c1->c_ovoff, c1->c_width, c1->c_cwidth, c1->c_length);
+ fprintf(stderr, "\tfstr=0x%x fmt=0x%x\n", (unsigned int)(unsigned long) c1->c_fstr, (unsigned int)(unsigned long) c1->c_fmt);
+ fprintf(stderr, "\toffset=%d ovoff=%d width=%d cwidth=%d\n", c1->c_offset, c1->c_ovoff, c1->c_width, c1->c_cwidth);
fprintf (stderr, "\tflags=%s\n", snprintb(buffer, sizeof(buffer), (unsigned) c1->c_flags, LBITS));
}
}
out:
- if (clearflg == 1) {
- global.c_flags |= CLEARSCR;
- } else {
- if (clearflg == -1)
- global.c_flags &= ~CLEARSCR;
- }
-
- switch (bellflg) { /* command line may override format file */
- case 1:
- global.c_flags |= BELL;
- break;
- case -1:
- global.c_flags &= ~BELL;
- break;
- }
-
- if (length)
- global.c_length = length;
if (width)
global.c_width = width;
- if (global.c_length < 5)
- global.c_length = 10000;
if (global.c_width < 5)
global.c_width = 10000;
}
return ptos(name, &c1->c_ovtxt);
if (!mh_strcasecmp(name, "formatfield")) {
- char *nfs;
+ char *fmtstr;
if (ptos(name, &cp))
return 1;
cp = concat("=", cp, NULL);
- nfs = new_fs(cp, NULL);
+ fmtstr = new_fs(cp, NULL);
free(cp);
- c1->c_nfs = getcpy(nfs);
+ c1->c_fstr = getcpy(fmtstr);
c1->c_flags |= FORMAT;
return 0;
}
if (!mh_strcasecmp(name, "decode")) {
- char *nfs;
+ char *fmtstr;
- nfs = new_fs("=%(decode{text})", NULL);
- c1->c_nfs = getcpy(nfs);
+ fmtstr = new_fs("=%(decode{text})", NULL);
+ c1->c_fstr = getcpy(fmtstr);
c1->c_flags |= FORMAT;
return 0;
}
return ptoi(name, &c1->c_width);
if (!mh_strcasecmp(name, "compwidth"))
return ptoi(name, &c1->c_cwidth);
- if (!mh_strcasecmp(name, "length"))
- return ptoi(name, &c1->c_length);
for (ap = triples; ap->t_name; ap++)
if (!mh_strcasecmp(ap->t_name, name)) {
static void
-process(char *folder, char *fname, int ofilen, int ofilec)
+process(char *fname, int ofilen, int ofilec)
{
- char *cp = NULL;
FILE *fp = NULL;
struct mcomp *c1;
fname = "(stdin)";
fp = stdin;
}
- cp = folder ? concat(folder, ":", fname, NULL) : getcpy(fname);
- if (ontty != PITTY)
- SIGNAL(SIGINT, intrser);
- mhlfile(fp, cp, ofilen, ofilec); /* FALL THROUGH! */
-
+ SIGNAL(SIGINT, intrser);
+ mhlfile(fp, fname, ofilen, ofilec);
+ /* FALL THROUGH! */
default:
- if (ontty != PITTY)
- SIGNAL(SIGINT, SIG_IGN);
+ SIGNAL(SIGINT, SIG_IGN);
if (mhl_action == NULL && fp != stdin)
fclose(fp);
- free(cp);
if (holder.c_text) {
free(holder.c_text);
holder.c_text = NULL;
char **ip, name[NAMESZ], buf[BUFSIZ];
if (forwall) {
- if (digest)
- printf("%s", ofilen == 1 ? delim3 : delim4);
- else {
- printf("\n-------");
- if (ofilen == 1)
- printf(" Forwarded Message%s",
- ofilec > 1 ? "s" : "");
- else
- printf(" Message %d", ofilen);
- printf("\n\n");
- }
- } else {
- switch (ontty) {
- case PITTY:
- if (ofilec > 1) {
- if (ofilen > 1) {
- if ((global.c_flags & CLEARSCR))
- clear_screen();
- else
- printf("\n\n\n");
- }
- printf(">>> %s\n\n", mname);
- }
- break;
-
- case ISTTY:
- strncpy(buf, "\n", sizeof(buf));
- if (ofilec > 1) {
- if (SOprintf("Press <return> to list \"%s\"...", mname)) {
- if (ofilen > 1)
- printf("\n\n\n");
- printf("Press <return> to list \"%s\"...", mname);
- }
- fflush(stdout);
- buf[0] = 0;
- read(fileno(stdout), buf, sizeof(buf));
- }
- if (strchr(buf, '\n')) {
- if ((global.c_flags & CLEARSCR))
- clear_screen();
- } else
- printf("\n");
- break;
-
- default:
- if (ofilec > 1) {
- if (ofilen > 1) {
- printf("\n\n\n");
- if (clearflg > 0)
- clear_screen();
- }
- printf(">>> %s\n\n", mname);
- }
- break;
+ printf("\n-------");
+ if (ofilen == 1)
+ printf(" Forwarded Message%s", ofilec > 1 ? "s" : "");
+ else
+ printf(" Message %d", ofilen);
+ printf("\n\n");
+ } else if (ofilec > 1) {
+ if (ofilen > 1) {
+ printf("\n\n\n");
}
+ printf(">>> %s\n\n", mname);
}
for (state = FLD;;) {
case BODY:
case FILEEOF:
- row = column = 0;
+ column = 0;
for (c1 = fmthd; c1; c1 = c1->c_next) {
if (c1->c_flags & CLEARTEXT) {
putcomp(c1, c1, ONECOMP);
dat[2] = 0;
dat[3] = sizeof(buffer) - 1;
dat[4] = 0;
- fmt_compile(c1->c_nfs, &c1->c_fmt);
+ fmt_compile(c1->c_fstr, &c1->c_fmt);
if (!(c1->c_flags & ADDRFMT)) {
FINDCOMP(cptr, "text");
c1->c_ovtxt = getcpy(global.c_ovtxt);
c1->c_offset = global.c_offset;
c1->c_ovoff = global. c_ovoff;
- c1->c_width = c1->c_length = 0;
+ c1->c_width = 0;
c1->c_cwidth = global.c_cwidth;
c1->c_flags |= global.c_flags & GFLAGS;
}
free(c1->c_text);
if (c1->c_ovtxt)
free(c1->c_ovtxt);
- if (c1->c_nfs)
- free(c1->c_nfs);
+ if (c1->c_fstr)
+ free(c1->c_fstr);
if (c1->c_fmt)
free((char *) c1->c_fmt);
free((char *) c1);
cchdr = 0;
lm = 0;
- llim = c1->c_length ? c1->c_length : -1;
wid = c1->c_width ? c1->c_width : global.c_width;
ovoff = (c1->c_ovoff >= 0 ? c1->c_ovoff : global.c_ovoff)
+ c1->c_offset;
return;
}
- if (c1->c_nfs && (c1->c_flags & (ADDRFMT | DATEFMT | FORMAT)))
+ if (c1->c_fstr && (c1->c_flags & (ADDRFMT | DATEFMT | FORMAT)))
mcomp_format(c1, c2);
if (c1->c_flags & CENTER) {
count = 0;
if (cchdr) {
if (flag == TWOCOMP)
- count = (c1->c_cwidth >= 0) ?
- c1->c_cwidth : strlen(c2->c_name) + 2;
+ count = (c1->c_cwidth >= 0) ? c1->c_cwidth :
+ (int)strlen(c2->c_name) + 2;
else
- count = (c1->c_cwidth >= 0) ?
- c1->c_cwidth : strlen(c1->c_text ?
+ count = (c1->c_cwidth >= 0) ? (size_t)c1->c_cwidth :
+ strlen(c1->c_text ?
c1->c_text : c1->c_name) + 2;
}
count += c1->c_offset;
static void
putch(char ch)
{
- char buf[BUFSIZ];
-
- if (llim == 0)
- return;
-
switch (ch) {
- case '\n':
- if (llim > 0)
- llim--;
- column = 0;
- row++;
- if (ontty != ISTTY || row != global.c_length)
- break;
- if (global.c_flags & BELL)
- putchar('\007');
- fflush(stdout);
- buf[0] = 0;
- read(fileno(stdout), buf, sizeof(buf));
- if (strchr(buf, '\n')) {
- if (global.c_flags & CLEARSCR)
- clear_screen();
- row = 0;
- } else {
- putchar('\n');
- row = global.c_length / 3;
- }
- return;
-
case '\t':
column |= 07;
column++;
column--;
break;
+ case '\n':
case '\r':
column = 0;
break;
}
-static RETSIGTYPE
+static void
intrser(int i)
{
-#ifndef RELIABLE_SIGNALS
- SIGNAL(SIGINT, intrser);
-#endif
-
discard(stdout);
putchar('\n');
longjmp(env, DONE);
}
-static RETSIGTYPE
-pipeser(int i)
-{
-#ifndef RELIABLE_SIGNALS
- SIGNAL(SIGPIPE, pipeser);
-#endif
-
- done(NOTOK);
-}
-
-
-static RETSIGTYPE
-quitser(int i)
-{
-#ifndef RELIABLE_SIGNALS
- SIGNAL(SIGQUIT, quitser);
-#endif
-
- putchar('\n');
- fflush(stdout);
- done(NOTOK);
-}
-
-
#undef adios
#undef done
else
done(exitstat);
}
-
-
-static int m_pid = NOTOK;
-static int sd = NOTOK;
-
-static void
-m_popen(char *name)
-{
- int pd[2];
-
- if (mhl_action && (sd = dup(fileno(stdout))) == NOTOK)
- adios("standard output", "unable to dup()");
-
- if (pipe(pd) == NOTOK)
- adios("pipe", "unable to");
-
- switch (m_pid = fork()) {
- case NOTOK:
- adios("fork", "unable to");
-
- case OK:
- SIGNAL(SIGINT, SIG_DFL);
- SIGNAL(SIGQUIT, SIG_DFL);
-
- close(pd[1]);
- if (pd[0] != fileno(stdin)) {
- dup2(pd[0], fileno(stdin));
- close(pd[0]);
- }
- execlp(name, mhbasename(name), NULL);
- fprintf(stderr, "unable to exec ");
- perror(name);
- _exit(-1);
-
- default:
- close(pd[0]);
- if (pd[1] != fileno(stdout)) {
- dup2(pd[1], fileno(stdout));
- close(pd[1]);
- }
- }
-}
-
-
-void
-m_pclose(void)
-{
- if (m_pid == NOTOK)
- return;
-
- if (sd != NOTOK) {
- fflush(stdout);
- if (dup2(sd, fileno(stdout)) == NOTOK)
- adios("standard output", "unable to dup2()");
-
- clearerr(stdout);
- close(sd);
- sd = NOTOK;
- }
- else
- fclose(stdout);
-
- pidwait(m_pid, OK);
- m_pid = NOTOK;
-}