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>