| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | 
							- /*
 
-  * Copyright (c) 2004 Todd C. Miller <Todd.Miller@courtesan.com>
 
-  *
 
-  * Permission to use, copy, modify, and distribute this software for any
 
-  * purpose with or without fee is hereby granted, provided that the above
 
-  * copyright notice and this permission notice appear in all copies.
 
-  *
 
-  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 
-  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 
-  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 
-  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 
-  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 
-  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 
-  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-  */
 
- #include "common.h"
 
- #ifndef HAVE_CLOSEFROM
 
- #include <sys/types.h>
 
- #include <sys/param.h>
 
- #include <unistd.h>
 
- #include <stdio.h>
 
- #include <limits.h>
 
- #include <stdlib.h>
 
- #include <stddef.h>
 
- #ifdef HAVE_DIRENT_H
 
- # include <dirent.h>
 
- # define NAMLEN(dirent) strlen((dirent)->d_name)
 
- #else
 
- # define dirent direct
 
- # define NAMLEN(dirent) (dirent)->d_namlen
 
- # ifdef HAVE_SYS_NDIR_H
 
- #  include <sys/ndir.h>
 
- # endif
 
- # ifdef HAVE_SYS_DIR_H
 
- #  include <sys/dir.h>
 
- # endif
 
- # ifdef HAVE_NDIR_H
 
- #  include <ndir.h>
 
- # endif
 
- #endif
 
- #ifndef OPEN_MAX
 
- # define OPEN_MAX	256
 
- #endif
 
- #ifndef lint
 
- static const char rcsid[] = "$Sudo: closefrom.c,v 1.6 2004/06/01 20:51:56 millert Exp $";
 
- #endif /* lint */
 
- /*
 
-  * Close all file descriptors greater than or equal to lowfd.
 
-  */
 
- void
 
- closefrom(int lowfd)
 
- {
 
-     long fd, maxfd;
 
- #if defined(HAVE_DIRFD) && defined(HAVE_PROC_PID)
 
-     char fdpath[PATH_MAX], *endp;
 
-     struct dirent *dent;
 
-     DIR *dirp;
 
-     int len;
 
-     /* Check for a /proc/$$/fd directory. */
 
-     len = snprintf(fdpath, sizeof(fdpath), "/proc/%ld/fd", (long)getpid());
 
-     if (len != -1 && len <= sizeof(fdpath) && (dirp = opendir(fdpath))) {
 
- 	while ((dent = readdir(dirp)) != NULL) {
 
- 	    fd = strtol(dent->d_name, &endp, 10);
 
- 	    if (dent->d_name != endp && *endp == '\0' &&
 
- 		fd >= 0 && fd < INT_MAX && fd >= lowfd && fd != dirfd(dirp))
 
- 		(void) close((int) fd);
 
- 	}
 
- 	(void) closedir(dirp);
 
-     } else
 
- #endif
 
-     {
 
- 	/*
 
- 	 * Fall back on sysconf() or getdtablesize().  We avoid checking
 
- 	 * resource limits since it is possible to open a file descriptor
 
- 	 * and then drop the rlimit such that it is below the open fd.
 
- 	 */
 
- #ifdef HAVE_SYSCONF
 
- 	maxfd = sysconf(_SC_OPEN_MAX);
 
- #else
 
- 	maxfd = getdtablesize();
 
- #endif /* HAVE_SYSCONF */
 
- 	if (maxfd < 0)
 
- 	    maxfd = OPEN_MAX;
 
- 	for (fd = lowfd; fd < maxfd; fd++)
 
- 	    (void) close((int) fd);
 
-     }
 
- }
 
- #endif /* HAVE_CLOSEFROM */
 
 
  |