diff options
author | jnweiger <jnweiger> | 2005-12-16 18:41:15 +0000 |
---|---|---|
committer | jnweiger <jnweiger> | 2005-12-16 18:41:15 +0000 |
commit | f78f9e82605ea683021b074c23524c5c4d3d7aea (patch) | |
tree | f6e071cbf6c24d668a0b5ba35f8efe7848a21076 /src/fileio.c | |
parent | b3e7420c1fe103e5a3d71c3b74cf0843bee23317 (diff) | |
download | screen-f78f9e82605ea683021b074c23524c5c4d3d7aea.tar.gz |
old version screen-3.9.15 Mar 13 2003
Diffstat (limited to 'src/fileio.c')
-rw-r--r-- | src/fileio.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/fileio.c b/src/fileio.c index ad76886..f8e5e62 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -770,6 +770,10 @@ char *cmd; case 0: display = p->w_pdisplay; displays = 0; +#ifdef DEBUG + if (dfp && dfp != stderr) + fclose(dfp); +#endif close(0); dup(pi[0]); closeallfiles(0); @@ -786,3 +790,42 @@ char *cmd; close(pi[0]); return pi[1]; } + +int +readpipe(cmdv) +char **cmdv; +{ + int pi[2]; + if (pipe(pi)) + { + Msg(errno, "pipe"); + return -1; + } + switch (fork()) + { + case -1: + Msg(errno, "fork"); + return -1; + case 0: + displays = 0; +#ifdef DEBUG + if (dfp && dfp != stderr) + fclose(dfp); +#endif + close(1); + if (dup(pi[1]) != 1) + Panic(0, "dup"); + closeallfiles(1); + if (setgid(real_gid) || setuid(real_uid)) + Panic(errno, "setuid/setgid"); +#ifdef SIGPIPE + signal(SIGPIPE, SIG_DFL); +#endif + execvp(*cmdv, cmdv); + Panic(errno, *cmdv); + default: + break; + } + close(pi[1]); + return pi[0]; +} |