summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libugly/popen.c
diff options
context:
space:
mode:
authorMystery Man <unknown@mandriva.org>2003-08-20 07:37:27 +0000
committerMystery Man <unknown@mandriva.org>2003-08-20 07:37:27 +0000
commit7f2ac73888b8ef372ea597049981b27e7d810ac2 (patch)
tree354132889b63bbe5f446cb82869b3c3367135a80 /mdk-stage1/dietlibc/libugly/popen.c
parent327bd24f8e4291bd1882de1990dd7339f781a9cb (diff)
downloaddrakx-7f2ac73888b8ef372ea597049981b27e7d810ac2.tar
drakx-7f2ac73888b8ef372ea597049981b27e7d810ac2.tar.gz
drakx-7f2ac73888b8ef372ea597049981b27e7d810ac2.tar.bz2
drakx-7f2ac73888b8ef372ea597049981b27e7d810ac2.tar.xz
drakx-7f2ac73888b8ef372ea597049981b27e7d810ac2.zip
This commit was manufactured by cvs2svn to create branch 'MDKC_1_0'.topic/MDKC_1_0
Diffstat (limited to 'mdk-stage1/dietlibc/libugly/popen.c')
-rw-r--r--mdk-stage1/dietlibc/libugly/popen.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/mdk-stage1/dietlibc/libugly/popen.c b/mdk-stage1/dietlibc/libugly/popen.c
index e0e441495..aa9a2cde0 100644
--- a/mdk-stage1/dietlibc/libugly/popen.c
+++ b/mdk-stage1/dietlibc/libugly/popen.c
@@ -1,32 +1,38 @@
#include "dietstdio.h"
#include <unistd.h>
+#include <fcntl.h>
+#include "binshstr.h"
extern char **environ;
FILE *popen(const char *command, const char *type) {
int pfd[2];
int fd0;
+ FILE* f;
pid_t pid;
+
if (pipe(pfd)<0) return 0;
fd0=(*type=='r');
- if ((pid=vfork())<0) {
+ if (!(f=fdopen(pfd[!fd0],type))) {
+ close(pfd[0]); /* malloc failed */
+ close(pfd[1]);
+ return 0;
+ }
+ if ((pid=fork())<0) {
close(pfd[0]);
close(pfd[1]);
return 0;
}
if (!pid) { /* child */
- char *argv[]={"sh","-c",0,0};
+ const char *argv[]={__sh,"-c",0,0};
close(pfd[!fd0]); close(fd0);
dup2(pfd[fd0],fd0); close(pfd[fd0]);
- argv[2]=(char*)command;
- execve("/bin/sh",argv,environ);
- _exit(255);
+ argv[2]=command;
+ execve(__binsh,(char*const*)argv,environ);
+ _exit(127);
}
close(pfd[fd0]);
- {
- register FILE* f;
- if ((f=fdopen(pfd[!fd0],type)))
- f->popen_kludge=pid;
- return f;
- }
+ fcntl (pfd[!fd0], F_SETFD, FD_CLOEXEC);
+ f->popen_kludge=pid;
+ return f;
}