Annotation of embedaddon/tmux/compat/closefrom.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (c) 2004-2005 Todd C. Miller <Todd.Miller@courtesan.com>
3: *
4: * Permission to use, copy, modify, and distribute this software for any
5: * purpose with or without fee is hereby granted, provided that the above
6: * copyright notice and this permission notice appear in all copies.
7: *
8: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15: */
16:
17: #ifndef HAVE_CLOSEFROM
18:
19: #include <sys/types.h>
20: #include <sys/param.h>
21: #include <unistd.h>
22: #include <stdio.h>
23: #ifdef HAVE_FCNTL_H
24: # include <fcntl.h>
25: #endif
26: #include <limits.h>
27: #include <stdlib.h>
28: #include <stddef.h>
29: #include <string.h>
30: #include <unistd.h>
31: #ifdef HAVE_DIRENT_H
32: # include <dirent.h>
33: # define NAMLEN(dirent) strlen((dirent)->d_name)
34: #else
35: # define dirent direct
36: # define NAMLEN(dirent) (dirent)->d_namlen
37: # ifdef HAVE_SYS_NDIR_H
38: # include <sys/ndir.h>
39: # endif
40: # ifdef HAVE_SYS_DIR_H
41: # include <sys/dir.h>
42: # endif
43: # ifdef HAVE_NDIR_H
44: # include <ndir.h>
45: # endif
46: #endif
47:
48: #include "compat.h"
49:
50: #ifndef OPEN_MAX
51: # define OPEN_MAX 256
52: #endif
53:
54: #if 0
55: __unused static const char rcsid[] = "$Sudo: closefrom.c,v 1.11 2006/08/17 15:26:54 millert Exp $";
56: #endif /* lint */
57:
58: /*
59: * Close all file descriptors greater than or equal to lowfd.
60: */
61: #ifdef HAVE_FCNTL_CLOSEM
62: void
63: closefrom(int lowfd)
64: {
65: (void) fcntl(lowfd, F_CLOSEM, 0);
66: }
67: #else
68: void
69: closefrom(int lowfd)
70: {
71: long fd, maxfd;
72: #if defined(HAVE_DIRFD) && defined(HAVE_PROC_PID)
73: char fdpath[PATH_MAX], *endp;
74: struct dirent *dent;
75: DIR *dirp;
76: int len;
77:
78: /* Check for a /proc/$$/fd directory. */
79: len = snprintf(fdpath, sizeof(fdpath), "/proc/%ld/fd", (long)getpid());
80: if (len > 0 && (size_t)len <= sizeof(fdpath) && (dirp = opendir(fdpath))) {
81: while ((dent = readdir(dirp)) != NULL) {
82: fd = strtol(dent->d_name, &endp, 10);
83: if (dent->d_name != endp && *endp == '\0' &&
84: fd >= 0 && fd < INT_MAX && fd >= lowfd && fd != dirfd(dirp))
85: (void) close((int) fd);
86: }
87: (void) closedir(dirp);
88: } else
89: #endif
90: {
91: /*
92: * Fall back on sysconf() or getdtablesize(). We avoid checking
93: * resource limits since it is possible to open a file descriptor
94: * and then drop the rlimit such that it is below the open fd.
95: */
96: #ifdef HAVE_SYSCONF
97: maxfd = sysconf(_SC_OPEN_MAX);
98: #else
99: maxfd = getdtablesize();
100: #endif /* HAVE_SYSCONF */
101: if (maxfd < 0)
102: maxfd = OPEN_MAX;
103:
104: for (fd = lowfd; fd < maxfd; fd++)
105: (void) close((int) fd);
106: }
107: }
108: #endif /* !HAVE_FCNTL_CLOSEM */
109: #endif /* HAVE_CLOSEFROM */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>