mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	Move implementation of closefrom(3) from app.c to strcompat.c
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@233358 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -73,6 +73,10 @@ | ||||
| #include "asterisk/poll-compat.h" | ||||
| #endif | ||||
|  | ||||
| #ifndef HAVE_CLOSEFROM | ||||
| void closefrom(int lowfd); | ||||
| #endif | ||||
|  | ||||
| #if !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC) | ||||
| int __attribute__((format(printf, 2, 3))) asprintf(char **str, const char *fmt, ...); | ||||
| #endif | ||||
|   | ||||
							
								
								
									
										19
									
								
								main/app.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								main/app.c
									
									
									
									
									
								
							| @@ -33,8 +33,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") | ||||
| #include <regex.h> | ||||
| #include <sys/file.h> /* added this to allow to compile, sorry! */ | ||||
| #include <signal.h> | ||||
| #include <sys/time.h>       /* for getrlimit(2) */ | ||||
| #include <sys/resource.h>   /* for getrlimit(2) */ | ||||
| #include <stdlib.h>         /* for closefrom(3) */ | ||||
| #ifdef HAVE_CAP | ||||
| #include <sys/capability.h> | ||||
| @@ -2008,24 +2006,7 @@ int ast_str_get_encoded_str(struct ast_str **str, int maxlen, const char *stream | ||||
|  | ||||
| void ast_close_fds_above_n(int n) | ||||
| { | ||||
| #ifdef HAVE_CLOSEFROM | ||||
| 	closefrom(n + 1); | ||||
| #else | ||||
| 	int x, null; | ||||
| 	struct rlimit rl; | ||||
| 	getrlimit(RLIMIT_NOFILE, &rl); | ||||
| 	null = open("/dev/null", O_RDONLY); | ||||
| 	for (x = n + 1; x < rl.rlim_cur; x++) { | ||||
| 		if (x != null) { | ||||
| 			/* Side effect of dup2 is that it closes any existing fd without error. | ||||
| 			 * This prevents valgrind and other debugging tools from sending up | ||||
| 			 * false error reports. */ | ||||
| 			while (dup2(null, x) < 0 && errno == EINTR); | ||||
| 			close(x); | ||||
| 		} | ||||
| 	} | ||||
| 	close(null); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| int ast_safe_fork(int stop_reaper) | ||||
|   | ||||
| @@ -22,6 +22,10 @@ | ||||
| #include "asterisk.h" | ||||
|  | ||||
| #include <ctype.h> | ||||
| #include <sys/time.h>       /* for getrlimit(2) */ | ||||
| #include <sys/resource.h>   /* for getrlimit(2) */ | ||||
| #include <sys/types.h>      /* for opendir(3) */ | ||||
| #include <dirent.h>         /* for opendir(3) */ | ||||
|  | ||||
| #ifndef HAVE_STRSEP | ||||
| char *strsep(char **str, const char *delims) | ||||
| @@ -399,3 +403,33 @@ int ffsll(long long n) | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #ifndef HAVE_CLOSEFROM | ||||
| void closefrom(int n) | ||||
| { | ||||
| 	long x; | ||||
| 	struct rlimit rl; | ||||
| 	DIR *dir; | ||||
| 	char path[16], *result; | ||||
| 	struct dirent *entry; | ||||
|  | ||||
| 	snprintf(path, sizeof(path), "/proc/%d/fd", (int) getpid()); | ||||
| 	if ((dir = opendir(path))) { | ||||
| 		while ((entry = readdir(dir))) { | ||||
| 			/* Skip . and .. */ | ||||
| 			if (entry->d_name[0] == '.') { | ||||
| 				continue; | ||||
| 			} | ||||
| 			if ((x = strtol(entry->d_name, &result, 10)) && x >= n) { | ||||
| 				close(x); | ||||
| 			} | ||||
| 		} | ||||
| 		closedir(dir); | ||||
| 	} else { | ||||
| 		getrlimit(RLIMIT_NOFILE, &rl); | ||||
| 		for (x = n; x < rl.rlim_cur; x++) { | ||||
| 			close(x); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| #endif | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user