2.9BSD/usr/src/ucb/vsh/make.c
#include "hd.h"
#include "command.h"
/* Interface to make. Fmake forks make off and returns. Wmake waits
for completion. Both cause output to be saved in the file .makerror.
*/
fmake () {
int p; /* Process number */
int mfile; /* File number of .makerror */
FILE *mstream; /* Stream of .makerror */
FILE *showopen (); /* Opener of mstream */
mstream = showopen ("w", MAKEMODE);
if (mstream == NULL) return NOREPLOT;
mfile = fileno (mstream);
if (myfork () == 0) {
if ((p = myfork ()) == 0) {
close (outfile); close (errorfile);
dup (mfile); dup (mfile);
close (infile); open ("/dev/null", 0);
myexecl (MAKE, MAKE, 0);
} else {
join (p);
beep (); sleep (2); beep ();
exit (0);
}
} else {
fclose (mstream);
putmsg (MAKE);
}
return NOREPLOT;
}
wmake () {
int p; /* Process number */
FILE *mstream; /* Stream of .makerror */
FILE *showopen (); /* Opener of mstream */
register ch; /* Work character */
int pipefile [2]; /* Pipe file numbers */
# define pipein pipefile [0]
# define pipeout pipefile [1]
FILE *pipestrm; /* Stream of pipein */
mstream = showopen ("w", MAKEMODE);
if (mstream == NULL) return NOREPLOT;
tty_push (COOKEDMODE);
pipe (pipefile);
if ((p = myfork ()) == 0) {
close (outfile); close (errorfile);
dup (pipeout); dup (pipeout);
myexecl (MAKE, MAKE, 0);
} else {
close (pipeout);
pipestrm = fdopen (pipein, "r");
while ((ch = getc (pipestrm)) != EOF) {
putchar (ch); putc (ch, mstream);
}
fclose (pipestrm); fclose (mstream);
join (p);
}
tty_pop ();
return CMD_SE | REPLOT;
}