| 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 lintstatic 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. */voidclosefrom(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 */
 |