diff options
-rw-r--r-- | lib/Makefile.am | 2 | ||||
-rw-r--r-- | lib/utils_cmd.c | 15 | ||||
-rw-r--r-- | plugins/common.h | 14 | ||||
-rw-r--r-- | plugins/popen.c | 8 | ||||
-rw-r--r-- | plugins/runcmd.c | 6 | ||||
-rw-r--r-- | plugins/utils.c | 16 | ||||
-rw-r--r-- | plugins/utils.h | 2 |
7 files changed, 16 insertions, 47 deletions
diff --git a/lib/Makefile.am b/lib/Makefile.am index 01d73a6..1a47395 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am | |||
@@ -7,7 +7,7 @@ noinst_LIBRARIES = libmonitoringplug.a | |||
7 | AM_CPPFLAGS = -DNP_STATE_DIR_PREFIX=\"$(localstatedir)\" \ | 7 | AM_CPPFLAGS = -DNP_STATE_DIR_PREFIX=\"$(localstatedir)\" \ |
8 | -I$(srcdir) -I$(top_srcdir)/gl -I$(top_srcdir)/intl -I$(top_srcdir)/plugins | 8 | -I$(srcdir) -I$(top_srcdir)/gl -I$(top_srcdir)/intl -I$(top_srcdir)/plugins |
9 | 9 | ||
10 | libmonitoringplug_a_SOURCES = utils_base.c utils_disk.c utils_tcp.c utils_cmd.c | 10 | libmonitoringplug_a_SOURCES = utils_base.c utils_disk.c utils_tcp.c utils_cmd.c maxfd.c |
11 | EXTRA_DIST = utils_base.h utils_disk.h utils_tcp.h utils_cmd.h parse_ini.h extra_opts.h | 11 | EXTRA_DIST = utils_base.h utils_disk.h utils_tcp.h utils_cmd.h parse_ini.h extra_opts.h |
12 | 12 | ||
13 | if USE_PARSE_INI | 13 | if USE_PARSE_INI |
diff --git a/lib/utils_cmd.c b/lib/utils_cmd.c index 34fb390..71da9d2 100644 --- a/lib/utils_cmd.c +++ b/lib/utils_cmd.c | |||
@@ -43,6 +43,9 @@ | |||
43 | #include "utils.h" | 43 | #include "utils.h" |
44 | #include "utils_cmd.h" | 44 | #include "utils_cmd.h" |
45 | #include "utils_base.h" | 45 | #include "utils_base.h" |
46 | |||
47 | #include "./maxfd.h" | ||
48 | |||
46 | #include <fcntl.h> | 49 | #include <fcntl.h> |
47 | 50 | ||
48 | #ifdef HAVE_SYS_WAIT_H | 51 | #ifdef HAVE_SYS_WAIT_H |
@@ -86,13 +89,7 @@ extern void die (int, const char *, ...) | |||
86 | void | 89 | void |
87 | cmd_init (void) | 90 | cmd_init (void) |
88 | { | 91 | { |
89 | #ifndef maxfd | 92 | long maxfd = open_max(); |
90 | if (!maxfd && (maxfd = sysconf (_SC_OPEN_MAX)) < 0) { | ||
91 | /* possibly log or emit a warning here, since there's no | ||
92 | * guarantee that our guess at maxfd will be adequate */ | ||
93 | maxfd = DEFAULT_MAXFD; | ||
94 | } | ||
95 | #endif | ||
96 | 93 | ||
97 | /* if maxfd is unnaturally high, we force it to a lower value | 94 | /* if maxfd is unnaturally high, we force it to a lower value |
98 | * ( e.g. on SunOS, when ulimit is set to unlimited: 2147483647 this would cause | 95 | * ( e.g. on SunOS, when ulimit is set to unlimited: 2147483647 this would cause |
@@ -148,6 +145,7 @@ _cmd_open (char *const *argv, int *pfd, int *pfderr) | |||
148 | /* close all descriptors in _cmd_pids[] | 145 | /* close all descriptors in _cmd_pids[] |
149 | * This is executed in a separate address space (pure child), | 146 | * This is executed in a separate address space (pure child), |
150 | * so we don't have to worry about async safety */ | 147 | * so we don't have to worry about async safety */ |
148 | long maxfd = open_max(); | ||
151 | for (i = 0; i < maxfd; i++) | 149 | for (i = 0; i < maxfd; i++) |
152 | if (_cmd_pids[i] > 0) | 150 | if (_cmd_pids[i] > 0) |
153 | close (i); | 151 | close (i); |
@@ -174,6 +172,7 @@ _cmd_close (int fd) | |||
174 | pid_t pid; | 172 | pid_t pid; |
175 | 173 | ||
176 | /* make sure the provided fd was opened */ | 174 | /* make sure the provided fd was opened */ |
175 | long maxfd = open_max(); | ||
177 | if (fd < 0 || fd > maxfd || !_cmd_pids || (pid = _cmd_pids[fd]) == 0) | 176 | if (fd < 0 || fd > maxfd || !_cmd_pids || (pid = _cmd_pids[fd]) == 0) |
178 | return -1; | 177 | return -1; |
179 | 178 | ||
@@ -265,7 +264,6 @@ _cmd_fetch_output (int fd, output * op, int flags) | |||
265 | int | 264 | int |
266 | cmd_run (const char *cmdstring, output * out, output * err, int flags) | 265 | cmd_run (const char *cmdstring, output * out, output * err, int flags) |
267 | { | 266 | { |
268 | int fd, pfd_out[2], pfd_err[2]; | ||
269 | int i = 0, argc; | 267 | int i = 0, argc; |
270 | size_t cmdlen; | 268 | size_t cmdlen; |
271 | char **argv = NULL; | 269 | char **argv = NULL; |
@@ -387,6 +385,7 @@ timeout_alarm_handler (int signo) | |||
387 | printf (_("%s - Plugin timed out after %d seconds\n"), | 385 | printf (_("%s - Plugin timed out after %d seconds\n"), |
388 | state_text(timeout_state), timeout_interval); | 386 | state_text(timeout_state), timeout_interval); |
389 | 387 | ||
388 | long maxfd = open_max(); | ||
390 | if(_cmd_pids) for(i = 0; i < maxfd; i++) { | 389 | if(_cmd_pids) for(i = 0; i < maxfd; i++) { |
391 | if(_cmd_pids[i] != 0) kill(_cmd_pids[i], SIGKILL); | 390 | if(_cmd_pids[i] != 0) kill(_cmd_pids[i], SIGKILL); |
392 | } | 391 | } |
diff --git a/plugins/common.h b/plugins/common.h index 0f08e2f..6bf4fca 100644 --- a/plugins/common.h +++ b/plugins/common.h | |||
@@ -225,18 +225,4 @@ enum { | |||
225 | # define __attribute__(x) /* do nothing */ | 225 | # define __attribute__(x) /* do nothing */ |
226 | #endif | 226 | #endif |
227 | 227 | ||
228 | /* Try sysconf(_SC_OPEN_MAX) first, as it can be higher than OPEN_MAX. | ||
229 | * If that fails and the macro isn't defined, we fall back to an educated | ||
230 | * guess. There's no guarantee that our guess is adequate and the program | ||
231 | * will die with SIGSEGV if it isn't and the upper boundary is breached. */ | ||
232 | #define DEFAULT_MAXFD 256 /* fallback value if no max open files value is set */ | ||
233 | #define MAXFD_LIMIT 8192 /* upper limit of open files */ | ||
234 | #ifdef _SC_OPEN_MAX | ||
235 | static long maxfd = 0; | ||
236 | #elif defined(OPEN_MAX) | ||
237 | # define maxfd OPEN_MAX | ||
238 | #else /* sysconf macro unavailable, so guess (may be wildly inaccurate) */ | ||
239 | # define maxfd DEFAULT_MAXFD | ||
240 | #endif | ||
241 | |||
242 | #endif /* _COMMON_H_ */ | 228 | #endif /* _COMMON_H_ */ |
diff --git a/plugins/popen.c b/plugins/popen.c index 723817d..7703afc 100644 --- a/plugins/popen.c +++ b/plugins/popen.c | |||
@@ -38,8 +38,9 @@ | |||
38 | * | 38 | * |
39 | *****************************************************************************/ | 39 | *****************************************************************************/ |
40 | 40 | ||
41 | #include "common.h" | 41 | #include "./common.h" |
42 | #include "utils.h" | 42 | #include "./utils.h" |
43 | #include "../lib/maxfd.h" | ||
43 | 44 | ||
44 | /* extern so plugin has pid to kill exec'd process on timeouts */ | 45 | /* extern so plugin has pid to kill exec'd process on timeouts */ |
45 | extern pid_t *childpid; | 46 | extern pid_t *childpid; |
@@ -177,8 +178,7 @@ spopen (const char *cmdstring) | |||
177 | } | 178 | } |
178 | argv[i] = NULL; | 179 | argv[i] = NULL; |
179 | 180 | ||
180 | if(maxfd == 0) | 181 | long maxfd = open_max(); |
181 | maxfd = open_max(); | ||
182 | 182 | ||
183 | if (childpid == NULL) { /* first time through */ | 183 | if (childpid == NULL) { /* first time through */ |
184 | if ((childpid = calloc ((size_t)maxfd, sizeof (pid_t))) == NULL) | 184 | if ((childpid = calloc ((size_t)maxfd, sizeof (pid_t))) == NULL) |
diff --git a/plugins/runcmd.c b/plugins/runcmd.c index 102191e..9816142 100644 --- a/plugins/runcmd.c +++ b/plugins/runcmd.c | |||
@@ -88,8 +88,7 @@ extern void die (int, const char *, ...) | |||
88 | * through this api and thus achieve async-safeness throughout the api */ | 88 | * through this api and thus achieve async-safeness throughout the api */ |
89 | void np_runcmd_init(void) | 89 | void np_runcmd_init(void) |
90 | { | 90 | { |
91 | if(maxfd == 0) | 91 | long maxfd = open_max(); |
92 | maxfd = open_max(); | ||
93 | if(!np_pids) np_pids = calloc(maxfd, sizeof(pid_t)); | 92 | if(!np_pids) np_pids = calloc(maxfd, sizeof(pid_t)); |
94 | } | 93 | } |
95 | 94 | ||
@@ -192,6 +191,7 @@ np_runcmd_open(const char *cmdstring, int *pfd, int *pfderr) | |||
192 | /* close all descriptors in np_pids[] | 191 | /* close all descriptors in np_pids[] |
193 | * This is executed in a separate address space (pure child), | 192 | * This is executed in a separate address space (pure child), |
194 | * so we don't have to worry about async safety */ | 193 | * so we don't have to worry about async safety */ |
194 | long maxfd = open_max(); | ||
195 | for (i = 0; i < maxfd; i++) | 195 | for (i = 0; i < maxfd; i++) |
196 | if(np_pids[i] > 0) | 196 | if(np_pids[i] > 0) |
197 | close (i); | 197 | close (i); |
@@ -219,6 +219,7 @@ np_runcmd_close(int fd) | |||
219 | pid_t pid; | 219 | pid_t pid; |
220 | 220 | ||
221 | /* make sure this fd was opened by popen() */ | 221 | /* make sure this fd was opened by popen() */ |
222 | long maxfd = open_max(); | ||
222 | if(fd < 0 || fd > maxfd || !np_pids || (pid = np_pids[fd]) == 0) | 223 | if(fd < 0 || fd > maxfd || !np_pids || (pid = np_pids[fd]) == 0) |
223 | return -1; | 224 | return -1; |
224 | 225 | ||
@@ -242,6 +243,7 @@ runcmd_timeout_alarm_handler (int signo) | |||
242 | if (signo == SIGALRM) | 243 | if (signo == SIGALRM) |
243 | puts(_("CRITICAL - Plugin timed out while executing system call")); | 244 | puts(_("CRITICAL - Plugin timed out while executing system call")); |
244 | 245 | ||
246 | long maxfd = open_max(); | ||
245 | if(np_pids) for(i = 0; i < maxfd; i++) { | 247 | if(np_pids) for(i = 0; i < maxfd; i++) { |
246 | if(np_pids[i] != 0) kill(np_pids[i], SIGKILL); | 248 | if(np_pids[i] != 0) kill(np_pids[i], SIGKILL); |
247 | } | 249 | } |
diff --git a/plugins/utils.c b/plugins/utils.c index b4214c6..71c0bdd 100644 --- a/plugins/utils.c +++ b/plugins/utils.c | |||
@@ -804,19 +804,3 @@ char *sperfdata_int (const char *label, | |||
804 | 804 | ||
805 | return data; | 805 | return data; |
806 | } | 806 | } |
807 | |||
808 | int | ||
809 | open_max (void) | ||
810 | { | ||
811 | errno = 0; | ||
812 | if (maxfd > 0) | ||
813 | return(maxfd); | ||
814 | |||
815 | if ((maxfd = sysconf (_SC_OPEN_MAX)) < 0) { | ||
816 | if (errno == 0) | ||
817 | maxfd = DEFAULT_MAXFD; /* it's indeterminate */ | ||
818 | else | ||
819 | die (STATE_UNKNOWN, _("sysconf error for _SC_OPEN_MAX\n")); | ||
820 | } | ||
821 | return(maxfd); | ||
822 | } | ||
diff --git a/plugins/utils.h b/plugins/utils.h index c76b321..cb979ce 100644 --- a/plugins/utils.h +++ b/plugins/utils.h | |||
@@ -106,8 +106,6 @@ char *sperfdata (const char *, double, const char *, char *, char *, | |||
106 | char *sperfdata_int (const char *, int, const char *, char *, char *, | 106 | char *sperfdata_int (const char *, int, const char *, char *, char *, |
107 | int, int, int, int); | 107 | int, int, int, int); |
108 | 108 | ||
109 | int open_max (void); | ||
110 | |||
111 | /* The idea here is that, although not every plugin will use all of these, | 109 | /* The idea here is that, although not every plugin will use all of these, |
112 | most will or should. Therefore, for consistency, these very common | 110 | most will or should. Therefore, for consistency, these very common |
113 | options should have only these meanings throughout the overall suite */ | 111 | options should have only these meanings throughout the overall suite */ |