xref: /freebsd-src/crypto/openssh/openbsd-compat/regress/closefromtest.c (revision 19261079b74319502c6ffa1249920079f0f69a72)
1ce3adf43SDag-Erling Smørgrav /*
2ce3adf43SDag-Erling Smørgrav  * Copyright (c) 2006 Darren Tucker
3ce3adf43SDag-Erling Smørgrav  *
4ce3adf43SDag-Erling Smørgrav  * Permission to use, copy, modify, and distribute this software for any
5ce3adf43SDag-Erling Smørgrav  * purpose with or without fee is hereby granted, provided that the above
6ce3adf43SDag-Erling Smørgrav  * copyright notice and this permission notice appear in all copies.
7ce3adf43SDag-Erling Smørgrav  *
8ce3adf43SDag-Erling Smørgrav  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9ce3adf43SDag-Erling Smørgrav  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10ce3adf43SDag-Erling Smørgrav  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11ce3adf43SDag-Erling Smørgrav  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12ce3adf43SDag-Erling Smørgrav  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13ce3adf43SDag-Erling Smørgrav  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14ce3adf43SDag-Erling Smørgrav  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15ce3adf43SDag-Erling Smørgrav  */
16ce3adf43SDag-Erling Smørgrav 
17*19261079SEd Maste #include "includes.h"
18*19261079SEd Maste 
19ce3adf43SDag-Erling Smørgrav #include <sys/types.h>
20ce3adf43SDag-Erling Smørgrav #include <sys/stat.h>
21ce3adf43SDag-Erling Smørgrav 
22ce3adf43SDag-Erling Smørgrav #include <fcntl.h>
23ce3adf43SDag-Erling Smørgrav #include <stdio.h>
24ce3adf43SDag-Erling Smørgrav #include <stdlib.h>
25ce3adf43SDag-Erling Smørgrav #include <unistd.h>
26ce3adf43SDag-Erling Smørgrav 
27ce3adf43SDag-Erling Smørgrav #define NUM_OPENS 10
28ce3adf43SDag-Erling Smørgrav 
29ce3adf43SDag-Erling Smørgrav void
fail(char * msg)30ce3adf43SDag-Erling Smørgrav fail(char *msg)
31ce3adf43SDag-Erling Smørgrav {
32ce3adf43SDag-Erling Smørgrav 	fprintf(stderr, "closefrom: %s\n", msg);
33ce3adf43SDag-Erling Smørgrav 	exit(1);
34ce3adf43SDag-Erling Smørgrav }
35ce3adf43SDag-Erling Smørgrav 
36ce3adf43SDag-Erling Smørgrav int
main(void)37ce3adf43SDag-Erling Smørgrav main(void)
38ce3adf43SDag-Erling Smørgrav {
39ce3adf43SDag-Erling Smørgrav 	int i, max, fds[NUM_OPENS];
40ce3adf43SDag-Erling Smørgrav 	char buf[512];
41ce3adf43SDag-Erling Smørgrav 
42ce3adf43SDag-Erling Smørgrav 	for (i = 0; i < NUM_OPENS; i++)
43ce3adf43SDag-Erling Smørgrav 		if ((fds[i] = open("/dev/null", O_RDONLY)) == -1)
44ce3adf43SDag-Erling Smørgrav 			exit(0);	/* can't test */
45ce3adf43SDag-Erling Smørgrav 	max = i - 1;
46ce3adf43SDag-Erling Smørgrav 
47ce3adf43SDag-Erling Smørgrav 	/* should close last fd only */
48ce3adf43SDag-Erling Smørgrav 	closefrom(fds[max]);
49ce3adf43SDag-Erling Smørgrav 	if (close(fds[max]) != -1)
50ce3adf43SDag-Erling Smørgrav 		fail("failed to close highest fd");
51ce3adf43SDag-Erling Smørgrav 
52ce3adf43SDag-Erling Smørgrav 	/* make sure we can still use remaining descriptors */
53ce3adf43SDag-Erling Smørgrav 	for (i = 0; i < max; i++)
54ce3adf43SDag-Erling Smørgrav 		if (read(fds[i], buf, sizeof(buf)) == -1)
55ce3adf43SDag-Erling Smørgrav 			fail("closed descriptors it should not have");
56ce3adf43SDag-Erling Smørgrav 
57ce3adf43SDag-Erling Smørgrav 	/* should close all fds */
58ce3adf43SDag-Erling Smørgrav 	closefrom(fds[0]);
59ce3adf43SDag-Erling Smørgrav 	for (i = 0; i < NUM_OPENS; i++)
60ce3adf43SDag-Erling Smørgrav 		if (close(fds[i]) != -1)
61ce3adf43SDag-Erling Smørgrav 			fail("failed to close from lowest fd");
62ce3adf43SDag-Erling Smørgrav 	return 0;
63ce3adf43SDag-Erling Smørgrav }
64