xref: /openbsd-src/gnu/usr.bin/cvs/lib/dup2.c (revision 1e72d8d26fae84dfb4bcd4cecabd10b989ec3f29)
1*1e72d8d2Sderaadt /*
2*1e72d8d2Sderaadt 	dup2 -- 7th Edition UNIX system call emulation for UNIX System V
3*1e72d8d2Sderaadt 
4*1e72d8d2Sderaadt 	last edit:	11-Feb-1987	D A Gwyn
5*1e72d8d2Sderaadt */
6*1e72d8d2Sderaadt 
7*1e72d8d2Sderaadt #ifdef HAVE_CONFIG_H
8*1e72d8d2Sderaadt #include "config.h"
9*1e72d8d2Sderaadt #endif
10*1e72d8d2Sderaadt 
11*1e72d8d2Sderaadt #include	<errno.h>
12*1e72d8d2Sderaadt #include	<fcntl.h>
13*1e72d8d2Sderaadt 
14*1e72d8d2Sderaadt extern int	close(), fcntl();
15*1e72d8d2Sderaadt 
16*1e72d8d2Sderaadt int
dup2(oldfd,newfd)17*1e72d8d2Sderaadt dup2( oldfd, newfd )
18*1e72d8d2Sderaadt 	int		oldfd;		/* already-open file descriptor */
19*1e72d8d2Sderaadt 	int		newfd;		/* desired duplicate descriptor */
20*1e72d8d2Sderaadt {
21*1e72d8d2Sderaadt 	register int	ret;		/* for fcntl() return value */
22*1e72d8d2Sderaadt 	register int	save;		/* for saving entry errno */
23*1e72d8d2Sderaadt 
24*1e72d8d2Sderaadt 	if ( oldfd == newfd )
25*1e72d8d2Sderaadt 		return oldfd;		/* be careful not to close() */
26*1e72d8d2Sderaadt 
27*1e72d8d2Sderaadt 	save = errno;			/* save entry errno */
28*1e72d8d2Sderaadt 	(void) close( newfd );		/* in case newfd is open */
29*1e72d8d2Sderaadt 	/* (may have just clobbered the original errno value) */
30*1e72d8d2Sderaadt 
31*1e72d8d2Sderaadt 	ret = fcntl( oldfd, F_DUPFD, newfd );	/* dupe it */
32*1e72d8d2Sderaadt 
33*1e72d8d2Sderaadt 	if ( ret >= 0 )
34*1e72d8d2Sderaadt 		errno = save;		/* restore entry errno */
35*1e72d8d2Sderaadt 	else				/* fcntl() returned error */
36*1e72d8d2Sderaadt 		if ( errno == EINVAL )
37*1e72d8d2Sderaadt 			errno = EBADF;	/* we think of everything */
38*1e72d8d2Sderaadt 
39*1e72d8d2Sderaadt 	return ret;			/* return file descriptor */
40*1e72d8d2Sderaadt }
41