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