summaryrefslogtreecommitdiff
path: root/src/fileio.c
diff options
context:
space:
mode:
authorjnweiger <jnweiger>2005-12-16 18:41:15 +0000
committerjnweiger <jnweiger>2005-12-16 18:41:15 +0000
commitf78f9e82605ea683021b074c23524c5c4d3d7aea (patch)
treef6e071cbf6c24d668a0b5ba35f8efe7848a21076 /src/fileio.c
parentb3e7420c1fe103e5a3d71c3b74cf0843bee23317 (diff)
downloadscreen-f78f9e82605ea683021b074c23524c5c4d3d7aea.tar.gz
old version screen-3.9.15 Mar 13 2003
Diffstat (limited to 'src/fileio.c')
-rw-r--r--src/fileio.c43
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];
+}