home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
gdead.berkeley.edu
/
gdead.berkeley.edu.tar
/
gdead.berkeley.edu
/
pub
/
cad-tools
/
ciftomann.tar
/
driver_dir
/
npipe.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-01-28
|
2KB
|
143 lines
#include <stdio.h>
char *malloc(), *strcpy();
static int pid;
int pipeline(firstin, lastout, errfile, cmdv, argvv)
char *firstin;
char *lastout;
char *errfile;
char **cmdv;
char ***argvv;
{
char *infile, *outfile;
char tempname[40];
int oldin, oldout, olderr;
int val, status;
int errd, tmp_num = 0;
FILE *errstream;
oldin = dup2(0);
oldout = dup2(1);
close(2);
infile = firstin;
if (access(errfile, 2) != 0) {
errd = creat(errfile,1);
if (errd == -1) {
return(-1);
}
close(errd);
}
while ( cmdv[1] != (char *) 0 ) {
fprintf(tempname, "pipe%.4d.tmp", tmp_num++);
outfile = strcpy(malloc(strlen(tempname+1)),tempname);
status = do_cmd(infile, outfile, errfile, *cmdv, *argvv);
if (status != 0) {
return(status);
}
cmdv++;
argvv++;
if (infile != firstin) {
unlink(infile);
free(infile);
}
infile = outfile;
}
status = do_cmd(infile, lastout, errfile, *cmdv, *argvv);
if (status != 0) {
return(status);
}
if (infile != firstin) {
unlink(infile);
free(infile);
}
dup2(oldin, 0);
close(oldin);
dup2(oldout, 1);
close(oldout);
set_stderr(errfile);
return(0);
}
do_cmd(infile, outfile, errfile, cmd, argv)
char *infile, *outfile, *errfile;
char *cmd, **argv;
{
int val, status;
int ind, outd, errd;
char buf[101];
pid = vfork();
if (pid == -1) {
if (set_stderr(errfile) < 0) {
return(-1);
}
perror("Cannot vfork");
return(-1);
}
if (pid == 0) {
if (set_stderr(errfile) < 0) {
exit(-1);
}
ind = open(infile, 0600);
if (ind < 0 || dup2(ind,0) == -1) {
perror(infile);
exit(-1);
}
close(ind);
if (outd < 0 || dup2(outd,1) == -1) {
perror(infile);
exit(-1);
}
close(outd);
execv(cmd, argv);
sprintf(buf, "Cannot exec %s", cmd);
perror(buf);
exit(-1);
} else {
while ((val = wait(&status)) != pid) {
if (val == -1) {
if (set_stderr(errfile) < 0) {
exit(-1);
}
fprintf(stderr, "The process %s has disappeared\n",
cmd);
close(2);
return(-1);
}
}
return(status);
}
}
set_stderr(file)
char *file;
{
FILE *errstream;
errstream = fopen(file, "a");
if (errstream == NULL) {
return(-1);
}
if (dup2(fileno(errstream),2) == -1) {
return(-1);
}
fclose(errstream);
return(0);
}
#include <signal.h>
kill_pipe() {
kill(pid, SIGTERM);
}