xref: /openbsd-src/regress/sys/kern/dup2/dup2test.c (revision db3296cf5c1dd9058ceecc3a29fe4aaa0bd26000)
1*db3296cfSderaadt /*	$OpenBSD: dup2test.c,v 1.3 2003/07/31 21:48:08 deraadt Exp $	*/
2115a10d2Sart /*
3115a10d2Sart  *	Written by Artur Grabowski <art@openbsd.org> 2001 Public Domain.
4115a10d2Sart  */
5181fcfb1Sart #include <stdio.h>
6181fcfb1Sart #include <stdlib.h>
7181fcfb1Sart #include <unistd.h>
8181fcfb1Sart #include <err.h>
9181fcfb1Sart #include <fcntl.h>
10181fcfb1Sart 
11181fcfb1Sart int
main(int argc,char * argv[])12*db3296cfSderaadt main(int argc, char *argv[])
13181fcfb1Sart {
14181fcfb1Sart 	int orgfd, fd1, fd2;
15181fcfb1Sart 	char temp[] = "/tmp/dup2XXXXXXXXX";
16181fcfb1Sart 
17181fcfb1Sart 	if ((orgfd = mkstemp(temp)) < 0)
18181fcfb1Sart 		err(1, "mkstemp");
19181fcfb1Sart 	remove(temp);
20181fcfb1Sart 
21181fcfb1Sart 	if (ftruncate(orgfd, 1024) != 0)
22181fcfb1Sart 		err(1, "ftruncate");
23181fcfb1Sart 
24181fcfb1Sart 	if ((fd1 = dup(orgfd)) < 0)
25181fcfb1Sart 		err(1, "dup");
26181fcfb1Sart 
27181fcfb1Sart 	/* Set close-on-exec */
28181fcfb1Sart 	if (fcntl(fd1, F_SETFD, 1) != 0)
29181fcfb1Sart 		err(1, "fcntl(F_SETFD)");
30181fcfb1Sart 
31181fcfb1Sart 	if ((fd2 = dup2(fd1, fd1 + 1)) < 0)
32181fcfb1Sart 		err(1, "dup2");
33181fcfb1Sart 
34181fcfb1Sart 	/* Test 1: Do we get the right fd? */
35181fcfb1Sart 	if (fd2 != fd1 + 1)
36181fcfb1Sart 		errx(1, "dup2 didn't give us the right fd");
37181fcfb1Sart 
38181fcfb1Sart 	/* Test 2: Was close-on-exec cleared? */
39181fcfb1Sart 	if (fcntl(fd2, F_GETFD) != 0)
40181fcfb1Sart 		errx(1, "dup2 didn't clear close-on-exec");
41181fcfb1Sart 
42181fcfb1Sart 	return 0;
43181fcfb1Sart }
44