Annotation of embedaddon/tmux/compat/closefrom.c, revision 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>