libc: drop Minix popen and use NetBSD's
Change-Id: I56f253d855671a6e1c8d53c7383107565164ab8d
This commit is contained in:
parent
473547c777
commit
39fad09a94
2 changed files with 20 additions and 120 deletions
|
@ -1,120 +0,0 @@
|
||||||
/*
|
|
||||||
* popen - open a pipe
|
|
||||||
*/
|
|
||||||
/* $Header$ */
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
#include "namespace.h"
|
|
||||||
|
|
||||||
#ifdef __weak_alias
|
|
||||||
__weak_alias(popen, _popen)
|
|
||||||
__weak_alias(pclose, _pclose)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#if defined(__BSD4_2)
|
|
||||||
union wait {
|
|
||||||
int w_status;
|
|
||||||
};
|
|
||||||
typedef union wait wait_arg;
|
|
||||||
#else
|
|
||||||
typedef int wait_arg;
|
|
||||||
#endif /* __BSD4_2 */
|
|
||||||
|
|
||||||
int _close(int d);
|
|
||||||
int _dup2(int oldd, int newd); /* not present in System 5 */
|
|
||||||
int _execl(const char *name, const char *_arg, ... );
|
|
||||||
pid_t _fork(void);
|
|
||||||
int _pipe(int fildes[2]);
|
|
||||||
pid_t _wait(wait_arg *status);
|
|
||||||
void _exit(int status);
|
|
||||||
|
|
||||||
static int pids[OPEN_MAX];
|
|
||||||
|
|
||||||
FILE *
|
|
||||||
popen(command, type)
|
|
||||||
const char *command;
|
|
||||||
const char *type;
|
|
||||||
{
|
|
||||||
int piped[2];
|
|
||||||
int Xtype = *type == 'r' ? 0 : *type == 'w' ? 1 : 2;
|
|
||||||
int pid;
|
|
||||||
|
|
||||||
if (Xtype == 2 ||
|
|
||||||
_pipe(piped) < 0 ||
|
|
||||||
(pid = _fork()) < 0) return 0;
|
|
||||||
|
|
||||||
if (pid == 0) {
|
|
||||||
/* child */
|
|
||||||
register int *p;
|
|
||||||
|
|
||||||
for (p = pids; p < &pids[OPEN_MAX]; p++) {
|
|
||||||
if (*p) _close((int)(p - pids));
|
|
||||||
}
|
|
||||||
_close(piped[Xtype]);
|
|
||||||
_dup2(piped[!Xtype], !Xtype);
|
|
||||||
_close(piped[!Xtype]);
|
|
||||||
_execl("/bin/sh", "sh", "-c", command, (char *) 0);
|
|
||||||
_exit(127); /* like system() ??? */
|
|
||||||
}
|
|
||||||
|
|
||||||
pids[piped[Xtype]] = pid;
|
|
||||||
_close(piped[!Xtype]);
|
|
||||||
return fdopen(piped[Xtype], type);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__BSD4_2)
|
|
||||||
#define ret_val status.w_status
|
|
||||||
#else
|
|
||||||
#define ret_val status
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int
|
|
||||||
pclose(stream)
|
|
||||||
FILE *stream;
|
|
||||||
{
|
|
||||||
int fd = fileno(stream);
|
|
||||||
wait_arg status;
|
|
||||||
int wret;
|
|
||||||
|
|
||||||
void (*intsave)(int) = signal(SIGINT, SIG_IGN);
|
|
||||||
void (*quitsave)(int) = signal(SIGQUIT, SIG_IGN);
|
|
||||||
fclose(stream);
|
|
||||||
while ((wret = _wait(&status)) != -1) {
|
|
||||||
if (wret == pids[fd]) break;
|
|
||||||
}
|
|
||||||
if (wret == -1) ret_val = -1;
|
|
||||||
signal(SIGINT, intsave);
|
|
||||||
signal(SIGQUIT, quitsave);
|
|
||||||
pids[fd] = 0;
|
|
||||||
return ret_val;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__USG)
|
|
||||||
int _dup(int fildes);
|
|
||||||
|
|
||||||
static int
|
|
||||||
_dup2(oldd, newd)
|
|
||||||
int oldd, newd;
|
|
||||||
{
|
|
||||||
int i = 0, fd, tmp;
|
|
||||||
int fdbuf[_NFILES];
|
|
||||||
|
|
||||||
/* ignore the error on the close() */
|
|
||||||
tmp = errno; (void) _close(newd); errno = tmp;
|
|
||||||
while ((fd = _dup(oldd)) != newd) {
|
|
||||||
if (fd == -1) break;
|
|
||||||
fdbuf[i++] = fd;
|
|
||||||
}
|
|
||||||
tmp = errno;
|
|
||||||
while (--i >= 0) {
|
|
||||||
_close(fdbuf[i]);
|
|
||||||
}
|
|
||||||
errno = tmp;
|
|
||||||
return -(fd == -1);
|
|
||||||
}
|
|
||||||
#endif /* __USG */
|
|
|
@ -111,13 +111,21 @@ popen(const char *command, const char *type)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(__minix)
|
||||||
|
rwlock_rdlock(&pidlist_lock);
|
||||||
|
#else
|
||||||
(void)rwlock_rdlock(&pidlist_lock);
|
(void)rwlock_rdlock(&pidlist_lock);
|
||||||
|
#endif
|
||||||
(void)__readlockenv();
|
(void)__readlockenv();
|
||||||
switch (pid = vfork()) {
|
switch (pid = vfork()) {
|
||||||
case -1: /* Error. */
|
case -1: /* Error. */
|
||||||
serrno = errno;
|
serrno = errno;
|
||||||
(void)__unlockenv();
|
(void)__unlockenv();
|
||||||
|
#if defined(__minix)
|
||||||
|
rwlock_unlock(&pidlist_lock);
|
||||||
|
#else
|
||||||
(void)rwlock_unlock(&pidlist_lock);
|
(void)rwlock_unlock(&pidlist_lock);
|
||||||
|
#endif
|
||||||
free(cur);
|
free(cur);
|
||||||
(void)close(pdes[0]);
|
(void)close(pdes[0]);
|
||||||
(void)close(pdes[1]);
|
(void)close(pdes[1]);
|
||||||
|
@ -177,7 +185,11 @@ popen(const char *command, const char *type)
|
||||||
cur->pid = pid;
|
cur->pid = pid;
|
||||||
cur->next = pidlist;
|
cur->next = pidlist;
|
||||||
pidlist = cur;
|
pidlist = cur;
|
||||||
|
#if defined(__minix)
|
||||||
|
rwlock_unlock(&pidlist_lock);
|
||||||
|
#else
|
||||||
(void)rwlock_unlock(&pidlist_lock);
|
(void)rwlock_unlock(&pidlist_lock);
|
||||||
|
#endif
|
||||||
|
|
||||||
return (iop);
|
return (iop);
|
||||||
}
|
}
|
||||||
|
@ -203,7 +215,11 @@ pclose(FILE *iop)
|
||||||
if (cur->fp == iop)
|
if (cur->fp == iop)
|
||||||
break;
|
break;
|
||||||
if (cur == NULL) {
|
if (cur == NULL) {
|
||||||
|
#if defined(__minix)
|
||||||
|
rwlock_unlock(&pidlist_lock);
|
||||||
|
#else
|
||||||
(void)rwlock_unlock(&pidlist_lock);
|
(void)rwlock_unlock(&pidlist_lock);
|
||||||
|
#endif
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,7 +231,11 @@ pclose(FILE *iop)
|
||||||
else
|
else
|
||||||
last->next = cur->next;
|
last->next = cur->next;
|
||||||
|
|
||||||
|
#if defined(__minix)
|
||||||
|
rwlock_unlock(&pidlist_lock);
|
||||||
|
#else
|
||||||
(void)rwlock_unlock(&pidlist_lock);
|
(void)rwlock_unlock(&pidlist_lock);
|
||||||
|
#endif
|
||||||
|
|
||||||
do {
|
do {
|
||||||
pid = waitpid(cur->pid, &pstat, 0);
|
pid = waitpid(cur->pid, &pstat, 0);
|
||||||
|
|
Loading…
Reference in a new issue