libc: drop Minix popen and use NetBSD's
Change-Id: I56f253d855671a6e1c8d53c7383107565164ab8d
This commit is contained in:
		
							parent
							
								
									473547c777
								
							
						
					
					
						commit
						39fad09a94
					
				| @ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Thomas Veerman
						Thomas Veerman