summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/Makefile.am2
-rw-r--r--lib/utils_cmd.c15
-rw-r--r--plugins/common.h14
-rw-r--r--plugins/popen.c8
-rw-r--r--plugins/runcmd.c6
-rw-r--r--plugins/utils.c16
-rw-r--r--plugins/utils.h2
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
7AM_CPPFLAGS = -DNP_STATE_DIR_PREFIX=\"$(localstatedir)\" \ 7AM_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
10libmonitoringplug_a_SOURCES = utils_base.c utils_disk.c utils_tcp.c utils_cmd.c 10libmonitoringplug_a_SOURCES = utils_base.c utils_disk.c utils_tcp.c utils_cmd.c maxfd.c
11EXTRA_DIST = utils_base.h utils_disk.h utils_tcp.h utils_cmd.h parse_ini.h extra_opts.h 11EXTRA_DIST = utils_base.h utils_disk.h utils_tcp.h utils_cmd.h parse_ini.h extra_opts.h
12 12
13if USE_PARSE_INI 13if 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 *, ...)
86void 89void
87cmd_init (void) 90cmd_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)
265int 264int
266cmd_run (const char *cmdstring, output * out, output * err, int flags) 265cmd_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
235static 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 */
45extern pid_t *childpid; 46extern 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 */
89void np_runcmd_init(void) 89void 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
808int
809open_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 *,
106char *sperfdata_int (const char *, int, const char *, char *, char *, 106char *sperfdata_int (const char *, int, const char *, char *, char *,
107 int, int, int, int); 107 int, int, int, int);
108 108
109int 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 */