From de47eb59bb829423b1d0f47ba13099073999b3cb Mon Sep 17 00:00:00 2001 From: Nicolas Planel Date: Wed, 29 Oct 2003 16:07:11 +0000 Subject: Corporate Server 2.1.1 release --- mdk-stage1/dietlibc/libugly/popen.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) (limited to 'mdk-stage1/dietlibc/libugly/popen.c') 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 +#include +#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; } -- cgit v1.2.1