summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/check_apt.c19
-rw-r--r--plugins/check_by_ssh.c27
-rw-r--r--plugins/check_curl.c155
-rw-r--r--plugins/check_dbi.c2
-rw-r--r--plugins/check_dig.c10
-rw-r--r--plugins/check_disk.c226
-rw-r--r--plugins/check_dns.c72
-rw-r--r--plugins/check_fping.c50
-rw-r--r--plugins/check_game.c14
-rw-r--r--plugins/check_http.c30
-rw-r--r--plugins/check_ide_smart.c18
-rw-r--r--plugins/check_ldap.c25
-rw-r--r--plugins/check_load.c26
-rw-r--r--plugins/check_mrtg.c14
-rw-r--r--plugins/check_mrtgtraf.c20
-rw-r--r--plugins/check_mysql.c22
-rw-r--r--plugins/check_mysql_query.c8
-rw-r--r--plugins/check_nt.c60
-rw-r--r--plugins/check_ntp.c29
-rw-r--r--plugins/check_ntp_peer.c67
-rw-r--r--plugins/check_ntp_time.c17
-rw-r--r--plugins/check_nwstat.c203
-rw-r--r--plugins/check_overcr.c36
-rw-r--r--plugins/check_pgsql.c16
-rw-r--r--plugins/check_ping.c30
-rw-r--r--plugins/check_procs.c52
-rw-r--r--plugins/check_radius.c6
-rw-r--r--plugins/check_real.c16
-rw-r--r--plugins/check_smtp.c63
-rw-r--r--plugins/check_snmp.c211
-rw-r--r--plugins/check_ssh.c197
-rw-r--r--plugins/check_swap.c87
-rw-r--r--plugins/check_tcp.c71
-rw-r--r--plugins/check_time.c60
-rw-r--r--plugins/check_ups.c1023
-rw-r--r--plugins/check_users.c25
-rw-r--r--plugins/common.h22
-rw-r--r--plugins/negate.c25
-rw-r--r--plugins/netutils.c32
-rw-r--r--plugins/netutils.h8
-rw-r--r--plugins/popen.c18
-rw-r--r--plugins/popen.h2
-rw-r--r--plugins/runcmd.c13
-rw-r--r--plugins/sslutils.c77
-rw-r--r--plugins/t/check_curl.t4
-rw-r--r--plugins/t/check_disk.t57
-rw-r--r--plugins/t/check_http.t4
-rw-r--r--plugins/t/check_imap.t2
-rw-r--r--plugins/t/check_ssh.t122
-rw-r--r--plugins/t/check_swap.t14
-rw-r--r--plugins/t/check_users.t7
-rwxr-xr-xplugins/tests/check_curl.t16
-rwxr-xr-xplugins/tests/check_http.t12
-rw-r--r--plugins/utils.c180
-rw-r--r--plugins/utils.h31
55 files changed, 2013 insertions, 1640 deletions
diff --git a/plugins/check_apt.c b/plugins/check_apt.c
index fa982ae3..5c0f6e28 100644
--- a/plugins/check_apt.c
+++ b/plugins/check_apt.c
@@ -94,7 +94,7 @@ static int stderr_warning = 0; /* if a cmd issued output on stderr */
94static int exec_warning = 0; /* if a cmd exited non-zero */ 94static int exec_warning = 0; /* if a cmd exited non-zero */
95 95
96int main (int argc, char **argv) { 96int main (int argc, char **argv) {
97 int result=STATE_UNKNOWN, packages_available=0, sec_count=0, i=0; 97 int result=STATE_UNKNOWN, packages_available=0, sec_count=0;
98 char **packages_list=NULL, **secpackages_list=NULL; 98 char **packages_list=NULL, **secpackages_list=NULL;
99 99
100 /* Parse extra opts if any */ 100 /* Parse extra opts if any */
@@ -142,10 +142,11 @@ int main (int argc, char **argv) {
142 qsort(secpackages_list, sec_count, sizeof(char*), cmpstringp); 142 qsort(secpackages_list, sec_count, sizeof(char*), cmpstringp);
143 qsort(packages_list, packages_available-sec_count, sizeof(char*), cmpstringp); 143 qsort(packages_list, packages_available-sec_count, sizeof(char*), cmpstringp);
144 144
145 for(i = 0; i < sec_count; i++) 145 for(int i = 0; i < sec_count; i++)
146 printf("%s (security)\n", secpackages_list[i]); 146 printf("%s (security)\n", secpackages_list[i]);
147
147 if (only_critical == false) { 148 if (only_critical == false) {
148 for(i = 0; i < packages_available - sec_count; i++) 149 for(int i = 0; i < packages_available - sec_count; i++)
149 printf("%s\n", packages_list[i]); 150 printf("%s\n", packages_list[i]);
150 } 151 }
151 } 152 }
@@ -251,7 +252,7 @@ int process_arguments (int argc, char **argv) {
251 252
252/* run an apt-get upgrade */ 253/* run an apt-get upgrade */
253int run_upgrade(int *pkgcount, int *secpkgcount, char ***pkglist, char ***secpkglist){ 254int run_upgrade(int *pkgcount, int *secpkgcount, char ***pkglist, char ***secpkglist){
254 int i=0, result=STATE_UNKNOWN, regres=0, pc=0, spc=0; 255 int result=STATE_UNKNOWN, regres=0, pc=0, spc=0;
255 struct output chld_out, chld_err; 256 struct output chld_out, chld_err;
256 regex_t ireg, ereg, sreg; 257 regex_t ireg, ereg, sreg;
257 char *cmdline=NULL, rerrbuf[64]; 258 char *cmdline=NULL, rerrbuf[64];
@@ -320,7 +321,7 @@ int run_upgrade(int *pkgcount, int *secpkgcount, char ***pkglist, char ***secpkg
320 * we may need to switch to the --print-uris output format, 321 * we may need to switch to the --print-uris output format,
321 * in which case the logic here will slightly change. 322 * in which case the logic here will slightly change.
322 */ 323 */
323 for(i = 0; i < chld_out.lines; i++) { 324 for(size_t i = 0; i < chld_out.lines; i++) {
324 if(verbose){ 325 if(verbose){
325 printf("%s\n", chld_out.line[i]); 326 printf("%s\n", chld_out.line[i]);
326 } 327 }
@@ -353,7 +354,7 @@ int run_upgrade(int *pkgcount, int *secpkgcount, char ***pkglist, char ***secpkg
353 stderr_warning=1; 354 stderr_warning=1;
354 result = max_state(result, STATE_WARNING); 355 result = max_state(result, STATE_WARNING);
355 if(verbose){ 356 if(verbose){
356 for(i = 0; i < chld_err.lines; i++) { 357 for(size_t i = 0; i < chld_err.lines; i++) {
357 fprintf(stderr, "%s\n", chld_err.line[i]); 358 fprintf(stderr, "%s\n", chld_err.line[i]);
358 } 359 }
359 } 360 }
@@ -367,7 +368,7 @@ int run_upgrade(int *pkgcount, int *secpkgcount, char ***pkglist, char ***secpkg
367 368
368/* run an apt-get update (needs root) */ 369/* run an apt-get update (needs root) */
369int run_update(void){ 370int run_update(void){
370 int i=0, result=STATE_UNKNOWN; 371 int result=STATE_UNKNOWN;
371 struct output chld_out, chld_err; 372 struct output chld_out, chld_err;
372 char *cmdline; 373 char *cmdline;
373 374
@@ -385,7 +386,7 @@ int run_update(void){
385 } 386 }
386 387
387 if(verbose){ 388 if(verbose){
388 for(i = 0; i < chld_out.lines; i++) { 389 for(size_t i = 0; i < chld_out.lines; i++) {
389 printf("%s\n", chld_out.line[i]); 390 printf("%s\n", chld_out.line[i]);
390 } 391 }
391 } 392 }
@@ -395,7 +396,7 @@ int run_update(void){
395 stderr_warning=1; 396 stderr_warning=1;
396 result = max_state(result, STATE_WARNING); 397 result = max_state(result, STATE_WARNING);
397 if(verbose){ 398 if(verbose){
398 for(i = 0; i < chld_err.lines; i++) { 399 for(size_t i = 0; i < chld_err.lines; i++) {
399 fprintf(stderr, "%s\n", chld_err.line[i]); 400 fprintf(stderr, "%s\n", chld_err.line[i]);
400 } 401 }
401 } 402 }
diff --git a/plugins/check_by_ssh.c b/plugins/check_by_ssh.c
index 1ad547ed..2a23b397 100644
--- a/plugins/check_by_ssh.c
+++ b/plugins/check_by_ssh.c
@@ -50,7 +50,7 @@ unsigned int services = 0;
50int skip_stdout = 0; 50int skip_stdout = 0;
51int skip_stderr = 0; 51int skip_stderr = 0;
52int warn_on_stderr = 0; 52int warn_on_stderr = 0;
53bool unknown_timeout = FALSE; 53bool unknown_timeout = false;
54char *remotecmd = NULL; 54char *remotecmd = NULL;
55char **commargv = NULL; 55char **commargv = NULL;
56int commargc = 0; 56int commargc = 0;
@@ -58,8 +58,8 @@ char *hostname = NULL;
58char *outputfile = NULL; 58char *outputfile = NULL;
59char *host_shortname = NULL; 59char *host_shortname = NULL;
60char **service; 60char **service;
61int passive = FALSE; 61bool passive = false;
62int verbose = FALSE; 62bool verbose = false;
63 63
64int 64int
65main (int argc, char **argv) 65main (int argc, char **argv)
@@ -68,7 +68,6 @@ main (int argc, char **argv)
68 char *status_text; 68 char *status_text;
69 int cresult; 69 int cresult;
70 int result = STATE_UNKNOWN; 70 int result = STATE_UNKNOWN;
71 int i;
72 time_t local_time; 71 time_t local_time;
73 FILE *fp = NULL; 72 FILE *fp = NULL;
74 output chld_out, chld_err; 73 output chld_out, chld_err;
@@ -96,7 +95,7 @@ main (int argc, char **argv)
96 /* run the command */ 95 /* run the command */
97 if (verbose) { 96 if (verbose) {
98 printf ("Command: %s\n", commargv[0]); 97 printf ("Command: %s\n", commargv[0]);
99 for (i=1; i<commargc; i++) 98 for (int i = 1; i < commargc; i++)
100 printf ("Argument %i: %s\n", i, commargv[i]); 99 printf ("Argument %i: %s\n", i, commargv[i]);
101 } 100 }
102 101
@@ -110,9 +109,9 @@ main (int argc, char **argv)
110 } 109 }
111 110
112 if (verbose) { 111 if (verbose) {
113 for(i = 0; i < chld_out.lines; i++) 112 for(size_t i = 0; i < chld_out.lines; i++)
114 printf("stdout: %s\n", chld_out.line[i]); 113 printf("stdout: %s\n", chld_out.line[i]);
115 for(i = 0; i < chld_err.lines; i++) 114 for(size_t i = 0; i < chld_err.lines; i++)
116 printf("stderr: %s\n", chld_err.line[i]); 115 printf("stderr: %s\n", chld_err.line[i]);
117 } 116 }
118 117
@@ -122,7 +121,7 @@ main (int argc, char **argv)
122 skip_stderr = chld_err.lines; 121 skip_stderr = chld_err.lines;
123 122
124 /* UNKNOWN or worse if (non-skipped) output found on stderr */ 123 /* UNKNOWN or worse if (non-skipped) output found on stderr */
125 if(chld_err.lines > skip_stderr) { 124 if(chld_err.lines > (size_t)skip_stderr) {
126 printf (_("Remote command execution failed: %s\n"), 125 printf (_("Remote command execution failed: %s\n"),
127 chld_err.line[skip_stderr]); 126 chld_err.line[skip_stderr]);
128 if ( warn_on_stderr ) 127 if ( warn_on_stderr )
@@ -134,8 +133,8 @@ main (int argc, char **argv)
134 /* this is simple if we're not supposed to be passive. 133 /* this is simple if we're not supposed to be passive.
135 * Wrap up quickly and keep the tricks below */ 134 * Wrap up quickly and keep the tricks below */
136 if(!passive) { 135 if(!passive) {
137 if (chld_out.lines > skip_stdout) 136 if (chld_out.lines > (size_t)skip_stdout)
138 for (i = skip_stdout; i < chld_out.lines; i++) 137 for (size_t i = skip_stdout; i < chld_out.lines; i++)
139 puts (chld_out.line[i]); 138 puts (chld_out.line[i]);
140 else 139 else
141 printf (_("%s - check_by_ssh: Remote command '%s' returned status %d\n"), 140 printf (_("%s - check_by_ssh: Remote command '%s' returned status %d\n"),
@@ -156,7 +155,7 @@ main (int argc, char **argv)
156 155
157 local_time = time (NULL); 156 local_time = time (NULL);
158 commands = 0; 157 commands = 0;
159 for(i = skip_stdout; i < chld_out.lines; i++) { 158 for(size_t i = skip_stdout; i < chld_out.lines; i++) {
160 status_text = chld_out.line[i++]; 159 status_text = chld_out.line[i++];
161 if (i == chld_out.lines || strstr (chld_out.line[i], "STATUS CODE: ") == NULL) 160 if (i == chld_out.lines || strstr (chld_out.line[i], "STATUS CODE: ") == NULL)
162 die (STATE_UNKNOWN, _("%s: Error parsing output\n"), progname); 161 die (STATE_UNKNOWN, _("%s: Error parsing output\n"), progname);
@@ -235,7 +234,7 @@ process_arguments (int argc, char **argv)
235 print_help (); 234 print_help ();
236 exit (STATE_UNKNOWN); 235 exit (STATE_UNKNOWN);
237 case 'v': /* help */ 236 case 'v': /* help */
238 verbose = TRUE; 237 verbose = true;
239 break; 238 break;
240 case 't': /* timeout period */ 239 case 't': /* timeout period */
241 if (!is_integer (optarg)) 240 if (!is_integer (optarg))
@@ -244,7 +243,7 @@ process_arguments (int argc, char **argv)
244 timeout_interval = atoi (optarg); 243 timeout_interval = atoi (optarg);
245 break; 244 break;
246 case 'U': 245 case 'U':
247 unknown_timeout = TRUE; 246 unknown_timeout = true;
248 break; 247 break;
249 case 'H': /* host */ 248 case 'H': /* host */
250 hostname = optarg; 249 hostname = optarg;
@@ -257,7 +256,7 @@ process_arguments (int argc, char **argv)
257 break; 256 break;
258 case 'O': /* output file */ 257 case 'O': /* output file */
259 outputfile = optarg; 258 outputfile = optarg;
260 passive = TRUE; 259 passive = true;
261 break; 260 break;
262 case 's': /* description of service to check */ 261 case 's': /* description of service to check */
263 p1 = optarg; 262 p1 = optarg;
diff --git a/plugins/check_curl.c b/plugins/check_curl.c
index d0871c48..d3bddacd 100644
--- a/plugins/check_curl.c
+++ b/plugins/check_curl.c
@@ -134,6 +134,7 @@ char regexp[MAX_RE_SIZE];
134int cflags = REG_NOSUB | REG_EXTENDED | REG_NEWLINE; 134int cflags = REG_NOSUB | REG_EXTENDED | REG_NEWLINE;
135int errcode; 135int errcode;
136bool invert_regex = false; 136bool invert_regex = false;
137int state_regex = STATE_CRITICAL;
137 138
138char *server_address = NULL; 139char *server_address = NULL;
139char *host_name = NULL; 140char *host_name = NULL;
@@ -213,6 +214,7 @@ char *client_privkey = NULL;
213char *ca_cert = NULL; 214char *ca_cert = NULL;
214bool verify_peer_and_host = false; 215bool verify_peer_and_host = false;
215bool is_openssl_callback = false; 216bool is_openssl_callback = false;
217bool add_sslctx_verify_fun = false;
216#if defined(HAVE_SSL) && defined(USE_OPENSSL) 218#if defined(HAVE_SSL) && defined(USE_OPENSSL)
217X509 *cert = NULL; 219X509 *cert = NULL;
218#endif /* defined(HAVE_SSL) && defined(USE_OPENSSL) */ 220#endif /* defined(HAVE_SSL) && defined(USE_OPENSSL) */
@@ -223,6 +225,7 @@ curlhelp_ssl_library ssl_library = CURLHELP_SSL_LIBRARY_UNKNOWN;
223int curl_http_version = CURL_HTTP_VERSION_NONE; 225int curl_http_version = CURL_HTTP_VERSION_NONE;
224bool automatic_decompression = false; 226bool automatic_decompression = false;
225char *cookie_jar_file = NULL; 227char *cookie_jar_file = NULL;
228bool haproxy_protocol = false;
226 229
227bool process_arguments (int, char**); 230bool process_arguments (int, char**);
228void handle_curl_option_return_code (CURLcode res, const char* option); 231void handle_curl_option_return_code (CURLcode res, const char* option);
@@ -239,10 +242,10 @@ void print_help (void);
239void print_usage (void); 242void print_usage (void);
240void print_curl_version (void); 243void print_curl_version (void);
241int curlhelp_initwritebuffer (curlhelp_write_curlbuf*); 244int curlhelp_initwritebuffer (curlhelp_write_curlbuf*);
242int curlhelp_buffer_write_callback (void*, size_t , size_t , void*); 245size_t curlhelp_buffer_write_callback(void*, size_t , size_t , void*);
243void curlhelp_freewritebuffer (curlhelp_write_curlbuf*); 246void curlhelp_freewritebuffer (curlhelp_write_curlbuf*);
244int curlhelp_initreadbuffer (curlhelp_read_curlbuf *, const char *, size_t); 247int curlhelp_initreadbuffer (curlhelp_read_curlbuf *, const char *, size_t);
245int curlhelp_buffer_read_callback (void *, size_t , size_t , void *); 248size_t curlhelp_buffer_read_callback(void *, size_t , size_t , void *);
246void curlhelp_freereadbuffer (curlhelp_read_curlbuf *); 249void curlhelp_freereadbuffer (curlhelp_read_curlbuf *);
247curlhelp_ssl_library curlhelp_get_ssl_library (); 250curlhelp_ssl_library curlhelp_get_ssl_library ();
248const char* curlhelp_get_ssl_library_string (curlhelp_ssl_library); 251const char* curlhelp_get_ssl_library_string (curlhelp_ssl_library);
@@ -297,7 +300,7 @@ main (int argc, char **argv)
297 300
298int verify_callback(int preverify_ok, X509_STORE_CTX *x509_ctx) 301int verify_callback(int preverify_ok, X509_STORE_CTX *x509_ctx)
299{ 302{
300 (void) preverify_ok; 303 (void) preverify_ok;
301 /* TODO: we get all certificates of the chain, so which ones 304 /* TODO: we get all certificates of the chain, so which ones
302 * should we test? 305 * should we test?
303 * TODO: is the last certificate always the server certificate? 306 * TODO: is the last certificate always the server certificate?
@@ -322,9 +325,18 @@ int verify_callback(int preverify_ok, X509_STORE_CTX *x509_ctx)
322 325
323CURLcode sslctxfun(CURL *curl, SSL_CTX *sslctx, void *parm) 326CURLcode sslctxfun(CURL *curl, SSL_CTX *sslctx, void *parm)
324{ 327{
325 (void) curl; // ignore unused parameter 328 (void) curl; // ignore unused parameter
326 (void) parm; // ignore unused parameter 329 (void) parm; // ignore unused parameter
327 SSL_CTX_set_verify(sslctx, SSL_VERIFY_PEER, verify_callback); 330 if(add_sslctx_verify_fun) {
331 SSL_CTX_set_verify(sslctx, SSL_VERIFY_PEER, verify_callback);
332 }
333
334 // workaround for issue:
335 // OpenSSL SSL_read: error:0A000126:SSL routines::unexpected eof while reading, errno 0
336 // see discussion https://github.com/openssl/openssl/discussions/22690
337#ifdef SSL_OP_IGNORE_UNEXPECTED_EOF
338 SSL_CTX_set_options(sslctx, SSL_OP_IGNORE_UNEXPECTED_EOF);
339#endif
328 340
329 return CURLE_OK; 341 return CURLE_OK;
330} 342}
@@ -395,7 +407,7 @@ lookup_host (const char *host, char *buf, size_t buflen)
395 char addrstr[100]; 407 char addrstr[100];
396 size_t addrstr_len; 408 size_t addrstr_len;
397 int errcode; 409 int errcode;
398 void *ptr; 410 void *ptr = { 0 };
399 size_t buflen_remaining = buflen - 1; 411 size_t buflen_remaining = buflen - 1;
400 412
401 memset (&hints, 0, sizeof (hints)); 413 memset (&hints, 0, sizeof (hints));
@@ -466,6 +478,7 @@ int
466check_http (void) 478check_http (void)
467{ 479{
468 int result = STATE_OK; 480 int result = STATE_OK;
481 int result_ssl = STATE_OK;
469 int page_len = 0; 482 int page_len = 0;
470 int i; 483 int i;
471 char *force_host_header = NULL; 484 char *force_host_header = NULL;
@@ -485,7 +498,7 @@ check_http (void)
485 498
486 /* register cleanup function to shut down libcurl properly */ 499 /* register cleanup function to shut down libcurl properly */
487 atexit (cleanup); 500 atexit (cleanup);
488 501
489 if (verbose >= 1) 502 if (verbose >= 1)
490 handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_VERBOSE, 1), "CURLOPT_VERBOSE"); 503 handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_VERBOSE, 1), "CURLOPT_VERBOSE");
491 504
@@ -520,6 +533,11 @@ check_http (void)
520 handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_CONNECTTIMEOUT, socket_timeout), "CURLOPT_CONNECTTIMEOUT"); 533 handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_CONNECTTIMEOUT, socket_timeout), "CURLOPT_CONNECTTIMEOUT");
521 handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_TIMEOUT, socket_timeout), "CURLOPT_TIMEOUT"); 534 handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_TIMEOUT, socket_timeout), "CURLOPT_TIMEOUT");
522 535
536 /* enable haproxy protocol */
537 if (haproxy_protocol) {
538 handle_curl_option_return_code(curl_easy_setopt(curl, CURLOPT_HAPROXYPROTOCOL, 1L), "CURLOPT_HAPROXYPROTOCOL");
539 }
540
523 // fill dns resolve cache to make curl connect to the given server_address instead of the host_name, only required for ssl, because we use the host_name later on to make SNI happy 541 // fill dns resolve cache to make curl connect to the given server_address instead of the host_name, only required for ssl, because we use the host_name later on to make SNI happy
524 if(use_ssl && host_name != NULL) { 542 if(use_ssl && host_name != NULL) {
525 if ( (res=lookup_host (server_address, addrstr, DEFAULT_BUFFER_SIZE/2)) != 0) { 543 if ( (res=lookup_host (server_address, addrstr, DEFAULT_BUFFER_SIZE/2)) != 0) {
@@ -670,9 +688,8 @@ check_http (void)
670 * OpenSSL-style libraries only!) */ 688 * OpenSSL-style libraries only!) */
671#ifdef USE_OPENSSL 689#ifdef USE_OPENSSL
672 /* libcurl and monitoring plugins built with OpenSSL, good */ 690 /* libcurl and monitoring plugins built with OpenSSL, good */
673 handle_curl_option_return_code (curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, sslctxfun), "CURLOPT_SSL_CTX_FUNCTION"); 691 add_sslctx_verify_fun = true;
674 is_openssl_callback = true; 692 is_openssl_callback = true;
675#else /* USE_OPENSSL */
676#endif /* USE_OPENSSL */ 693#endif /* USE_OPENSSL */
677 /* libcurl is built with OpenSSL, monitoring plugins, so falling 694 /* libcurl is built with OpenSSL, monitoring plugins, so falling
678 * back to manually extracting certificate information */ 695 * back to manually extracting certificate information */
@@ -705,12 +722,18 @@ check_http (void)
705#else /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 19, 1) */ 722#else /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 19, 1) */
706 /* old libcurl, our only hope is OpenSSL, otherwise we are out of luck */ 723 /* old libcurl, our only hope is OpenSSL, otherwise we are out of luck */
707 if (ssl_library == CURLHELP_SSL_LIBRARY_OPENSSL || ssl_library == CURLHELP_SSL_LIBRARY_LIBRESSL) 724 if (ssl_library == CURLHELP_SSL_LIBRARY_OPENSSL || ssl_library == CURLHELP_SSL_LIBRARY_LIBRESSL)
708 handle_curl_option_return_code (curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, sslctxfun), "CURLOPT_SSL_CTX_FUNCTION"); 725 add_sslctx_verify_fun = true;
709 else 726 else
710 die (STATE_CRITICAL, "HTTP CRITICAL - Cannot retrieve certificates (no CURLOPT_SSL_CTX_FUNCTION, no OpenSSL library or libcurl too old and has no CURLOPT_CERTINFO)\n"); 727 die (STATE_CRITICAL, "HTTP CRITICAL - Cannot retrieve certificates (no CURLOPT_SSL_CTX_FUNCTION, no OpenSSL library or libcurl too old and has no CURLOPT_CERTINFO)\n");
711#endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 19, 1) */ 728#endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 19, 1) */
712 } 729 }
713 730
731#if LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 10, 6) /* required for CURLOPT_SSL_CTX_FUNCTION */
732 // ssl ctx function is not available with all ssl backends
733 if (curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, NULL) != CURLE_UNKNOWN_OPTION)
734 handle_curl_option_return_code (curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, sslctxfun), "CURLOPT_SSL_CTX_FUNCTION");
735#endif
736
714#endif /* LIBCURL_FEATURE_SSL */ 737#endif /* LIBCURL_FEATURE_SSL */
715 738
716 /* set default or user-given user agent identification */ 739 /* set default or user-given user agent identification */
@@ -805,7 +828,7 @@ check_http (void)
805 handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_INFILESIZE, (curl_off_t)strlen (http_post_data)), "CURLOPT_INFILESIZE"); 828 handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_INFILESIZE, (curl_off_t)strlen (http_post_data)), "CURLOPT_INFILESIZE");
806 } 829 }
807 } 830 }
808 831
809 /* cookie handling */ 832 /* cookie handling */
810 if (cookie_jar_file != NULL) { 833 if (cookie_jar_file != NULL) {
811 handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_COOKIEJAR, cookie_jar_file), "CURLOPT_COOKIEJAR"); 834 handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_COOKIEJAR, cookie_jar_file), "CURLOPT_COOKIEJAR");
@@ -845,9 +868,9 @@ check_http (void)
845 /* check certificate with OpenSSL functions, curl has been built against OpenSSL 868 /* check certificate with OpenSSL functions, curl has been built against OpenSSL
846 * and we actually have OpenSSL in the monitoring tools 869 * and we actually have OpenSSL in the monitoring tools
847 */ 870 */
848 result = np_net_ssl_check_certificate(cert, days_till_exp_warn, days_till_exp_crit); 871 result_ssl = np_net_ssl_check_certificate(cert, days_till_exp_warn, days_till_exp_crit);
849 if (!continue_after_check_cert) { 872 if (!continue_after_check_cert) {
850 return result; 873 return result_ssl;
851 } 874 }
852#else /* USE_OPENSSL */ 875#else /* USE_OPENSSL */
853 die (STATE_CRITICAL, "HTTP CRITICAL - Cannot retrieve certificates - OpenSSL callback used and not linked against OpenSSL\n"); 876 die (STATE_CRITICAL, "HTTP CRITICAL - Cannot retrieve certificates - OpenSSL callback used and not linked against OpenSSL\n");
@@ -891,17 +914,17 @@ GOT_FIRST_CERT:
891 die (STATE_CRITICAL, "HTTP CRITICAL - %s\n", msg); 914 die (STATE_CRITICAL, "HTTP CRITICAL - %s\n", msg);
892 } 915 }
893 BIO_free (cert_BIO); 916 BIO_free (cert_BIO);
894 result = np_net_ssl_check_certificate(cert, days_till_exp_warn, days_till_exp_crit); 917 result_ssl = np_net_ssl_check_certificate(cert, days_till_exp_warn, days_till_exp_crit);
895 if (!continue_after_check_cert) { 918 if (!continue_after_check_cert) {
896 return result; 919 return result_ssl;
897 } 920 }
898#else /* USE_OPENSSL */ 921#else /* USE_OPENSSL */
899 /* We assume we don't have OpenSSL and np_net_ssl_check_certificate at our disposal, 922 /* We assume we don't have OpenSSL and np_net_ssl_check_certificate at our disposal,
900 * so we use the libcurl CURLINFO data 923 * so we use the libcurl CURLINFO data
901 */ 924 */
902 result = net_noopenssl_check_certificate(&cert_ptr, days_till_exp_warn, days_till_exp_crit); 925 result_ssl = net_noopenssl_check_certificate(&cert_ptr, days_till_exp_warn, days_till_exp_crit);
903 if (!continue_after_check_cert) { 926 if (!continue_after_check_cert) {
904 return result; 927 return result_ssl;
905 } 928 }
906#endif /* USE_OPENSSL */ 929#endif /* USE_OPENSSL */
907 } else { 930 } else {
@@ -1127,7 +1150,7 @@ GOT_FIRST_CERT:
1127 strcpy(msg, tmp); 1150 strcpy(msg, tmp);
1128 1151
1129 } 1152 }
1130 result = STATE_CRITICAL; 1153 result = state_regex;
1131 } else { 1154 } else {
1132 regerror (errcode, &preg, errbuf, MAX_INPUT_BUFFER); 1155 regerror (errcode, &preg, errbuf, MAX_INPUT_BUFFER);
1133 1156
@@ -1167,9 +1190,9 @@ GOT_FIRST_CERT:
1167 else 1190 else
1168 msg[strlen(msg)-3] = '\0'; 1191 msg[strlen(msg)-3] = '\0';
1169 } 1192 }
1170 1193
1171 /* TODO: separate _() msg and status code: die (result, "HTTP %s: %s\n", state_text(result), msg); */ 1194 /* TODO: separate _() msg and status code: die (result, "HTTP %s: %s\n", state_text(result), msg); */
1172 die (result, "HTTP %s: %s %d %s%s%s - %d bytes in %.3f second response time %s|%s\n%s%s", 1195 die (max_state_alt(result, result_ssl), "HTTP %s: %s %d %s%s%s - %d bytes in %.3f second response time %s|%s\n%s%s",
1173 state_text(result), string_statuscode (status_line.http_major, status_line.http_minor), 1196 state_text(result), string_statuscode (status_line.http_major, status_line.http_minor),
1174 status_line.http_code, status_line.msg, 1197 status_line.http_code, status_line.msg,
1175 strlen(msg) > 0 ? " - " : "", 1198 strlen(msg) > 0 ? " - " : "",
@@ -1179,23 +1202,23 @@ GOT_FIRST_CERT:
1179 (show_body ? body_buf.buf : ""), 1202 (show_body ? body_buf.buf : ""),
1180 (show_body ? "\n" : "") ); 1203 (show_body ? "\n" : "") );
1181 1204
1182 return result; 1205 return max_state_alt(result, result_ssl);
1183} 1206}
1184 1207
1185int 1208int
1186uri_strcmp (const UriTextRangeA range, const char* s) 1209uri_strcmp (const UriTextRangeA range, const char* s)
1187{ 1210{
1188 if (!range.first) return -1; 1211 if (!range.first) return -1;
1189 if (range.afterLast - range.first < strlen (s)) return -1; 1212 if ( (size_t)(range.afterLast - range.first) < strlen (s) ) return -1;
1190 return strncmp (s, range.first, min( range.afterLast - range.first, strlen (s))); 1213 return strncmp (s, range.first, min( (size_t)(range.afterLast - range.first), strlen (s)));
1191} 1214}
1192 1215
1193char* 1216char*
1194uri_string (const UriTextRangeA range, char* buf, size_t buflen) 1217uri_string (const UriTextRangeA range, char* buf, size_t buflen)
1195{ 1218{
1196 if (!range.first) return "(null)"; 1219 if (!range.first) return "(null)";
1197 strncpy (buf, range.first, max (buflen-1, range.afterLast - range.first)); 1220 strncpy (buf, range.first, max (buflen-1, (size_t)(range.afterLast - range.first)));
1198 buf[max (buflen-1, range.afterLast - range.first)] = '\0'; 1221 buf[max (buflen-1, (size_t)(range.afterLast - range.first))] = '\0';
1199 buf[range.afterLast - range.first] = '\0'; 1222 buf[range.afterLast - range.first] = '\0';
1200 return buf; 1223 return buf;
1201} 1224}
@@ -1218,6 +1241,10 @@ redir (curlhelp_write_curlbuf* header_buf)
1218 &status_line.http_major, &status_line.http_minor, &status_line.http_code, &status_line.msg, &msglen, 1241 &status_line.http_major, &status_line.http_minor, &status_line.http_code, &status_line.msg, &msglen,
1219 headers, &nof_headers, 0); 1242 headers, &nof_headers, 0);
1220 1243
1244 if (res == -1) {
1245 die (STATE_UNKNOWN, _("HTTP UNKNOWN - Failed to parse Response\n"));
1246 }
1247
1221 location = get_header_value (headers, nof_headers, "location"); 1248 location = get_header_value (headers, nof_headers, "location");
1222 1249
1223 if (verbose >= 2) 1250 if (verbose >= 2)
@@ -1274,10 +1301,12 @@ redir (curlhelp_write_curlbuf* header_buf)
1274 } 1301 }
1275 } 1302 }
1276 1303
1277 if (!uri_strcmp (uri.scheme, "https")) 1304 if (uri.scheme.first) {
1278 use_ssl = true; 1305 if (!uri_strcmp (uri.scheme, "https"))
1279 else 1306 use_ssl = true;
1280 use_ssl = false; 1307 else
1308 use_ssl = false;
1309 }
1281 1310
1282 /* we do a sloppy test here only, because uriparser would have failed 1311 /* we do a sloppy test here only, because uriparser would have failed
1283 * above, if the port would be invalid, we just check for MAX_PORT 1312 * above, if the port would be invalid, we just check for MAX_PORT
@@ -1295,10 +1324,13 @@ redir (curlhelp_write_curlbuf* header_buf)
1295 MAX_PORT, location, display_html ? "</A>" : ""); 1324 MAX_PORT, location, display_html ? "</A>" : "");
1296 1325
1297 /* by RFC 7231 relative URLs in Location should be taken relative to 1326 /* by RFC 7231 relative URLs in Location should be taken relative to
1298 * the original URL, so wy try to form a new absolute URL here 1327 * the original URL, so we try to form a new absolute URL here
1299 */ 1328 */
1300 if (!uri.scheme.first && !uri.hostText.first) { 1329 if (!uri.scheme.first && !uri.hostText.first) {
1301 new_host = strdup (host_name ? host_name : server_address); 1330 new_host = strdup (host_name ? host_name : server_address);
1331 new_port = server_port;
1332 if(use_ssl)
1333 uri_string (uri.scheme, "https", DEFAULT_BUFFER_SIZE);
1302 } else { 1334 } else {
1303 new_host = strdup (uri_string (uri.hostText, buf, DEFAULT_BUFFER_SIZE)); 1335 new_host = strdup (uri_string (uri.hostText, buf, DEFAULT_BUFFER_SIZE));
1304 } 1336 }
@@ -1380,7 +1412,9 @@ process_arguments (int argc, char **argv)
1380 CA_CERT_OPTION, 1412 CA_CERT_OPTION,
1381 HTTP_VERSION_OPTION, 1413 HTTP_VERSION_OPTION,
1382 AUTOMATIC_DECOMPRESSION, 1414 AUTOMATIC_DECOMPRESSION,
1383 COOKIE_JAR 1415 COOKIE_JAR,
1416 HAPROXY_PROTOCOL,
1417 STATE_REGEX
1384 }; 1418 };
1385 1419
1386 int option = 0; 1420 int option = 0;
@@ -1419,6 +1453,7 @@ process_arguments (int argc, char **argv)
1419 {"content-type", required_argument, 0, 'T'}, 1453 {"content-type", required_argument, 0, 'T'},
1420 {"pagesize", required_argument, 0, 'm'}, 1454 {"pagesize", required_argument, 0, 'm'},
1421 {"invert-regex", no_argument, NULL, INVERT_REGEX}, 1455 {"invert-regex", no_argument, NULL, INVERT_REGEX},
1456 {"state-regex", required_argument, 0, STATE_REGEX},
1422 {"use-ipv4", no_argument, 0, '4'}, 1457 {"use-ipv4", no_argument, 0, '4'},
1423 {"use-ipv6", no_argument, 0, '6'}, 1458 {"use-ipv6", no_argument, 0, '6'},
1424 {"extended-perfdata", no_argument, 0, 'E'}, 1459 {"extended-perfdata", no_argument, 0, 'E'},
@@ -1427,6 +1462,7 @@ process_arguments (int argc, char **argv)
1427 {"http-version", required_argument, 0, HTTP_VERSION_OPTION}, 1462 {"http-version", required_argument, 0, HTTP_VERSION_OPTION},
1428 {"enable-automatic-decompression", no_argument, 0, AUTOMATIC_DECOMPRESSION}, 1463 {"enable-automatic-decompression", no_argument, 0, AUTOMATIC_DECOMPRESSION},
1429 {"cookie-jar", required_argument, 0, COOKIE_JAR}, 1464 {"cookie-jar", required_argument, 0, COOKIE_JAR},
1465 {"haproxy-protocol", no_argument, 0, HAPROXY_PROTOCOL},
1430 {0, 0, 0, 0} 1466 {0, 0, 0, 0}
1431 }; 1467 };
1432 1468
@@ -1694,7 +1730,7 @@ process_arguments (int argc, char **argv)
1694 else { 1730 else {
1695 max_depth = atoi (optarg); 1731 max_depth = atoi (optarg);
1696 } 1732 }
1697 break; 1733 break;
1698 case 'f': /* onredirect */ 1734 case 'f': /* onredirect */
1699 if (!strcmp (optarg, "ok")) 1735 if (!strcmp (optarg, "ok"))
1700 onredirect = STATE_OK; 1736 onredirect = STATE_OK;
@@ -1753,6 +1789,13 @@ process_arguments (int argc, char **argv)
1753 case INVERT_REGEX: 1789 case INVERT_REGEX:
1754 invert_regex = true; 1790 invert_regex = true;
1755 break; 1791 break;
1792 case STATE_REGEX:
1793 if (!strcasecmp (optarg, "critical"))
1794 state_regex = STATE_CRITICAL;
1795 else if (!strcasecmp (optarg, "warning"))
1796 state_regex = STATE_WARNING;
1797 else usage2 (_("Invalid state-regex option"), optarg);
1798 break;
1756 case '4': 1799 case '4':
1757 address_family = AF_INET; 1800 address_family = AF_INET;
1758 break; 1801 break;
@@ -1837,6 +1880,9 @@ process_arguments (int argc, char **argv)
1837 case COOKIE_JAR: 1880 case COOKIE_JAR:
1838 cookie_jar_file = optarg; 1881 cookie_jar_file = optarg;
1839 break; 1882 break;
1883 case HAPROXY_PROTOCOL:
1884 haproxy_protocol = true;
1885 break;
1840 case '?': 1886 case '?':
1841 /* print short usage statement if args not parsable */ 1887 /* print short usage statement if args not parsable */
1842 usage5 (); 1888 usage5 ();
@@ -1977,8 +2023,11 @@ print_help (void)
1977 printf (" %s\n", _("Note: SNI is not supported in libcurl before 7.18.1")); 2023 printf (" %s\n", _("Note: SNI is not supported in libcurl before 7.18.1"));
1978#endif 2024#endif
1979 printf (" %s\n", "-C, --certificate=INTEGER[,INTEGER]"); 2025 printf (" %s\n", "-C, --certificate=INTEGER[,INTEGER]");
1980 printf (" %s\n", _("Minimum number of days a certificate has to be valid. Port defaults to 443")); 2026 printf (" %s\n", _("Minimum number of days a certificate has to be valid. Port defaults to 443."));
1981 printf (" %s\n", _("(when this option is used the URL is not checked by default. You can use")); 2027 printf (" %s\n", _("A STATE_WARNING is returned if the certificate has a validity less than the"));
2028 printf (" %s\n", _("first agument's value. If there is a second argument and the certificate's"));
2029 printf (" %s\n", _("validity is less than its value, a STATE_CRITICAL is returned."));
2030 printf (" %s\n", _("(When this option is used the URL is not checked by default. You can use"));
1982 printf (" %s\n", _(" --continue-after-certificate to override this behavior)")); 2031 printf (" %s\n", _(" --continue-after-certificate to override this behavior)"));
1983 printf (" %s\n", "--continue-after-certificate"); 2032 printf (" %s\n", "--continue-after-certificate");
1984 printf (" %s\n", _("Allows the HTTP check to continue after performing the certificate check.")); 2033 printf (" %s\n", _("Allows the HTTP check to continue after performing the certificate check."));
@@ -2007,7 +2056,7 @@ print_help (void)
2007 printf (" %s\n", "-u, --url=PATH"); 2056 printf (" %s\n", "-u, --url=PATH");
2008 printf (" %s\n", _("URL to GET or POST (default: /)")); 2057 printf (" %s\n", _("URL to GET or POST (default: /)"));
2009 printf (" %s\n", "-P, --post=STRING"); 2058 printf (" %s\n", "-P, --post=STRING");
2010 printf (" %s\n", _("URL encoded http POST data")); 2059 printf (" %s\n", _("URL decoded http POST data"));
2011 printf (" %s\n", "-j, --method=STRING (for example: HEAD, OPTIONS, TRACE, PUT, DELETE, CONNECT)"); 2060 printf (" %s\n", "-j, --method=STRING (for example: HEAD, OPTIONS, TRACE, PUT, DELETE, CONNECT)");
2012 printf (" %s\n", _("Set HTTP method.")); 2061 printf (" %s\n", _("Set HTTP method."));
2013 printf (" %s\n", "-N, --no-body"); 2062 printf (" %s\n", "-N, --no-body");
@@ -2025,7 +2074,10 @@ print_help (void)
2025 printf (" %s\n", "-R, --eregi=STRING"); 2074 printf (" %s\n", "-R, --eregi=STRING");
2026 printf (" %s\n", _("Search page for case-insensitive regex STRING")); 2075 printf (" %s\n", _("Search page for case-insensitive regex STRING"));
2027 printf (" %s\n", "--invert-regex"); 2076 printf (" %s\n", "--invert-regex");
2028 printf (" %s\n", _("Return CRITICAL if found, OK if not\n")); 2077 printf (" %s\n", _("Return STATE if found, OK if not (STATE is CRITICAL, per default)"));
2078 printf (" %s\n", _("can be changed with --state--regex)"));
2079 printf (" %s\n", "--state-regex=STATE");
2080 printf (" %s\n", _("Return STATE if regex is found, OK if not. STATE can be one of \"critical\",\"warning\""));
2029 printf (" %s\n", "-a, --authorization=AUTH_PAIR"); 2081 printf (" %s\n", "-a, --authorization=AUTH_PAIR");
2030 printf (" %s\n", _("Username:password on sites with basic authentication")); 2082 printf (" %s\n", _("Username:password on sites with basic authentication"));
2031 printf (" %s\n", "-b, --proxy-authorization=AUTH_PAIR"); 2083 printf (" %s\n", "-b, --proxy-authorization=AUTH_PAIR");
@@ -2056,7 +2108,9 @@ print_help (void)
2056 printf (" %s\n", _("1.0 = HTTP/1.0, 1.1 = HTTP/1.1, 2.0 = HTTP/2 (HTTP/2 will fail without -S)")); 2108 printf (" %s\n", _("1.0 = HTTP/1.0, 1.1 = HTTP/1.1, 2.0 = HTTP/2 (HTTP/2 will fail without -S)"));
2057 printf (" %s\n", "--enable-automatic-decompression"); 2109 printf (" %s\n", "--enable-automatic-decompression");
2058 printf (" %s\n", _("Enable automatic decompression of body (CURLOPT_ACCEPT_ENCODING).")); 2110 printf (" %s\n", _("Enable automatic decompression of body (CURLOPT_ACCEPT_ENCODING)."));
2059 printf (" %s\n", "---cookie-jar=FILE"); 2111 printf(" %s\n", "--haproxy-protocol");
2112 printf(" %s\n", _("Send HAProxy proxy protocol v1 header (CURLOPT_HAPROXYPROTOCOL)."));
2113 printf (" %s\n", "--cookie-jar=FILE");
2060 printf (" %s\n", _("Store cookies in the cookie jar and send them out when requested.")); 2114 printf (" %s\n", _("Store cookies in the cookie jar and send them out when requested."));
2061 printf ("\n"); 2115 printf ("\n");
2062 2116
@@ -2140,7 +2194,7 @@ print_usage (void)
2140 printf (" [-b proxy_auth] [-f <ok|warning|critical|follow|sticky|stickyport|curl>]\n"); 2194 printf (" [-b proxy_auth] [-f <ok|warning|critical|follow|sticky|stickyport|curl>]\n");
2141 printf (" [-e <expect>] [-d string] [-s string] [-l] [-r <regex> | -R <case-insensitive regex>]\n"); 2195 printf (" [-e <expect>] [-d string] [-s string] [-l] [-r <regex> | -R <case-insensitive regex>]\n");
2142 printf (" [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>]\n"); 2196 printf (" [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>]\n");
2143 printf (" [-A string] [-k string] [-S <version>] [--sni]\n"); 2197 printf (" [-A string] [-k string] [-S <version>] [--sni] [--haproxy-protocol]\n");
2144 printf (" [-T <content-type>] [-j method]\n"); 2198 printf (" [-T <content-type>] [-j method]\n");
2145 printf (" [--http-version=<version>] [--enable-automatic-decompression]\n"); 2199 printf (" [--http-version=<version>] [--enable-automatic-decompression]\n");
2146 printf (" [--cookie-jar=<cookie jar file>\n"); 2200 printf (" [--cookie-jar=<cookie jar file>\n");
@@ -2151,8 +2205,6 @@ print_usage (void)
2151 printf ("%s\n", _("In the first form, make an HTTP request.")); 2205 printf ("%s\n", _("In the first form, make an HTTP request."));
2152 printf ("%s\n\n", _("In the second form, connect to the server and check the TLS certificate.")); 2206 printf ("%s\n\n", _("In the second form, connect to the server and check the TLS certificate."));
2153#endif 2207#endif
2154 printf ("%s\n", _("WARNING: check_curl is experimental. Please use"));
2155 printf ("%s\n\n", _("check_http if you need a stable version."));
2156} 2208}
2157 2209
2158void 2210void
@@ -2171,8 +2223,7 @@ curlhelp_initwritebuffer (curlhelp_write_curlbuf *buf)
2171 return 0; 2223 return 0;
2172} 2224}
2173 2225
2174int 2226size_t curlhelp_buffer_write_callback (void *buffer, size_t size, size_t nmemb, void *stream)
2175curlhelp_buffer_write_callback (void *buffer, size_t size, size_t nmemb, void *stream)
2176{ 2227{
2177 curlhelp_write_curlbuf *buf = (curlhelp_write_curlbuf *)stream; 2228 curlhelp_write_curlbuf *buf = (curlhelp_write_curlbuf *)stream;
2178 2229
@@ -2192,8 +2243,7 @@ curlhelp_buffer_write_callback (void *buffer, size_t size, size_t nmemb, void *s
2192 return (int)(size * nmemb); 2243 return (int)(size * nmemb);
2193} 2244}
2194 2245
2195int 2246size_t curlhelp_buffer_read_callback(void *buffer, size_t size, size_t nmemb, void *stream)
2196curlhelp_buffer_read_callback (void *buffer, size_t size, size_t nmemb, void *stream)
2197{ 2247{
2198 curlhelp_read_curlbuf *buf = (curlhelp_read_curlbuf *)stream; 2248 curlhelp_read_curlbuf *buf = (curlhelp_read_curlbuf *)stream;
2199 2249
@@ -2366,8 +2416,7 @@ remove_newlines (char *s)
2366char * 2416char *
2367get_header_value (const struct phr_header* headers, const size_t nof_headers, const char* header) 2417get_header_value (const struct phr_header* headers, const size_t nof_headers, const char* header)
2368{ 2418{
2369 int i; 2419 for(size_t i = 0; i < nof_headers; i++ ) {
2370 for( i = 0; i < nof_headers; i++ ) {
2371 if(headers[i].name != NULL && strncasecmp( header, headers[i].name, max( headers[i].name_len, 4 ) ) == 0 ) { 2420 if(headers[i].name != NULL && strncasecmp( header, headers[i].name, max( headers[i].name_len, 4 ) ) == 0 ) {
2372 return strndup( headers[i].value, headers[i].value_len ); 2421 return strndup( headers[i].value, headers[i].value_len );
2373 } 2422 }
@@ -2390,6 +2439,10 @@ check_document_dates (const curlhelp_write_curlbuf *header_buf, char (*msg)[DEFA
2390 &status_line.http_major, &status_line.http_minor, &status_line.http_code, &status_line.msg, &msglen, 2439 &status_line.http_major, &status_line.http_minor, &status_line.http_code, &status_line.msg, &msglen,
2391 headers, &nof_headers, 0); 2440 headers, &nof_headers, 0);
2392 2441
2442 if (res == -1) {
2443 die (STATE_UNKNOWN, _("HTTP UNKNOWN - Failed to parse Response\n"));
2444 }
2445
2393 server_date = get_header_value (headers, nof_headers, "date"); 2446 server_date = get_header_value (headers, nof_headers, "date");
2394 document_date = get_header_value (headers, nof_headers, "last-modified"); 2447 document_date = get_header_value (headers, nof_headers, "last-modified");
2395 2448
@@ -2465,9 +2518,7 @@ check_document_dates (const curlhelp_write_curlbuf *header_buf, char (*msg)[DEFA
2465int 2518int
2466get_content_length (const curlhelp_write_curlbuf* header_buf, const curlhelp_write_curlbuf* body_buf) 2519get_content_length (const curlhelp_write_curlbuf* header_buf, const curlhelp_write_curlbuf* body_buf)
2467{ 2520{
2468 const char *s; 2521 size_t content_length = 0;
2469 int content_length = 0;
2470 char *copy;
2471 struct phr_header headers[255]; 2522 struct phr_header headers[255];
2472 size_t nof_headers = 255; 2523 size_t nof_headers = 255;
2473 size_t msglen; 2524 size_t msglen;
@@ -2478,6 +2529,10 @@ get_content_length (const curlhelp_write_curlbuf* header_buf, const curlhelp_wri
2478 &status_line.http_major, &status_line.http_minor, &status_line.http_code, &status_line.msg, &msglen, 2529 &status_line.http_major, &status_line.http_minor, &status_line.http_code, &status_line.msg, &msglen,
2479 headers, &nof_headers, 0); 2530 headers, &nof_headers, 0);
2480 2531
2532 if (res == -1) {
2533 die (STATE_UNKNOWN, _("HTTP UNKNOWN - Failed to parse Response\n"));
2534 }
2535
2481 content_length_s = get_header_value (headers, nof_headers, "content-length"); 2536 content_length_s = get_header_value (headers, nof_headers, "content-length");
2482 if (!content_length_s) { 2537 if (!content_length_s) {
2483 return header_buf->buflen + body_buf->buflen; 2538 return header_buf->buflen + body_buf->buflen;
diff --git a/plugins/check_dbi.c b/plugins/check_dbi.c
index c24ca248..29c85206 100644
--- a/plugins/check_dbi.c
+++ b/plugins/check_dbi.c
@@ -141,7 +141,7 @@ main (int argc, char **argv)
141 if (verbose > 2) 141 if (verbose > 2)
142 printf ("Initializing DBI\n"); 142 printf ("Initializing DBI\n");
143 143
144 dbi_inst *instance_p; 144 dbi_inst *instance_p = { 0 };
145 145
146 if (dbi_initialize_r(NULL, instance_p) < 0) { 146 if (dbi_initialize_r(NULL, instance_p) < 0) {
147 printf ("UNKNOWN - failed to initialize DBI; possibly you don't have any drivers installed.\n"); 147 printf ("UNKNOWN - failed to initialize DBI; possibly you don't have any drivers installed.\n");
diff --git a/plugins/check_dig.c b/plugins/check_dig.c
index 5d85ae26..be7a6101 100644
--- a/plugins/check_dig.c
+++ b/plugins/check_dig.c
@@ -56,7 +56,7 @@ char *expected_address = NULL;
56char *dns_server = NULL; 56char *dns_server = NULL;
57char *dig_args = ""; 57char *dig_args = "";
58char *query_transport = ""; 58char *query_transport = "";
59int verbose = FALSE; 59bool verbose = false;
60int server_port = DEFAULT_PORT; 60int server_port = DEFAULT_PORT;
61int number_tries = DEFAULT_TRIES; 61int number_tries = DEFAULT_TRIES;
62double warning_interval = UNDEFINED; 62double warning_interval = UNDEFINED;
@@ -176,11 +176,11 @@ main (int argc, char **argv)
176 state_text (result), elapsed_time, 176 state_text (result), elapsed_time,
177 msg ? msg : _("Probably a non-existent host/domain"), 177 msg ? msg : _("Probably a non-existent host/domain"),
178 fperfdata("time", elapsed_time, "s", 178 fperfdata("time", elapsed_time, "s",
179 (warning_interval>UNDEFINED?TRUE:FALSE), 179 (warning_interval>UNDEFINED ? true:false),
180 warning_interval, 180 warning_interval,
181 (critical_interval>UNDEFINED?TRUE:FALSE), 181 (critical_interval>UNDEFINED ? true:false),
182 critical_interval, 182 critical_interval,
183 TRUE, 0, FALSE, 0)); 183 true, 0, false, 0));
184 return result; 184 return result;
185} 185}
186 186
@@ -270,7 +270,7 @@ process_arguments (int argc, char **argv)
270 dig_args = strdup(optarg); 270 dig_args = strdup(optarg);
271 break; 271 break;
272 case 'v': /* verbose */ 272 case 'v': /* verbose */
273 verbose = TRUE; 273 verbose = true;
274 break; 274 break;
275 case 'T': 275 case 'T':
276 record_type = optarg; 276 record_type = optarg;
diff --git a/plugins/check_disk.c b/plugins/check_disk.c
index 05e55022..b3dd301c 100644
--- a/plugins/check_disk.c
+++ b/plugins/check_disk.c
@@ -46,7 +46,7 @@ const char *email = "devel@monitoring-plugins.org";
46#include <stdarg.h> 46#include <stdarg.h>
47#include "fsusage.h" 47#include "fsusage.h"
48#include "mountlist.h" 48#include "mountlist.h"
49#include "intprops.h" /* necessary for TYPE_MAXIMUM */ 49#include <float.h>
50#if HAVE_LIMITS_H 50#if HAVE_LIMITS_H
51# include <limits.h> 51# include <limits.h>
52#endif 52#endif
@@ -93,11 +93,11 @@ static int stat_remote_fs = 0;
93 93
94/* Linked list of filesystem types to omit. 94/* Linked list of filesystem types to omit.
95 If the list is empty, don't exclude any types. */ 95 If the list is empty, don't exclude any types. */
96static struct name_list *fs_exclude_list; 96static struct regex_list *fs_exclude_list = NULL;
97 97
98/* Linked list of filesystem types to check. 98/* Linked list of filesystem types to check.
99 If the list is empty, include all types. */ 99 If the list is empty, include all types. */
100static struct name_list *fs_include_list; 100static struct regex_list *fs_include_list;
101 101
102static struct name_list *dp_exclude_list; 102static struct name_list *dp_exclude_list;
103 103
@@ -112,52 +112,48 @@ enum
112{ 112{
113 SYNC_OPTION = CHAR_MAX + 1, 113 SYNC_OPTION = CHAR_MAX + 1,
114 NO_SYNC_OPTION, 114 NO_SYNC_OPTION,
115 BLOCK_SIZE_OPTION, 115 BLOCK_SIZE_OPTION
116 IGNORE_MISSING
117}; 116};
118 117
119#ifdef _AIX 118#ifdef _AIX
120#pragma alloca 119#pragma alloca
121#endif 120#endif
122 121
123int process_arguments (int, char **); 122static int process_arguments (int, char **);
124void print_path (const char *mypath); 123static void set_all_thresholds (struct parameter_list *path);
125void set_all_thresholds (struct parameter_list *path); 124static void print_help (void);
126int validate_arguments (uintmax_t, uintmax_t, double, double, double, double, char *);
127void print_help (void);
128void print_usage (void); 125void print_usage (void);
129double calculate_percent(uintmax_t, uintmax_t); 126static double calculate_percent(uintmax_t, uintmax_t);
130bool stat_path (struct parameter_list *p); 127static bool stat_path (struct parameter_list *p);
131void get_stats (struct parameter_list *p, struct fs_usage *fsp); 128static void get_stats (struct parameter_list *p, struct fs_usage *fsp);
132void get_path_stats (struct parameter_list *p, struct fs_usage *fsp); 129static void get_path_stats (struct parameter_list *p, struct fs_usage *fsp);
133 130
134char *exclude_device; 131static char *units;
135char *units; 132static uintmax_t mult = 1024 * 1024;
136uintmax_t mult = 1024 * 1024; 133static int verbose = 0;
137int verbose = 0; 134static bool erronly = false;
138int erronly = FALSE; 135static bool display_mntp = false;
139int display_mntp = FALSE; 136static bool exact_match = false;
140int exact_match = FALSE; 137static bool ignore_missing = false;
141bool ignore_missing = false; 138static bool freespace_ignore_reserved = false;
142int freespace_ignore_reserved = FALSE; 139static bool display_inodes_perfdata = false;
143int display_inodes_perfdata = FALSE; 140static char *warn_freespace_units = NULL;
144char *warn_freespace_units = NULL; 141static char *crit_freespace_units = NULL;
145char *crit_freespace_units = NULL; 142static char *warn_freespace_percent = NULL;
146char *warn_freespace_percent = NULL; 143static char *crit_freespace_percent = NULL;
147char *crit_freespace_percent = NULL; 144static char *warn_usedspace_units = NULL;
148char *warn_usedspace_units = NULL; 145static char *crit_usedspace_units = NULL;
149char *crit_usedspace_units = NULL; 146static char *warn_usedspace_percent = NULL;
150char *warn_usedspace_percent = NULL; 147static char *crit_usedspace_percent = NULL;
151char *crit_usedspace_percent = NULL; 148static char *warn_usedinodes_percent = NULL;
152char *warn_usedinodes_percent = NULL; 149static char *crit_usedinodes_percent = NULL;
153char *crit_usedinodes_percent = NULL; 150static char *warn_freeinodes_percent = NULL;
154char *warn_freeinodes_percent = NULL; 151static char *crit_freeinodes_percent = NULL;
155char *crit_freeinodes_percent = NULL; 152static bool path_selected = false;
156int path_selected = FALSE; 153static bool path_ignored = false;
157bool path_ignored = false; 154static char *group = NULL;
158char *group = NULL; 155static struct stat *stat_buf;
159struct stat *stat_buf; 156static struct name_list *seen = NULL;
160struct name_list *seen = NULL;
161 157
162 158
163int 159int
@@ -205,7 +201,7 @@ main (int argc, char **argv)
205 /* If a list of paths has not been selected, find entire 201 /* If a list of paths has not been selected, find entire
206 mount list and create list of paths 202 mount list and create list of paths
207 */ 203 */
208 if (path_selected == FALSE && path_ignored == false) { 204 if (path_selected == false && path_ignored == false) {
209 for (me = mount_list; me; me = me->me_next) { 205 for (me = mount_list; me; me = me->me_next) {
210 if (! (path = np_find_parameter(path_select_list, me->me_mountdir))) { 206 if (! (path = np_find_parameter(path_select_list, me->me_mountdir))) {
211 path = np_add_parameter(&path_select_list, me->me_mountdir); 207 path = np_add_parameter(&path_select_list, me->me_mountdir);
@@ -300,7 +296,7 @@ main (int argc, char **argv)
300 } else if (me->me_dummy && !show_all_fs) { 296 } else if (me->me_dummy && !show_all_fs) {
301 continue; 297 continue;
302 /* Skip excluded fstypes */ 298 /* Skip excluded fstypes */
303 } else if (fs_exclude_list && np_find_name (fs_exclude_list, me->me_type)) { 299 } else if (fs_exclude_list && np_find_regmatch (fs_exclude_list, me->me_type)) {
304 continue; 300 continue;
305 /* Skip excluded fs's */ 301 /* Skip excluded fs's */
306 } else if (dp_exclude_list && 302 } else if (dp_exclude_list &&
@@ -308,7 +304,7 @@ main (int argc, char **argv)
308 np_find_name (dp_exclude_list, me->me_mountdir))) { 304 np_find_name (dp_exclude_list, me->me_mountdir))) {
309 continue; 305 continue;
310 /* Skip not included fstypes */ 306 /* Skip not included fstypes */
311 } else if (fs_include_list && !np_find_name (fs_include_list, me->me_type)) { 307 } else if (fs_include_list && !np_find_regmatch(fs_include_list, me->me_type)) {
312 continue; 308 continue;
313 } 309 }
314 } 310 }
@@ -326,7 +322,7 @@ main (int argc, char **argv)
326 get_stats (path, &fsp); 322 get_stats (path, &fsp);
327 323
328 if (verbose >= 3) { 324 if (verbose >= 3) {
329 printf ("For %s, used_pct=%g free_pct=%g used_units=%lu free_units=%lu total_units=%lu used_inodes_pct=%g free_inodes_pct=%g fsp.fsu_blocksize=%lu mult=%lu\n", 325 printf ("For %s, used_pct=%f free_pct=%f used_units=%lu free_units=%lu total_units=%lu used_inodes_pct=%f free_inodes_pct=%f fsp.fsu_blocksize=%lu mult=%lu\n",
330 me->me_mountdir, 326 me->me_mountdir,
331 path->dused_pct, 327 path->dused_pct,
332 path->dfree_pct, 328 path->dfree_pct,
@@ -396,10 +392,10 @@ main (int argc, char **argv)
396 perfdata_uint64 ( 392 perfdata_uint64 (
397 (!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir, 393 (!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir,
398 path->dused_units * mult, "B", 394 path->dused_units * mult, "B",
399 (warning_high_tide == UINT64_MAX ? FALSE : TRUE), warning_high_tide, 395 (warning_high_tide == UINT64_MAX ? false : true), warning_high_tide,
400 (critical_high_tide == UINT64_MAX ? FALSE : TRUE), critical_high_tide, 396 (critical_high_tide == UINT64_MAX ? false : true), critical_high_tide,
401 TRUE, 0, 397 true, 0,
402 TRUE, path->dtotal_units * mult)); 398 true, path->dtotal_units * mult));
403 399
404 if (display_inodes_perfdata) { 400 if (display_inodes_perfdata) {
405 /* *_high_tide must be reinitialized at each run */ 401 /* *_high_tide must be reinitialized at each run */
@@ -418,10 +414,10 @@ main (int argc, char **argv)
418 xasprintf (&perf, "%s %s", perf, 414 xasprintf (&perf, "%s %s", perf,
419 perfdata_uint64 (perf_ilabel, 415 perfdata_uint64 (perf_ilabel,
420 path->inodes_used, "", 416 path->inodes_used, "",
421 (warning_high_tide != UINT64_MAX ? TRUE : FALSE), warning_high_tide, 417 (warning_high_tide != UINT64_MAX ? true : false), warning_high_tide,
422 (critical_high_tide != UINT64_MAX ? TRUE : FALSE), critical_high_tide, 418 (critical_high_tide != UINT64_MAX ? true : false), critical_high_tide,
423 TRUE, 0, 419 true, 0,
424 TRUE, path->inodes_total)); 420 true, path->inodes_total));
425 } 421 }
426 422
427 if (disk_result==STATE_OK && erronly && !verbose) 423 if (disk_result==STATE_OK && erronly && !verbose)
@@ -432,7 +428,7 @@ main (int argc, char **argv)
432 } else { 428 } else {
433 xasprintf(&flag_header, ""); 429 xasprintf(&flag_header, "");
434 } 430 }
435 xasprintf (&output, "%s%s %s %llu%s (%.0f%%", 431 xasprintf (&output, "%s%s %s %llu%s (%.1f%%",
436 output, flag_header, 432 output, flag_header,
437 (!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir, 433 (!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir,
438 path->dfree_units, 434 path->dfree_units,
@@ -452,7 +448,7 @@ main (int argc, char **argv)
452 448
453 if (strcmp(output, "") == 0 && ! erronly) { 449 if (strcmp(output, "") == 0 && ! erronly) {
454 preamble = ""; 450 preamble = "";
455 xasprintf (&output, " - No disks were found for provided parameters;"); 451 xasprintf (&output, " - No disks were found for provided parameters");
456 } 452 }
457 453
458 printf ("DISK %s%s%s%s%s|%s\n", state_text (result), ((erronly && result==STATE_OK)) ? "" : preamble, output, (strcmp(ignored, "") == 0) ? "" : ignored_preamble, ignored, perf); 454 printf ("DISK %s%s%s%s%s|%s\n", state_text (result), ((erronly && result==STATE_OK)) ? "" : preamble, output, (strcmp(ignored, "") == 0) ? "" : ignored_preamble, ignored, perf);
@@ -462,24 +458,8 @@ main (int argc, char **argv)
462 458
463double calculate_percent(uintmax_t value, uintmax_t total) { 459double calculate_percent(uintmax_t value, uintmax_t total) {
464 double pct = -1; 460 double pct = -1;
465 /* I don't understand the below, but it is taken from coreutils' df */ 461 if(value <= DBL_MAX && total != 0) {
466 /* Seems to be calculating pct, in the best possible way */ 462 pct = (double)value / total * 100.0;
467 if (value <= TYPE_MAXIMUM(uintmax_t) / 100
468 && total != 0) {
469 uintmax_t u100 = value * 100;
470 pct = u100 / total + (u100 % total != 0);
471 } else {
472 /* Possible rounding errors - see coreutils' df for more explanation */
473 double u = value;
474 double t = total;
475 if (t) {
476 long int lipct = pct = u * 100 / t;
477 double ipct = lipct;
478
479 /* Like 'pct = ceil (dpct);', but without ceil - from coreutils again */
480 if (ipct - 1 < pct && pct <= ipct + 1)
481 pct = ipct + (ipct < pct);
482 }
483 } 463 }
484 return pct; 464 return pct;
485} 465}
@@ -524,7 +504,7 @@ process_arguments (int argc, char **argv)
524 {"ignore-ereg-partition", required_argument, 0, 'i'}, 504 {"ignore-ereg-partition", required_argument, 0, 'i'},
525 {"ignore-eregi-path", required_argument, 0, 'I'}, 505 {"ignore-eregi-path", required_argument, 0, 'I'},
526 {"ignore-eregi-partition", required_argument, 0, 'I'}, 506 {"ignore-eregi-partition", required_argument, 0, 'I'},
527 {"ignore-missing", no_argument, 0, IGNORE_MISSING}, 507 {"ignore-missing", no_argument, 0, 'n'},
528 {"local", no_argument, 0, 'l'}, 508 {"local", no_argument, 0, 'l'},
529 {"stat-remote-fs", no_argument, 0, 'L'}, 509 {"stat-remote-fs", no_argument, 0, 'L'},
530 {"iperfdata", no_argument, 0, 'P'}, 510 {"iperfdata", no_argument, 0, 'P'},
@@ -543,14 +523,14 @@ process_arguments (int argc, char **argv)
543 if (argc < 2) 523 if (argc < 2)
544 return ERROR; 524 return ERROR;
545 525
546 np_add_name(&fs_exclude_list, "iso9660"); 526 np_add_regex(&fs_exclude_list, "iso9660", REG_EXTENDED);
547 527
548 for (c = 1; c < argc; c++) 528 for (c = 1; c < argc; c++)
549 if (strcmp ("-to", argv[c]) == 0) 529 if (strcmp ("-to", argv[c]) == 0)
550 strcpy (argv[c], "-t"); 530 strcpy (argv[c], "-t");
551 531
552 while (1) { 532 while (1) {
553 c = getopt_long (argc, argv, "+?VqhvefCt:c:w:K:W:u:p:x:X:N:mklLPg:R:r:i:I:MEA", longopts, &option); 533 c = getopt_long (argc, argv, "+?VqhvefCt:c:w:K:W:u:p:x:X:N:mklLPg:R:r:i:I:MEAn", longopts, &option);
554 534
555 if (c == -1 || c == EOF) 535 if (c == -1 || c == EOF)
556 break; 536 break;
@@ -567,6 +547,10 @@ process_arguments (int argc, char **argv)
567 547
568 /* See comments for 'c' */ 548 /* See comments for 'c' */
569 case 'w': /* warning threshold */ 549 case 'w': /* warning threshold */
550 if (!is_percentage_expression(optarg) && !is_numeric(optarg)) {
551 die(STATE_UNKNOWN, "Argument for --warning invalid or missing: %s\n", optarg);
552 }
553
570 if (strstr(optarg, "%")) { 554 if (strstr(optarg, "%")) {
571 if (*optarg == '@') { 555 if (*optarg == '@') {
572 warn_freespace_percent = optarg; 556 warn_freespace_percent = optarg;
@@ -588,6 +572,10 @@ process_arguments (int argc, char **argv)
588 force @ at the beginning of the range, so that it is backwards compatible 572 force @ at the beginning of the range, so that it is backwards compatible
589 */ 573 */
590 case 'c': /* critical threshold */ 574 case 'c': /* critical threshold */
575 if (!is_percentage_expression(optarg) && !is_numeric(optarg)) {
576 die(STATE_UNKNOWN, "Argument for --critical invalid or missing: %s\n", optarg);
577 }
578
591 if (strstr(optarg, "%")) { 579 if (strstr(optarg, "%")) {
592 if (*optarg == '@') { 580 if (*optarg == '@') {
593 crit_freespace_percent = optarg; 581 crit_freespace_percent = optarg;
@@ -710,34 +698,42 @@ process_arguments (int argc, char **argv)
710 mount_list = read_file_system_list (0); 698 mount_list = read_file_system_list (0);
711 np_set_best_match(se, mount_list, exact_match); 699 np_set_best_match(se, mount_list, exact_match);
712 700
713 path_selected = TRUE; 701 path_selected = true;
714 break; 702 break;
715 case 'x': /* exclude path or partition */ 703 case 'x': /* exclude path or partition */
716 np_add_name(&dp_exclude_list, optarg); 704 np_add_name(&dp_exclude_list, optarg);
717 break; 705 break;
718 case 'X': /* exclude file system type */ 706 case 'X': /* exclude file system type */
719 np_add_name(&fs_exclude_list, optarg); 707 err = np_add_regex(&fs_exclude_list, optarg, REG_EXTENDED);
708 if (err != 0) {
709 regerror (err, &fs_exclude_list->regex, errbuf, MAX_INPUT_BUFFER);
710 die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"), _("Could not compile regular expression"), errbuf);
711 }
720 break; 712 break;
721 case 'N': /* include file system type */ 713 case 'N': /* include file system type */
722 np_add_name(&fs_include_list, optarg); 714 err = np_add_regex(&fs_include_list, optarg, REG_EXTENDED);
715 if (err != 0) {
716 regerror (err, &fs_exclude_list->regex, errbuf, MAX_INPUT_BUFFER);
717 die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"), _("Could not compile regular expression"), errbuf);
718 }
723 break; 719 break;
724 case 'v': /* verbose */ 720 case 'v': /* verbose */
725 verbose++; 721 verbose++;
726 break; 722 break;
727 case 'q': /* TODO: this function should eventually go away (removed 2007-09-20) */ 723 case 'q': /* TODO: this function should eventually go away (removed 2007-09-20) */
728 /* verbose--; **replaced by line below**. -q was only a broken way of implementing -e */ 724 /* verbose--; **replaced by line below**. -q was only a broken way of implementing -e */
729 erronly = TRUE; 725 erronly = true;
730 break; 726 break;
731 case 'e': 727 case 'e':
732 erronly = TRUE; 728 erronly = true;
733 break; 729 break;
734 case 'E': 730 case 'E':
735 if (path_selected) 731 if (path_selected)
736 die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set -E before selecting paths\n")); 732 die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set -E before selecting paths\n"));
737 exact_match = TRUE; 733 exact_match = true;
738 break; 734 break;
739 case 'f': 735 case 'f':
740 freespace_ignore_reserved = TRUE; 736 freespace_ignore_reserved = true;
741 break; 737 break;
742 case 'g': 738 case 'g':
743 if (path_selected) 739 if (path_selected)
@@ -784,7 +780,7 @@ process_arguments (int argc, char **argv)
784 cflags = default_cflags; 780 cflags = default_cflags;
785 break; 781 break;
786 782
787 case IGNORE_MISSING: 783 case 'n':
788 ignore_missing = true; 784 ignore_missing = true;
789 break; 785 break;
790 case 'A': 786 case 'A':
@@ -798,7 +794,7 @@ process_arguments (int argc, char **argv)
798 crit_freespace_percent || warn_usedspace_units || crit_usedspace_units || 794 crit_freespace_percent || warn_usedspace_units || crit_usedspace_units ||
799 warn_usedspace_percent || crit_usedspace_percent || warn_usedinodes_percent || 795 warn_usedspace_percent || crit_usedspace_percent || warn_usedinodes_percent ||
800 crit_usedinodes_percent || warn_freeinodes_percent || crit_freeinodes_percent )) { 796 crit_usedinodes_percent || warn_freeinodes_percent || crit_freeinodes_percent )) {
801 die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set a threshold value before using -r/-R\n")); 797 die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set a threshold value before using -r/-R/-A (--ereg-path/--eregi-path/--all)\n"));
802 } 798 }
803 799
804 err = regcomp(&re, optarg, cflags); 800 err = regcomp(&re, optarg, cflags);
@@ -809,7 +805,7 @@ process_arguments (int argc, char **argv)
809 805
810 for (me = mount_list; me; me = me->me_next) { 806 for (me = mount_list; me; me = me->me_next) {
811 if (np_regex_match_mount_entry(me, &re)) { 807 if (np_regex_match_mount_entry(me, &re)) {
812 fnd = TRUE; 808 fnd = true;
813 if (verbose >= 3) 809 if (verbose >= 3)
814 printf("%s %s matching expression %s\n", me->me_devname, me->me_mountdir, optarg); 810 printf("%s %s matching expression %s\n", me->me_devname, me->me_mountdir, optarg);
815 811
@@ -824,24 +820,24 @@ process_arguments (int argc, char **argv)
824 820
825 if (!fnd && ignore_missing == true) { 821 if (!fnd && ignore_missing == true) {
826 path_ignored = true; 822 path_ignored = true;
827 /* path_selected = TRUE;*/ 823 path_selected = true;
828 break; 824 break;
829 } else if (!fnd) 825 } else if (!fnd)
830 die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"), 826 die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"),
831 _("Regular expression did not match any path or disk"), optarg); 827 _("Regular expression did not match any path or disk"), optarg);
832 828
833 fnd = FALSE; 829 fnd = false;
834 path_selected = TRUE; 830 path_selected = true;
835 np_set_best_match(path_select_list, mount_list, exact_match); 831 np_set_best_match(path_select_list, mount_list, exact_match);
836 cflags = default_cflags; 832 cflags = default_cflags;
837 833
838 break; 834 break;
839 case 'M': /* display mountpoint */ 835 case 'M': /* display mountpoint */
840 display_mntp = TRUE; 836 display_mntp = true;
841 break; 837 break;
842 case 'C': 838 case 'C':
843 /* add all mount entries to path_select list if no partitions have been explicitly defined using -p */ 839 /* add all mount entries to path_select list if no partitions have been explicitly defined using -p */
844 if (path_selected == FALSE) { 840 if (path_selected == false) {
845 struct parameter_list *path; 841 struct parameter_list *path;
846 for (me = mount_list; me; me = me->me_next) { 842 for (me = mount_list; me; me = me->me_next) {
847 if (! (path = np_find_parameter(path_select_list, me->me_mountdir))) 843 if (! (path = np_find_parameter(path_select_list, me->me_mountdir)))
@@ -864,7 +860,7 @@ process_arguments (int argc, char **argv)
864 warn_freeinodes_percent = NULL; 860 warn_freeinodes_percent = NULL;
865 crit_freeinodes_percent = NULL; 861 crit_freeinodes_percent = NULL;
866 862
867 path_selected = FALSE; 863 path_selected = false;
868 group = NULL; 864 group = NULL;
869 break; 865 break;
870 case 'V': /* version */ 866 case 'V': /* version */
@@ -888,7 +884,7 @@ process_arguments (int argc, char **argv)
888 884
889 if (argc > c) { 885 if (argc > c) {
890 se = np_add_parameter(&path_select_list, strdup(argv[c++])); 886 se = np_add_parameter(&path_select_list, strdup(argv[c++]));
891 path_selected = TRUE; 887 path_selected = true;
892 set_all_thresholds(se); 888 set_all_thresholds(se);
893 } 889 }
894 890
@@ -897,21 +893,9 @@ process_arguments (int argc, char **argv)
897 mult = (uintmax_t)1024 * 1024; 893 mult = (uintmax_t)1024 * 1024;
898 } 894 }
899 895
900 return TRUE; 896 return true;
901}
902
903
904
905void
906print_path (const char *mypath)
907{
908 if (mypath == NULL)
909 printf ("\n");
910 else
911 printf (_(" for %s\n"), mypath);
912} 897}
913 898
914
915void 899void
916set_all_thresholds (struct parameter_list *path) 900set_all_thresholds (struct parameter_list *path)
917{ 901{
@@ -996,25 +980,33 @@ print_help (void)
996 printf (" %s\n", _("Regular expression to ignore selected path/partition (case insensitive) (may be repeated)")); 980 printf (" %s\n", _("Regular expression to ignore selected path/partition (case insensitive) (may be repeated)"));
997 printf (" %s\n", "-i, --ignore-ereg-path=PATH, --ignore-ereg-partition=PARTITION"); 981 printf (" %s\n", "-i, --ignore-ereg-path=PATH, --ignore-ereg-partition=PARTITION");
998 printf (" %s\n", _("Regular expression to ignore selected path or partition (may be repeated)")); 982 printf (" %s\n", _("Regular expression to ignore selected path or partition (may be repeated)"));
999 printf (" %s\n", "--ignore-missing"); 983 printf (" %s\n", "-n, --ignore-missing");
1000 printf (" %s\n", _("Return OK if no filesystem matches, filesystem does not exist or is inaccessible.")); 984 printf (" %s\n", _("Return OK if no filesystem matches, filesystem does not exist or is inaccessible."));
1001 printf (" %s\n", _("(Provide this option before -p / -r / --ereg-path if used)")); 985 printf (" %s\n", _("(Provide this option before -p / -r / --ereg-path if used)"));
1002 printf (UT_PLUG_TIMEOUT, DEFAULT_SOCKET_TIMEOUT); 986 printf (UT_PLUG_TIMEOUT, DEFAULT_SOCKET_TIMEOUT);
1003 printf (" %s\n", "-u, --units=STRING"); 987 printf (" %s\n", "-u, --units=STRING");
1004 printf (" %s\n", _("Choose bytes, kB, MB, GB, TB (default: MB)")); 988 printf (" %s\n", _("Choose bytes, kB, MB, GB, TB (default: MB)"));
1005 printf (UT_VERBOSE); 989 printf (UT_VERBOSE);
1006 printf (" %s\n", "-X, --exclude-type=TYPE"); 990 printf (" %s\n", "-X, --exclude-type=TYPE_REGEX");
1007 printf (" %s\n", _("Ignore all filesystems of indicated type (may be repeated)")); 991 printf (" %s\n", _("Ignore all filesystems of types matching given regex(7) (may be repeated)"));
1008 printf (" %s\n", "-N, --include-type=TYPE"); 992 printf (" %s\n", "-N, --include-type=TYPE_REGEX");
1009 printf (" %s\n", _("Check only filesystems of indicated type (may be repeated)")); 993 printf (" %s\n", _("Check only filesystems where the type matches this given regex(7) (may be repeated)"));
994
995 printf ("\n");
996 printf ("%s\n", _("General usage hints:"));
997 printf (" %s\n", _("- Arguments are positional! \"-w 5 -c 1 -p /foo -w6 -c2 -p /bar\" is not the same as"));
998 printf (" %s\n", _("\"-w 5 -c 1 -p /bar w6 -c2 -p /foo\"."));
999 printf (" %s\n", _("- The syntax is broadly: \"{thresholds a} {paths a} -C {thresholds b} {thresholds b} ...\""));
1000
1001
1010 1002
1011 printf ("\n"); 1003 printf ("\n");
1012 printf ("%s\n", _("Examples:")); 1004 printf ("%s\n", _("Examples:"));
1013 printf (" %s\n", "check_disk -w 10% -c 5% -p /tmp -p /var -C -w 100000 -c 50000 -p /"); 1005 printf (" %s\n", "check_disk -w 10% -c 5% -p /tmp -p /var -C -w 100000 -c 50000 -p /");
1014 printf (" %s\n", _("Checks /tmp and /var at 10% and 5%, and / at 100MB and 50MB")); 1006 printf (" %s\n\n", _("Checks /tmp and /var at 10% and 5%, and / at 100MB and 50MB"));
1015 printf (" %s\n", "check_disk -w 100 -c 50 -C -w 1000 -c 500 -g sidDATA -r '^/oracle/SID/data.*$'"); 1007 printf (" %s\n", "check_disk -w 100 -c 50 -C -w 1000 -c 500 -g sidDATA -r '^/oracle/SID/data.*$'");
1016 printf (" %s\n", _("Checks all filesystems not matching -r at 100M and 50M. The fs matching the -r regex")); 1008 printf (" %s\n", _("Checks all filesystems not matching -r at 100M and 50M. The fs matching the -r regex"));
1017 printf (" %s\n", _("are grouped which means the freespace thresholds are applied to all disks together")); 1009 printf (" %s\n\n", _("are grouped which means the freespace thresholds are applied to all disks together"));
1018 printf (" %s\n", "check_disk -w 100 -c 50 -C -w 1000 -c 500 -p /foo -C -w 5% -c 3% -p /bar"); 1010 printf (" %s\n", "check_disk -w 100 -c 50 -C -w 1000 -c 500 -p /foo -C -w 5% -c 3% -p /bar");
1019 printf (" %s\n", _("Checks /foo for 1000M/500M and /bar for 5/3%. All remaining volumes use 100M/50M")); 1011 printf (" %s\n", _("Checks /foo for 1000M/500M and /bar for 5/3%. All remaining volumes use 100M/50M"));
1020 1012
@@ -1027,9 +1019,9 @@ void
1027print_usage (void) 1019print_usage (void)
1028{ 1020{
1029 printf ("%s\n", _("Usage:")); 1021 printf ("%s\n", _("Usage:"));
1030 printf (" %s {-w absolute_limit |-w percentage_limit% | -W inode_percentage_limit } {-c absolute_limit|-c percentage_limit% | -K inode_percentage_limit } {-p path | -x device}\n", progname); 1022 printf (" %s {-w absolute_limit |-w percentage_limit%% | -W inode_percentage_limit } {-c absolute_limit|-c percentage_limit%% | -K inode_percentage_limit } {-p path | -x device}\n", progname);
1031 printf ("[-C] [-E] [-e] [-f] [-g group ] [-k] [-l] [-M] [-m] [-R path ] [-r path ]\n"); 1023 printf ("[-C] [-E] [-e] [-f] [-g group ] [-k] [-l] [-M] [-m] [-R path ] [-r path ]\n");
1032 printf ("[-t timeout] [-u unit] [-v] [-X type] [-N type]\n"); 1024 printf ("[-t timeout] [-u unit] [-v] [-X type_regex] [-N type]\n");
1033} 1025}
1034 1026
1035bool 1027bool
@@ -1115,7 +1107,7 @@ get_stats (struct parameter_list *p, struct fs_usage *fsp) {
1115 } 1107 }
1116 /* finally calculate percentages for either plain FS or summed up group */ 1108 /* finally calculate percentages for either plain FS or summed up group */
1117 p->dused_pct = calculate_percent( p->used, p->used + p->available ); /* used + available can never be > uintmax */ 1109 p->dused_pct = calculate_percent( p->used, p->used + p->available ); /* used + available can never be > uintmax */
1118 p->dfree_pct = 100 - p->dused_pct; 1110 p->dfree_pct = 100.0 - p->dused_pct;
1119 p->dused_inodes_percent = calculate_percent(p->inodes_total - p->inodes_free, p->inodes_total); 1111 p->dused_inodes_percent = calculate_percent(p->inodes_total - p->inodes_free, p->inodes_total);
1120 p->dfree_inodes_percent = 100 - p->dused_inodes_percent; 1112 p->dfree_inodes_percent = 100 - p->dused_inodes_percent;
1121 1113
diff --git a/plugins/check_dns.c b/plugins/check_dns.c
index 7ffce98b..468bc958 100644
--- a/plugins/check_dns.c
+++ b/plugins/check_dns.c
@@ -41,8 +41,8 @@ const char *email = "devel@monitoring-plugins.org";
41 41
42int process_arguments (int, char **); 42int process_arguments (int, char **);
43int validate_arguments (void); 43int validate_arguments (void);
44int error_scan (char *, int *); 44int error_scan (char *, bool *);
45int ip_match_cidr(const char *, const char *); 45bool ip_match_cidr(const char *, const char *);
46unsigned long ip2long(const char *); 46unsigned long ip2long(const char *);
47void print_help (void); 47void print_help (void);
48void print_usage (void); 48void print_usage (void);
@@ -51,13 +51,13 @@ void print_usage (void);
51char query_address[ADDRESS_LENGTH] = ""; 51char query_address[ADDRESS_LENGTH] = "";
52char dns_server[ADDRESS_LENGTH] = ""; 52char dns_server[ADDRESS_LENGTH] = "";
53char ptr_server[ADDRESS_LENGTH] = ""; 53char ptr_server[ADDRESS_LENGTH] = "";
54int verbose = FALSE; 54bool verbose = false;
55char **expected_address = NULL; 55char **expected_address = NULL;
56int expected_address_cnt = 0; 56int expected_address_cnt = 0;
57int expect_nxdomain = FALSE; 57bool expect_nxdomain = false;
58 58
59int expect_authority = FALSE; 59bool expect_authority = false;
60int all_match = FALSE; 60bool all_match = false;
61thresholds *time_thresholds = NULL; 61thresholds *time_thresholds = NULL;
62 62
63static int 63static int
@@ -80,15 +80,14 @@ main (int argc, char **argv)
80 int n_addresses = 0; 80 int n_addresses = 0;
81 char *msg = NULL; 81 char *msg = NULL;
82 char *temp_buffer = NULL; 82 char *temp_buffer = NULL;
83 int non_authoritative = FALSE; 83 bool non_authoritative = false;
84 int result = STATE_UNKNOWN; 84 int result = STATE_UNKNOWN;
85 double elapsed_time; 85 double elapsed_time;
86 long microsec; 86 long microsec;
87 struct timeval tv; 87 struct timeval tv;
88 int parse_address = FALSE; /* This flag scans for Address: but only after Name: */ 88 bool parse_address = false; /* This flag scans for Address: but only after Name: */
89 output chld_out, chld_err; 89 output chld_out, chld_err;
90 size_t i; 90 bool is_nxdomain = false;
91 int is_nxdomain = FALSE;
92 91
93 setlocale (LC_ALL, ""); 92 setlocale (LC_ALL, "");
94 bindtextdomain (PACKAGE, LOCALEDIR); 93 bindtextdomain (PACKAGE, LOCALEDIR);
@@ -122,7 +121,7 @@ main (int argc, char **argv)
122 } 121 }
123 122
124 /* scan stdout */ 123 /* scan stdout */
125 for(i = 0; i < chld_out.lines; i++) { 124 for(size_t i = 0; i < chld_out.lines; i++) {
126 if (addresses == NULL) 125 if (addresses == NULL)
127 addresses = malloc(sizeof(*addresses)*10); 126 addresses = malloc(sizeof(*addresses)*10);
128 else if (!(n_addresses % 10)) 127 else if (!(n_addresses % 10))
@@ -164,8 +163,8 @@ main (int argc, char **argv)
164 163
165 /* the server is responding, we just got the host name... */ 164 /* the server is responding, we just got the host name... */
166 if (strstr (chld_out.line[i], "Name:")) 165 if (strstr (chld_out.line[i], "Name:"))
167 parse_address = TRUE; 166 parse_address = true;
168 else if (parse_address == TRUE && (strstr (chld_out.line[i], "Address:") || 167 else if (parse_address && (strstr (chld_out.line[i], "Address:") ||
169 strstr (chld_out.line[i], "Addresses:"))) { 168 strstr (chld_out.line[i], "Addresses:"))) {
170 temp_buffer = index (chld_out.line[i], ':'); 169 temp_buffer = index (chld_out.line[i], ':');
171 temp_buffer++; 170 temp_buffer++;
@@ -184,7 +183,7 @@ main (int argc, char **argv)
184 addresses[n_addresses++] = strdup(temp_buffer); 183 addresses[n_addresses++] = strdup(temp_buffer);
185 } 184 }
186 else if (strstr (chld_out.line[i], _("Non-authoritative answer:"))) { 185 else if (strstr (chld_out.line[i], _("Non-authoritative answer:"))) {
187 non_authoritative = TRUE; 186 non_authoritative = true;
188 } 187 }
189 188
190 189
@@ -197,7 +196,7 @@ main (int argc, char **argv)
197 } 196 }
198 197
199 /* scan stderr */ 198 /* scan stderr */
200 for(i = 0; i < chld_err.lines; i++) { 199 for(size_t i = 0; i < chld_err.lines; i++) {
201 if (verbose) 200 if (verbose)
202 puts(chld_err.line[i]); 201 puts(chld_err.line[i]);
203 202
@@ -241,7 +240,7 @@ main (int argc, char **argv)
241 unsigned long expect_match = (1 << expected_address_cnt) - 1; 240 unsigned long expect_match = (1 << expected_address_cnt) - 1;
242 unsigned long addr_match = (1 << n_addresses) - 1; 241 unsigned long addr_match = (1 << n_addresses) - 1;
243 242
244 for (i=0; i<expected_address_cnt; i++) { 243 for (int i=0; i<expected_address_cnt; i++) {
245 int j; 244 int j;
246 /* check if we get a match on 'raw' ip or cidr */ 245 /* check if we get a match on 'raw' ip or cidr */
247 for (j=0; j<n_addresses; j++) { 246 for (j=0; j<n_addresses; j++) {
@@ -298,21 +297,21 @@ main (int argc, char **argv)
298 printf (_(". %s returns %s"), query_address, address); 297 printf (_(". %s returns %s"), query_address, address);
299 if ((time_thresholds->warning != NULL) && (time_thresholds->critical != NULL)) { 298 if ((time_thresholds->warning != NULL) && (time_thresholds->critical != NULL)) {
300 printf ("|%s\n", fperfdata ("time", elapsed_time, "s", 299 printf ("|%s\n", fperfdata ("time", elapsed_time, "s",
301 TRUE, time_thresholds->warning->end, 300 true, time_thresholds->warning->end,
302 TRUE, time_thresholds->critical->end, 301 true, time_thresholds->critical->end,
303 TRUE, 0, FALSE, 0)); 302 true, 0, false, 0));
304 } else if ((time_thresholds->warning == NULL) && (time_thresholds->critical != NULL)) { 303 } else if ((time_thresholds->warning == NULL) && (time_thresholds->critical != NULL)) {
305 printf ("|%s\n", fperfdata ("time", elapsed_time, "s", 304 printf ("|%s\n", fperfdata ("time", elapsed_time, "s",
306 FALSE, 0, 305 false, 0,
307 TRUE, time_thresholds->critical->end, 306 true, time_thresholds->critical->end,
308 TRUE, 0, FALSE, 0)); 307 true, 0, false, 0));
309 } else if ((time_thresholds->warning != NULL) && (time_thresholds->critical == NULL)) { 308 } else if ((time_thresholds->warning != NULL) && (time_thresholds->critical == NULL)) {
310 printf ("|%s\n", fperfdata ("time", elapsed_time, "s", 309 printf ("|%s\n", fperfdata ("time", elapsed_time, "s",
311 TRUE, time_thresholds->warning->end, 310 true, time_thresholds->warning->end,
312 FALSE, 0, 311 false, 0,
313 TRUE, 0, FALSE, 0)); 312 true, 0, false, 0));
314 } else 313 } else
315 printf ("|%s\n", fperfdata ("time", elapsed_time, "s", FALSE, 0, FALSE, 0, TRUE, 0, FALSE, 0)); 314 printf ("|%s\n", fperfdata ("time", elapsed_time, "s", false, 0, false, 0, true, 0, false, 0));
316 } 315 }
317 else if (result == STATE_WARNING) 316 else if (result == STATE_WARNING)
318 printf (_("DNS WARNING - %s\n"), 317 printf (_("DNS WARNING - %s\n"),
@@ -327,15 +326,14 @@ main (int argc, char **argv)
327 return result; 326 return result;
328} 327}
329 328
330int 329bool ip_match_cidr(const char *addr, const char *cidr_ro) {
331ip_match_cidr(const char *addr, const char *cidr_ro)
332{
333 char *subnet, *mask_c, *cidr = strdup(cidr_ro); 330 char *subnet, *mask_c, *cidr = strdup(cidr_ro);
334 int mask; 331 int mask;
335 subnet = strtok(cidr, "/"); 332 subnet = strtok(cidr, "/");
336 mask_c = strtok(NULL, "\0"); 333 mask_c = strtok(NULL, "\0");
337 if (!subnet || !mask_c) 334 if (!subnet || !mask_c) {
338 return FALSE; 335 return false;
336 }
339 mask = atoi(mask_c); 337 mask = atoi(mask_c);
340 338
341 /* https://www.cryptobells.com/verifying-ips-in-a-subnet-in-php/ */ 339 /* https://www.cryptobells.com/verifying-ips-in-a-subnet-in-php/ */
@@ -355,14 +353,14 @@ ip2long(const char* src) {
355} 353}
356 354
357int 355int
358error_scan (char *input_buffer, int *is_nxdomain) 356error_scan (char *input_buffer, bool *is_nxdomain)
359{ 357{
360 358
361 const int nxdomain = strstr (input_buffer, "Non-existent") || 359 const int nxdomain = strstr (input_buffer, "Non-existent") ||
362 strstr (input_buffer, "** server can't find") || 360 strstr (input_buffer, "** server can't find") ||
363 strstr (input_buffer, "** Can't find") || 361 strstr (input_buffer, "** Can't find") ||
364 strstr (input_buffer, "NXDOMAIN"); 362 strstr (input_buffer, "NXDOMAIN");
365 if (nxdomain) *is_nxdomain = TRUE; 363 if (nxdomain) *is_nxdomain = true;
366 364
367 /* the DNS lookup timed out */ 365 /* the DNS lookup timed out */
368 if (strstr (input_buffer, _("Note: nslookup is deprecated and may be removed from future releases.")) || 366 if (strstr (input_buffer, _("Note: nslookup is deprecated and may be removed from future releases.")) ||
@@ -461,7 +459,7 @@ process_arguments (int argc, char **argv)
461 print_revision (progname, NP_VERSION); 459 print_revision (progname, NP_VERSION);
462 exit (STATE_UNKNOWN); 460 exit (STATE_UNKNOWN);
463 case 'v': /* version */ 461 case 'v': /* version */
464 verbose = TRUE; 462 verbose = true;
465 break; 463 break;
466 case 't': /* timeout period */ 464 case 't': /* timeout period */
467 timeout_interval = atoi (optarg); 465 timeout_interval = atoi (optarg);
@@ -508,13 +506,13 @@ process_arguments (int argc, char **argv)
508 } 506 }
509 break; 507 break;
510 case 'n': /* expect NXDOMAIN */ 508 case 'n': /* expect NXDOMAIN */
511 expect_nxdomain = TRUE; 509 expect_nxdomain = true;
512 break; 510 break;
513 case 'A': /* expect authority */ 511 case 'A': /* expect authority */
514 expect_authority = TRUE; 512 expect_authority = true;
515 break; 513 break;
516 case 'L': /* all must match */ 514 case 'L': /* all must match */
517 all_match = TRUE; 515 all_match = true;
518 break; 516 break;
519 case 'w': 517 case 'w':
520 warning = optarg; 518 warning = optarg;
diff --git a/plugins/check_fping.c b/plugins/check_fping.c
index 23a9e990..70d6f9fc 100644
--- a/plugins/check_fping.c
+++ b/plugins/check_fping.c
@@ -59,16 +59,16 @@ int packet_size = PACKET_SIZE;
59int packet_count = PACKET_COUNT; 59int packet_count = PACKET_COUNT;
60int target_timeout = 0; 60int target_timeout = 0;
61int packet_interval = 0; 61int packet_interval = 0;
62int verbose = FALSE; 62bool verbose = false;
63int cpl; 63int cpl;
64int wpl; 64int wpl;
65double crta; 65double crta;
66double wrta; 66double wrta;
67int cpl_p = FALSE; 67bool cpl_p = false;
68int wpl_p = FALSE; 68bool wpl_p = false;
69bool alive_p = FALSE; 69bool alive_p = false;
70int crta_p = FALSE; 70bool crta_p = false;
71int wrta_p = FALSE; 71bool wrta_p = false;
72 72
73int 73int
74main (int argc, char **argv) 74main (int argc, char **argv)
@@ -194,8 +194,8 @@ int textscan (char *buf) {
194 _("FPING %s - %s (rta=%f ms)|%s\n"), 194 _("FPING %s - %s (rta=%f ms)|%s\n"),
195 state_text (STATE_OK), server_name,rta, 195 state_text (STATE_OK), server_name,rta,
196 /* No loss since we only waited for the first reply 196 /* No loss since we only waited for the first reply
197 perfdata ("loss", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, TRUE, 0, TRUE, 100), */ 197 perfdata ("loss", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, true, 0, true, 100), */
198 fperfdata ("rta", rta/1.0e3, "s", wrta_p, wrta/1.0e3, crta_p, crta/1.0e3, TRUE, 0, FALSE, 0)); 198 fperfdata ("rta", rta/1.0e3, "s", wrta_p, wrta/1.0e3, crta_p, crta/1.0e3, true, 0, false, 0));
199 } 199 }
200 200
201 if (strstr (buf, "not found")) { 201 if (strstr (buf, "not found")) {
@@ -228,21 +228,21 @@ int textscan (char *buf) {
228 rtastr = 1 + index (rtastr, '/'); 228 rtastr = 1 + index (rtastr, '/');
229 loss = strtod (losstr, NULL); 229 loss = strtod (losstr, NULL);
230 rta = strtod (rtastr, NULL); 230 rta = strtod (rtastr, NULL);
231 if (cpl_p == TRUE && loss > cpl) 231 if (cpl_p && loss > cpl)
232 status = STATE_CRITICAL; 232 status = STATE_CRITICAL;
233 else if (crta_p == TRUE && rta > crta) 233 else if (crta_p && rta > crta)
234 status = STATE_CRITICAL; 234 status = STATE_CRITICAL;
235 else if (wpl_p == TRUE && loss > wpl) 235 else if (wpl_p && loss > wpl)
236 status = STATE_WARNING; 236 status = STATE_WARNING;
237 else if (wrta_p == TRUE && rta > wrta) 237 else if (wrta_p && rta > wrta)
238 status = STATE_WARNING; 238 status = STATE_WARNING;
239 else 239 else
240 status = STATE_OK; 240 status = STATE_OK;
241 die (status, 241 die (status,
242 _("FPING %s - %s (loss=%.0f%%, rta=%f ms)|%s %s\n"), 242 _("FPING %s - %s (loss=%.0f%%, rta=%f ms)|%s %s\n"),
243 state_text (status), server_name, loss, rta, 243 state_text (status), server_name, loss, rta,
244 perfdata ("loss", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, TRUE, 0, TRUE, 100), 244 perfdata ("loss", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, true, 0, true, 100),
245 fperfdata ("rta", rta/1.0e3, "s", wrta_p, wrta/1.0e3, crta_p, crta/1.0e3, TRUE, 0, FALSE, 0)); 245 fperfdata ("rta", rta/1.0e3, "s", wrta_p, wrta/1.0e3, crta_p, crta/1.0e3, true, 0, false, 0));
246 246
247 } 247 }
248 else if(strstr (buf, "xmt/rcv/%loss") ) { 248 else if(strstr (buf, "xmt/rcv/%loss") ) {
@@ -258,16 +258,16 @@ int textscan (char *buf) {
258 loss = strtod (losstr, NULL); 258 loss = strtod (losstr, NULL);
259 if (atoi(losstr) == 100) 259 if (atoi(losstr) == 100)
260 status = STATE_CRITICAL; 260 status = STATE_CRITICAL;
261 else if (cpl_p == TRUE && loss > cpl) 261 else if (cpl_p && loss > cpl)
262 status = STATE_CRITICAL; 262 status = STATE_CRITICAL;
263 else if (wpl_p == TRUE && loss > wpl) 263 else if (wpl_p && loss > wpl)
264 status = STATE_WARNING; 264 status = STATE_WARNING;
265 else 265 else
266 status = STATE_OK; 266 status = STATE_OK;
267 /* loss=%.0f%%;%d;%d;0;100 */ 267 /* loss=%.0f%%;%d;%d;0;100 */
268 die (status, _("FPING %s - %s (loss=%.0f%% )|%s\n"), 268 die (status, _("FPING %s - %s (loss=%.0f%% )|%s\n"),
269 state_text (status), server_name, loss , 269 state_text (status), server_name, loss ,
270 perfdata ("loss", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, TRUE, 0, TRUE, 100)); 270 perfdata ("loss", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, true, 0, true, 100));
271 271
272 } 272 }
273 else { 273 else {
@@ -329,7 +329,7 @@ process_arguments (int argc, char **argv)
329 case '?': /* print short usage statement if args not parsable */ 329 case '?': /* print short usage statement if args not parsable */
330 usage5 (); 330 usage5 ();
331 case 'a': /* host alive mode */ 331 case 'a': /* host alive mode */
332 alive_p = TRUE; 332 alive_p = true;
333 break; 333 break;
334 case 'h': /* help */ 334 case 'h': /* help */
335 print_help (); 335 print_help ();
@@ -338,16 +338,16 @@ process_arguments (int argc, char **argv)
338 print_revision (progname, NP_VERSION); 338 print_revision (progname, NP_VERSION);
339 exit (STATE_UNKNOWN); 339 exit (STATE_UNKNOWN);
340 case 'v': /* verbose mode */ 340 case 'v': /* verbose mode */
341 verbose = TRUE; 341 verbose = true;
342 break; 342 break;
343 case 'H': /* hostname */ 343 case 'H': /* hostname */
344 if (is_host (optarg) == FALSE) { 344 if (is_host (optarg) == false) {
345 usage2 (_("Invalid hostname/address"), optarg); 345 usage2 (_("Invalid hostname/address"), optarg);
346 } 346 }
347 server_name = strscpy (server_name, optarg); 347 server_name = strscpy (server_name, optarg);
348 break; 348 break;
349 case 'S': /* sourceip */ 349 case 'S': /* sourceip */
350 if (is_host (optarg) == FALSE) { 350 if (is_host (optarg) == false) {
351 usage2 (_("Invalid hostname/address"), optarg); 351 usage2 (_("Invalid hostname/address"), optarg);
352 } 352 }
353 sourceip = strscpy (sourceip, optarg); 353 sourceip = strscpy (sourceip, optarg);
@@ -369,12 +369,12 @@ process_arguments (int argc, char **argv)
369 get_threshold (optarg, rv); 369 get_threshold (optarg, rv);
370 if (rv[RTA]) { 370 if (rv[RTA]) {
371 crta = strtod (rv[RTA], NULL); 371 crta = strtod (rv[RTA], NULL);
372 crta_p = TRUE; 372 crta_p = true;
373 rv[RTA] = NULL; 373 rv[RTA] = NULL;
374 } 374 }
375 if (rv[PL]) { 375 if (rv[PL]) {
376 cpl = atoi (rv[PL]); 376 cpl = atoi (rv[PL]);
377 cpl_p = TRUE; 377 cpl_p = true;
378 rv[PL] = NULL; 378 rv[PL] = NULL;
379 } 379 }
380 break; 380 break;
@@ -382,12 +382,12 @@ process_arguments (int argc, char **argv)
382 get_threshold (optarg, rv); 382 get_threshold (optarg, rv);
383 if (rv[RTA]) { 383 if (rv[RTA]) {
384 wrta = strtod (rv[RTA], NULL); 384 wrta = strtod (rv[RTA], NULL);
385 wrta_p = TRUE; 385 wrta_p = true;
386 rv[RTA] = NULL; 386 rv[RTA] = NULL;
387 } 387 }
388 if (rv[PL]) { 388 if (rv[PL]) {
389 wpl = atoi (rv[PL]); 389 wpl = atoi (rv[PL]);
390 wpl_p = TRUE; 390 wpl_p = true;
391 rv[PL] = NULL; 391 rv[PL] = NULL;
392 } 392 }
393 break; 393 break;
diff --git a/plugins/check_game.c b/plugins/check_game.c
index a534b69b..ca126973 100644
--- a/plugins/check_game.c
+++ b/plugins/check_game.c
@@ -53,7 +53,7 @@ char *server_ip;
53char *game_type; 53char *game_type;
54int port = 0; 54int port = 0;
55 55
56int verbose; 56bool verbose = false;
57 57
58int qstat_game_players_max = -1; 58int qstat_game_players_max = -1;
59int qstat_game_players = -1; 59int qstat_game_players = -1;
@@ -90,7 +90,7 @@ main (int argc, char **argv)
90 if (port) 90 if (port)
91 xasprintf (&command_line, "%s:%-d", command_line, port); 91 xasprintf (&command_line, "%s:%-d", command_line, port);
92 92
93 if (verbose > 0) 93 if (verbose)
94 printf ("%s\n", command_line); 94 printf ("%s\n", command_line);
95 95
96 /* run the command. historically, this plugin ignores output on stderr, 96 /* run the command. historically, this plugin ignores output on stderr,
@@ -142,11 +142,11 @@ main (int argc, char **argv)
142 ret[qstat_map_field], 142 ret[qstat_map_field],
143 ret[qstat_ping_field], 143 ret[qstat_ping_field],
144 perfdata ("players", atol(ret[qstat_game_players]), "", 144 perfdata ("players", atol(ret[qstat_game_players]), "",
145 FALSE, 0, FALSE, 0, 145 false, 0, false, 0,
146 TRUE, 0, TRUE, atol(ret[qstat_game_players_max])), 146 true, 0, true, atol(ret[qstat_game_players_max])),
147 fperfdata ("ping", strtod(ret[qstat_ping_field], NULL), "", 147 fperfdata ("ping", strtod(ret[qstat_ping_field], NULL), "",
148 FALSE, 0, FALSE, 0, 148 false, 0, false, 0,
149 TRUE, 0, FALSE, 0)); 149 true, 0, false, 0));
150 } 150 }
151 151
152 return result; 152 return result;
@@ -201,7 +201,7 @@ process_arguments (int argc, char **argv)
201 print_revision (progname, NP_VERSION); 201 print_revision (progname, NP_VERSION);
202 exit (STATE_UNKNOWN); 202 exit (STATE_UNKNOWN);
203 case 'v': /* version */ 203 case 'v': /* version */
204 verbose = TRUE; 204 verbose = true;
205 break; 205 break;
206 case 't': /* timeout period */ 206 case 't': /* timeout period */
207 timeout_interval = atoi (optarg); 207 timeout_interval = atoi (optarg);
diff --git a/plugins/check_http.c b/plugins/check_http.c
index 718c8ee7..cdf768c9 100644
--- a/plugins/check_http.c
+++ b/plugins/check_http.c
@@ -85,6 +85,7 @@ char errbuf[MAX_INPUT_BUFFER];
85int cflags = REG_NOSUB | REG_EXTENDED | REG_NEWLINE; 85int cflags = REG_NOSUB | REG_EXTENDED | REG_NEWLINE;
86int errcode; 86int errcode;
87int invert_regex = 0; 87int invert_regex = 0;
88int state_regex = STATE_CRITICAL;
88 89
89struct timeval tv; 90struct timeval tv;
90struct timeval tv_temp; 91struct timeval tv_temp;
@@ -210,7 +211,8 @@ bool process_arguments (int argc, char **argv)
210 INVERT_REGEX = CHAR_MAX + 1, 211 INVERT_REGEX = CHAR_MAX + 1,
211 SNI_OPTION, 212 SNI_OPTION,
212 MAX_REDIRS_OPTION, 213 MAX_REDIRS_OPTION,
213 CONTINUE_AFTER_CHECK_CERT 214 CONTINUE_AFTER_CHECK_CERT,
215 STATE_REGEX
214 }; 216 };
215 217
216 int option = 0; 218 int option = 0;
@@ -246,6 +248,7 @@ bool process_arguments (int argc, char **argv)
246 {"content-type", required_argument, 0, 'T'}, 248 {"content-type", required_argument, 0, 'T'},
247 {"pagesize", required_argument, 0, 'm'}, 249 {"pagesize", required_argument, 0, 'm'},
248 {"invert-regex", no_argument, NULL, INVERT_REGEX}, 250 {"invert-regex", no_argument, NULL, INVERT_REGEX},
251 {"state-regex", required_argument, 0, STATE_REGEX},
249 {"use-ipv4", no_argument, 0, '4'}, 252 {"use-ipv4", no_argument, 0, '4'},
250 {"use-ipv6", no_argument, 0, '6'}, 253 {"use-ipv6", no_argument, 0, '6'},
251 {"extended-perfdata", no_argument, 0, 'E'}, 254 {"extended-perfdata", no_argument, 0, 'E'},
@@ -471,10 +474,9 @@ bool process_arguments (int argc, char **argv)
471 free(http_method); 474 free(http_method);
472 http_method = strdup (optarg); 475 http_method = strdup (optarg);
473 char *tmp; 476 char *tmp;
474 if ((tmp = strstr(http_method, ":")) > 0) { 477 if ((tmp = strstr(http_method, ":")) != NULL) {
475 tmp[0] = '\0'; 478 tmp[0] = '\0'; // set the ":" in the middle to 0
476 http_method = http_method; 479 http_method_proxy = ++tmp; // this points to the second part
477 http_method_proxy = ++tmp;
478 } 480 }
479 break; 481 break;
480 case 'd': /* string or substring */ 482 case 'd': /* string or substring */
@@ -512,6 +514,13 @@ bool process_arguments (int argc, char **argv)
512 case INVERT_REGEX: 514 case INVERT_REGEX:
513 invert_regex = 1; 515 invert_regex = 1;
514 break; 516 break;
517 case STATE_REGEX:
518 if (!strcmp (optarg, "critical"))
519 state_regex = STATE_CRITICAL;
520 else if (!strcmp (optarg, "warning"))
521 state_regex = STATE_WARNING;
522 else usage2 (_("Invalid state-regex option"), optarg);
523 break;
515 case '4': 524 case '4':
516 address_family = AF_INET; 525 address_family = AF_INET;
517 break; 526 break;
@@ -1094,7 +1103,7 @@ check_http (void)
1094 microsec_firstbyte = deltime (tv_temp); 1103 microsec_firstbyte = deltime (tv_temp);
1095 elapsed_time_firstbyte = (double)microsec_firstbyte / 1.0e6; 1104 elapsed_time_firstbyte = (double)microsec_firstbyte / 1.0e6;
1096 } 1105 }
1097 while (pos = memchr(buffer, '\0', i)) { 1106 while ((pos = memchr(buffer, '\0', i))) {
1098 /* replace nul character with a blank */ 1107 /* replace nul character with a blank */
1099 *pos = ' '; 1108 *pos = ' ';
1100 } 1109 }
@@ -1318,7 +1327,7 @@ check_http (void)
1318 xasprintf (&msg, _("%spattern not found, "), msg); 1327 xasprintf (&msg, _("%spattern not found, "), msg);
1319 else 1328 else
1320 xasprintf (&msg, _("%spattern found, "), msg); 1329 xasprintf (&msg, _("%spattern found, "), msg);
1321 result = STATE_CRITICAL; 1330 result = state_regex;
1322 } 1331 }
1323 else { 1332 else {
1324 /* FIXME: Shouldn't that be UNKNOWN? */ 1333 /* FIXME: Shouldn't that be UNKNOWN? */
@@ -1775,7 +1784,7 @@ print_help (void)
1775 printf (" %s\n", "-u, --url=PATH"); 1784 printf (" %s\n", "-u, --url=PATH");
1776 printf (" %s\n", _("URL to GET or POST (default: /)")); 1785 printf (" %s\n", _("URL to GET or POST (default: /)"));
1777 printf (" %s\n", "-P, --post=STRING"); 1786 printf (" %s\n", "-P, --post=STRING");
1778 printf (" %s\n", _("URL encoded http POST data")); 1787 printf (" %s\n", _("URL decoded http POST data"));
1779 printf (" %s\n", "-j, --method=STRING (for example: HEAD, OPTIONS, TRACE, PUT, DELETE, CONNECT, CONNECT:POST)"); 1788 printf (" %s\n", "-j, --method=STRING (for example: HEAD, OPTIONS, TRACE, PUT, DELETE, CONNECT, CONNECT:POST)");
1780 printf (" %s\n", _("Set HTTP method.")); 1789 printf (" %s\n", _("Set HTTP method."));
1781 printf (" %s\n", "-N, --no-body"); 1790 printf (" %s\n", "-N, --no-body");
@@ -1794,7 +1803,10 @@ print_help (void)
1794 printf (" %s\n", "-R, --eregi=STRING"); 1803 printf (" %s\n", "-R, --eregi=STRING");
1795 printf (" %s\n", _("Search page for case-insensitive regex STRING")); 1804 printf (" %s\n", _("Search page for case-insensitive regex STRING"));
1796 printf (" %s\n", "--invert-regex"); 1805 printf (" %s\n", "--invert-regex");
1797 printf (" %s\n", _("Return CRITICAL if found, OK if not\n")); 1806 printf (" %s\n", _("Return STATE if found, OK if not (STATE is CRITICAL, per default)"));
1807 printf (" %s\n", _("can be changed with --state--regex)"));
1808 printf (" %s\n", "--regex-state=STATE");
1809 printf (" %s\n", _("Return STATE if regex is found, OK if not\n"));
1798 1810
1799 printf (" %s\n", "-a, --authorization=AUTH_PAIR"); 1811 printf (" %s\n", "-a, --authorization=AUTH_PAIR");
1800 printf (" %s\n", _("Username:password on sites with basic authentication")); 1812 printf (" %s\n", _("Username:password on sites with basic authentication"));
diff --git a/plugins/check_ide_smart.c b/plugins/check_ide_smart.c
index 0160d98b..3872e341 100644
--- a/plugins/check_ide_smart.c
+++ b/plugins/check_ide_smart.c
@@ -73,10 +73,6 @@ void print_usage (void);
73 73
74#define NR_ATTRIBUTES 30 74#define NR_ATTRIBUTES 30
75 75
76#ifndef TRUE
77#define TRUE 1
78#endif /* */
79
80#define PREFAILURE 2 76#define PREFAILURE 2
81#define ADVISORY 1 77#define ADVISORY 1
82#define OPERATIONAL 0 78#define OPERATIONAL 0
@@ -169,9 +165,9 @@ int smart_read_values (int, values_t *);
169int nagios (values_t *, thresholds_t *); 165int nagios (values_t *, thresholds_t *);
170void print_value (value_t *, threshold_t *); 166void print_value (value_t *, threshold_t *);
171void print_values (values_t *, thresholds_t *); 167void print_values (values_t *, thresholds_t *);
172int smart_cmd_simple (int, enum SmartCommand, __u8, char); 168int smart_cmd_simple (int, enum SmartCommand, __u8, bool);
173int smart_read_thresholds (int, thresholds_t *); 169int smart_read_thresholds (int, thresholds_t *);
174int verbose = FALSE; 170bool verbose = false;
175 171
176int 172int
177main (int argc, char *argv[]) 173main (int argc, char *argv[])
@@ -203,7 +199,7 @@ main (int argc, char *argv[])
203 bindtextdomain (PACKAGE, LOCALEDIR); 199 bindtextdomain (PACKAGE, LOCALEDIR);
204 textdomain (PACKAGE); 200 textdomain (PACKAGE);
205 201
206 while (1) { 202 while (true) {
207 203
208 o = getopt_long (argc, argv, "+d:iq10nhVv", longopts, &longindex); 204 o = getopt_long (argc, argv, "+d:iq10nhVv", longopts, &longindex);
209 205
@@ -229,7 +225,7 @@ main (int argc, char *argv[])
229 fprintf (stderr, "%s\n", _("default and will be removed from future releases.")); 225 fprintf (stderr, "%s\n", _("default and will be removed from future releases."));
230 break; 226 break;
231 case 'v': /* verbose */ 227 case 'v': /* verbose */
232 verbose = TRUE; 228 verbose = true;
233 break; 229 break;
234 case 'h': 230 case 'h':
235 print_help (); 231 print_help ();
@@ -258,7 +254,7 @@ main (int argc, char *argv[])
258 return STATE_CRITICAL; 254 return STATE_CRITICAL;
259 } 255 }
260 256
261 if (smart_cmd_simple (fd, SMART_CMD_ENABLE, 0, FALSE)) { 257 if (smart_cmd_simple (fd, SMART_CMD_ENABLE, 0, false)) {
262 printf (_("CRITICAL - SMART_CMD_ENABLE\n")); 258 printf (_("CRITICAL - SMART_CMD_ENABLE\n"));
263 return STATE_CRITICAL; 259 return STATE_CRITICAL;
264 } 260 }
@@ -447,9 +443,7 @@ print_values (values_t * p, thresholds_t * t)
447} 443}
448 444
449 445
450int 446int smart_cmd_simple (int fd, enum SmartCommand command, __u8 val0, bool show_error) {
451smart_cmd_simple (int fd, enum SmartCommand command, __u8 val0, char show_error)
452{
453 int e = STATE_UNKNOWN; 447 int e = STATE_UNKNOWN;
454#ifdef __linux__ 448#ifdef __linux__
455 __u8 args[4]; 449 __u8 args[4];
diff --git a/plugins/check_ldap.c b/plugins/check_ldap.c
index a1bfe1be..868ffc1e 100644
--- a/plugins/check_ldap.c
+++ b/plugins/check_ldap.c
@@ -71,9 +71,9 @@ thresholds *entries_thresholds = NULL;
71struct timeval tv; 71struct timeval tv;
72char* warn_entries = NULL; 72char* warn_entries = NULL;
73char* crit_entries = NULL; 73char* crit_entries = NULL;
74int starttls = FALSE; 74bool starttls = false;
75int ssl_on_connect = FALSE; 75bool ssl_on_connect = false;
76int verbose = 0; 76bool verbose = false;
77 77
78/* for ldap tls */ 78/* for ldap tls */
79 79
@@ -97,9 +97,6 @@ main (int argc, char *argv[])
97 int tls; 97 int tls;
98 int version=3; 98 int version=3;
99 99
100 /* for entry counting */
101
102 LDAPMessage *next_entry;
103 int status_entries = STATE_OK; 100 int status_entries = STATE_OK;
104 int num_entries = 0; 101 int num_entries = 0;
105 102
@@ -118,7 +115,7 @@ main (int argc, char *argv[])
118 usage4 (_("Could not parse arguments")); 115 usage4 (_("Could not parse arguments"));
119 116
120 if (strstr(argv[0],"check_ldaps") && ! starttls && ! ssl_on_connect) 117 if (strstr(argv[0],"check_ldaps") && ! starttls && ! ssl_on_connect)
121 starttls = TRUE; 118 starttls = true;
122 119
123 /* initialize alarm signal handling */ 120 /* initialize alarm signal handling */
124 signal (SIGALRM, socket_timeout_alarm_handler); 121 signal (SIGALRM, socket_timeout_alarm_handler);
@@ -256,11 +253,11 @@ main (int argc, char *argv[])
256 fperfdata ("time", elapsed_time, "s", 253 fperfdata ("time", elapsed_time, "s",
257 (int)warn_time, warn_time, 254 (int)warn_time, warn_time,
258 (int)crit_time, crit_time, 255 (int)crit_time, crit_time,
259 TRUE, 0, FALSE, 0), 256 true, 0, false, 0),
260 sperfdata ("entries", (double)num_entries, "", 257 sperfdata ("entries", (double)num_entries, "",
261 warn_entries, 258 warn_entries,
262 crit_entries, 259 crit_entries,
263 TRUE, 0.0, FALSE, 0.0)); 260 true, 0.0, false, 0.0));
264 } else { 261 } else {
265 printf (_("LDAP %s - %.3f seconds response time|%s\n"), 262 printf (_("LDAP %s - %.3f seconds response time|%s\n"),
266 state_text (status), 263 state_text (status),
@@ -268,7 +265,7 @@ main (int argc, char *argv[])
268 fperfdata ("time", elapsed_time, "s", 265 fperfdata ("time", elapsed_time, "s",
269 (int)warn_time, warn_time, 266 (int)warn_time, warn_time,
270 (int)crit_time, crit_time, 267 (int)crit_time, crit_time,
271 TRUE, 0, FALSE, 0)); 268 true, 0, false, 0));
272 } 269 }
273 270
274 return status; 271 return status;
@@ -316,7 +313,7 @@ process_arguments (int argc, char **argv)
316 strcpy (argv[c], "-t"); 313 strcpy (argv[c], "-t");
317 } 314 }
318 315
319 while (1) { 316 while (true) {
320 c = getopt_long (argc, argv, "hvV234TS6t:c:w:H:b:p:a:D:P:C:W:", longopts, &option); 317 c = getopt_long (argc, argv, "hvV234TS6t:c:w:H:b:p:a:D:P:C:W:", longopts, &option);
321 318
322 if (c == -1 || c == EOF) 319 if (c == -1 || c == EOF)
@@ -377,17 +374,17 @@ process_arguments (int argc, char **argv)
377 address_family = AF_INET; 374 address_family = AF_INET;
378 break; 375 break;
379 case 'v': 376 case 'v':
380 verbose++; 377 verbose = true;
381 break; 378 break;
382 case 'T': 379 case 'T':
383 if (! ssl_on_connect) 380 if (! ssl_on_connect)
384 starttls = TRUE; 381 starttls = true;
385 else 382 else
386 usage_va(_("%s cannot be combined with %s"), "-T/--starttls", "-S/--ssl"); 383 usage_va(_("%s cannot be combined with %s"), "-T/--starttls", "-S/--ssl");
387 break; 384 break;
388 case 'S': 385 case 'S':
389 if (! starttls) { 386 if (! starttls) {
390 ssl_on_connect = TRUE; 387 ssl_on_connect = true;
391 if (ld_port == -1) 388 if (ld_port == -1)
392 ld_port = LDAPS_PORT; 389 ld_port = LDAPS_PORT;
393 } else 390 } else
diff --git a/plugins/check_load.c b/plugins/check_load.c
index 313df8ad..1431d130 100644
--- a/plugins/check_load.c
+++ b/plugins/check_load.c
@@ -110,10 +110,6 @@ main (int argc, char **argv)
110 double la[3] = { 0.0, 0.0, 0.0 }; /* NetBSD complains about uninitialized arrays */ 110 double la[3] = { 0.0, 0.0, 0.0 }; /* NetBSD complains about uninitialized arrays */
111#ifndef HAVE_GETLOADAVG 111#ifndef HAVE_GETLOADAVG
112 char input_buffer[MAX_INPUT_BUFFER]; 112 char input_buffer[MAX_INPUT_BUFFER];
113# ifdef HAVE_PROC_LOADAVG
114 FILE *fp;
115 char *str, *next;
116# endif
117#endif 113#endif
118 114
119 setlocale (LC_ALL, ""); 115 setlocale (LC_ALL, "");
@@ -132,23 +128,6 @@ main (int argc, char **argv)
132 if (result != 3) 128 if (result != 3)
133 return STATE_UNKNOWN; 129 return STATE_UNKNOWN;
134#else 130#else
135# ifdef HAVE_PROC_LOADAVG
136 fp = fopen (PROC_LOADAVG, "r");
137 if (fp == NULL) {
138 printf (_("Error opening %s\n"), PROC_LOADAVG);
139 return STATE_UNKNOWN;
140 }
141
142 while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, fp)) {
143 str = (char *)input_buffer;
144 for(i = 0; i < 3; i++) {
145 la[i] = strtod(str, &next);
146 str = next;
147 }
148 }
149
150 fclose (fp);
151# else
152 child_process = spopen (PATH_TO_UPTIME); 131 child_process = spopen (PATH_TO_UPTIME);
153 if (child_process == NULL) { 132 if (child_process == NULL) {
154 printf (_("Error opening %s\n"), PATH_TO_UPTIME); 133 printf (_("Error opening %s\n"), PATH_TO_UPTIME);
@@ -175,18 +154,13 @@ main (int argc, char **argv)
175 printf (_("Error code %d returned in %s\n"), result, PATH_TO_UPTIME); 154 printf (_("Error code %d returned in %s\n"), result, PATH_TO_UPTIME);
176 return STATE_UNKNOWN; 155 return STATE_UNKNOWN;
177 } 156 }
178# endif
179#endif 157#endif
180 158
181 if ((la[0] < 0.0) || (la[1] < 0.0) || (la[2] < 0.0)) { 159 if ((la[0] < 0.0) || (la[1] < 0.0) || (la[2] < 0.0)) {
182#ifdef HAVE_GETLOADAVG 160#ifdef HAVE_GETLOADAVG
183 printf (_("Error in getloadavg()\n")); 161 printf (_("Error in getloadavg()\n"));
184#else 162#else
185# ifdef HAVE_PROC_LOADAVG
186 printf (_("Error processing %s\n"), PROC_LOADAVG);
187# else
188 printf (_("Error processing %s\n"), PATH_TO_UPTIME); 163 printf (_("Error processing %s\n"), PATH_TO_UPTIME);
189# endif
190#endif 164#endif
191 return STATE_UNKNOWN; 165 return STATE_UNKNOWN;
192 } 166 }
diff --git a/plugins/check_mrtg.c b/plugins/check_mrtg.c
index 1fda5492..826b77e9 100644
--- a/plugins/check_mrtg.c
+++ b/plugins/check_mrtg.c
@@ -43,7 +43,7 @@ void print_usage (void);
43 43
44char *log_file = NULL; 44char *log_file = NULL;
45int expire_minutes = 0; 45int expire_minutes = 0;
46int use_average = TRUE; 46bool use_average = true;
47int variable_number = -1; 47int variable_number = -1;
48unsigned long value_warning_threshold = 0L; 48unsigned long value_warning_threshold = 0L;
49unsigned long value_critical_threshold = 0L; 49unsigned long value_critical_threshold = 0L;
@@ -138,7 +138,7 @@ main (int argc, char **argv)
138 } 138 }
139 139
140 /* else check the incoming/outgoing rates */ 140 /* else check the incoming/outgoing rates */
141 if (use_average == TRUE) 141 if (use_average)
142 rate = average_value_rate; 142 rate = average_value_rate;
143 else 143 else
144 rate = maximum_value_rate; 144 rate = maximum_value_rate;
@@ -149,7 +149,7 @@ main (int argc, char **argv)
149 result = STATE_WARNING; 149 result = STATE_WARNING;
150 150
151 printf("%s. %s = %lu %s|%s\n", 151 printf("%s. %s = %lu %s|%s\n",
152 (use_average == TRUE) ? _("Avg") : _("Max"), 152 (use_average) ? _("Avg") : _("Max"),
153 label, rate, units, 153 label, rate, units,
154 perfdata(label, (long) rate, units, 154 perfdata(label, (long) rate, units,
155 (int) value_warning_threshold, (long) value_warning_threshold, 155 (int) value_warning_threshold, (long) value_warning_threshold,
@@ -211,9 +211,9 @@ process_arguments (int argc, char **argv)
211 break; 211 break;
212 case 'a': /* port */ 212 case 'a': /* port */
213 if (!strcmp (optarg, "MAX")) 213 if (!strcmp (optarg, "MAX"))
214 use_average = FALSE; 214 use_average = false;
215 else 215 else
216 use_average = TRUE; 216 use_average = true;
217 break; 217 break;
218 case 'v': 218 case 'v':
219 variable_number = atoi (optarg); 219 variable_number = atoi (optarg);
@@ -258,11 +258,11 @@ process_arguments (int argc, char **argv)
258 } 258 }
259 259
260 if (argc > c && strcmp (argv[c], "MAX") == 0) { 260 if (argc > c && strcmp (argv[c], "MAX") == 0) {
261 use_average = FALSE; 261 use_average = false;
262 c++; 262 c++;
263 } 263 }
264 else if (argc > c && strcmp (argv[c], "AVG") == 0) { 264 else if (argc > c && strcmp (argv[c], "AVG") == 0) {
265 use_average = TRUE; 265 use_average = true;
266 c++; 266 c++;
267 } 267 }
268 268
diff --git a/plugins/check_mrtgtraf.c b/plugins/check_mrtgtraf.c
index eb66f622..bd25d47d 100644
--- a/plugins/check_mrtgtraf.c
+++ b/plugins/check_mrtgtraf.c
@@ -43,7 +43,7 @@ void print_usage(void);
43 43
44char *log_file = NULL; 44char *log_file = NULL;
45int expire_minutes = -1; 45int expire_minutes = -1;
46int use_average = TRUE; 46bool use_average = true;
47unsigned long incoming_warning_threshold = 0L; 47unsigned long incoming_warning_threshold = 0L;
48unsigned long incoming_critical_threshold = 0L; 48unsigned long incoming_critical_threshold = 0L;
49unsigned long outgoing_warning_threshold = 0L; 49unsigned long outgoing_warning_threshold = 0L;
@@ -137,7 +137,7 @@ main (int argc, char **argv)
137 (int) ((current_time - timestamp) / 60)); 137 (int) ((current_time - timestamp) / 60));
138 138
139 /* else check the incoming/outgoing rates */ 139 /* else check the incoming/outgoing rates */
140 if (use_average == TRUE) { 140 if (use_average) {
141 incoming_rate = average_incoming_rate; 141 incoming_rate = average_incoming_rate;
142 outgoing_rate = average_outgoing_rate; 142 outgoing_rate = average_outgoing_rate;
143 } 143 }
@@ -192,17 +192,17 @@ main (int argc, char **argv)
192 } 192 }
193 193
194 xasprintf (&error_message, _("%s. In = %0.1f %s/s, %s. Out = %0.1f %s/s|%s %s\n"), 194 xasprintf (&error_message, _("%s. In = %0.1f %s/s, %s. Out = %0.1f %s/s|%s %s\n"),
195 (use_average == TRUE) ? _("Avg") : _("Max"), adjusted_incoming_rate, 195 (use_average) ? _("Avg") : _("Max"), adjusted_incoming_rate,
196 incoming_speed_rating, (use_average == TRUE) ? _("Avg") : _("Max"), 196 incoming_speed_rating, (use_average) ? _("Avg") : _("Max"),
197 adjusted_outgoing_rate, outgoing_speed_rating, 197 adjusted_outgoing_rate, outgoing_speed_rating,
198 fperfdata("in", adjusted_incoming_rate, incoming_speed_rating, 198 fperfdata("in", adjusted_incoming_rate, incoming_speed_rating,
199 (int)incoming_warning_threshold, incoming_warning_threshold, 199 (int)incoming_warning_threshold, incoming_warning_threshold,
200 (int)incoming_critical_threshold, incoming_critical_threshold, 200 (int)incoming_critical_threshold, incoming_critical_threshold,
201 TRUE, 0, FALSE, 0), 201 true, 0, false, 0),
202 fperfdata("out", adjusted_outgoing_rate, outgoing_speed_rating, 202 fperfdata("out", adjusted_outgoing_rate, outgoing_speed_rating,
203 (int)outgoing_warning_threshold, outgoing_warning_threshold, 203 (int)outgoing_warning_threshold, outgoing_warning_threshold,
204 (int)outgoing_critical_threshold, outgoing_critical_threshold, 204 (int)outgoing_critical_threshold, outgoing_critical_threshold,
205 TRUE, 0, FALSE, 0)); 205 true, 0, false, 0));
206 206
207 printf (_("Traffic %s - %s\n"), state_text(result), error_message); 207 printf (_("Traffic %s - %s\n"), state_text(result), error_message);
208 208
@@ -256,9 +256,9 @@ process_arguments (int argc, char **argv)
256 break; 256 break;
257 case 'a': /* aggregation (AVE or MAX) */ 257 case 'a': /* aggregation (AVE or MAX) */
258 if (!strcmp (optarg, "MAX")) 258 if (!strcmp (optarg, "MAX"))
259 use_average = FALSE; 259 use_average = false;
260 else 260 else
261 use_average = TRUE; 261 use_average = true;
262 break; 262 break;
263 case 'c': /* warning threshold */ 263 case 'c': /* warning threshold */
264 sscanf (optarg, "%lu,%lu", &incoming_critical_threshold, 264 sscanf (optarg, "%lu,%lu", &incoming_critical_threshold,
@@ -289,11 +289,11 @@ process_arguments (int argc, char **argv)
289 } 289 }
290 290
291 if (argc > c && strcmp (argv[c], "MAX") == 0) { 291 if (argc > c && strcmp (argv[c], "MAX") == 0) {
292 use_average = FALSE; 292 use_average = false;
293 c++; 293 c++;
294 } 294 }
295 else if (argc > c && strcmp (argv[c], "AVG") == 0) { 295 else if (argc > c && strcmp (argv[c], "AVG") == 0) {
296 use_average = TRUE; 296 use_average = true;
297 c++; 297 c++;
298 } 298 }
299 299
diff --git a/plugins/check_mysql.c b/plugins/check_mysql.c
index 7d855544..15ec04c0 100644
--- a/plugins/check_mysql.c
+++ b/plugins/check_mysql.c
@@ -59,8 +59,8 @@ bool ssl = false;
59char *opt_file = NULL; 59char *opt_file = NULL;
60char *opt_group = NULL; 60char *opt_group = NULL;
61unsigned int db_port = MYSQL_PORT; 61unsigned int db_port = MYSQL_PORT;
62int check_slave = 0, warn_sec = 0, crit_sec = 0; 62bool check_slave = false;
63int ignore_auth = 0; 63bool ignore_auth = false;
64int verbose = 0; 64int verbose = 0;
65 65
66static double warning_time = 0; 66static double warning_time = 0;
@@ -113,7 +113,7 @@ main (int argc, char **argv)
113 char slaveresult[SLAVERESULTSIZE] = { 0 }; 113 char slaveresult[SLAVERESULTSIZE] = { 0 };
114 char* perf; 114 char* perf;
115 115
116 perf = strdup (""); 116 perf = strdup ("");
117 117
118 setlocale (LC_ALL, ""); 118 setlocale (LC_ALL, "");
119 bindtextdomain (PACKAGE, LOCALEDIR); 119 bindtextdomain (PACKAGE, LOCALEDIR);
@@ -193,14 +193,14 @@ main (int argc, char **argv)
193 for(i = 0; i < LENGTH_METRIC_UNIT; i++) { 193 for(i = 0; i < LENGTH_METRIC_UNIT; i++) {
194 if (strcmp(row[0], metric_unit[i]) == 0) { 194 if (strcmp(row[0], metric_unit[i]) == 0) {
195 xasprintf(&perf, "%s%s ", perf, perfdata(metric_unit[i], 195 xasprintf(&perf, "%s%s ", perf, perfdata(metric_unit[i],
196 atol(row[1]), "", FALSE, 0, FALSE, 0, FALSE, 0, FALSE, 0)); 196 atol(row[1]), "", false, 0, false, 0, false, 0, false, 0));
197 continue; 197 continue;
198 } 198 }
199 } 199 }
200 for(i = 0; i < LENGTH_METRIC_COUNTER; i++) { 200 for(i = 0; i < LENGTH_METRIC_COUNTER; i++) {
201 if (strcmp(row[0], metric_counter[i]) == 0) { 201 if (strcmp(row[0], metric_counter[i]) == 0) {
202 xasprintf(&perf, "%s%s ", perf, perfdata(metric_counter[i], 202 xasprintf(&perf, "%s%s ", perf, perfdata(metric_counter[i],
203 atol(row[1]), "c", FALSE, 0, FALSE, 0, FALSE, 0, FALSE, 0)); 203 atol(row[1]), "c", false, 0, false, 0, false, 0, false, 0));
204 continue; 204 continue;
205 } 205 }
206 } 206 }
@@ -322,10 +322,10 @@ main (int argc, char **argv)
322 status = get_status(value, my_threshold); 322 status = get_status(value, my_threshold);
323 323
324 xasprintf (&perf, "%s %s", perf, fperfdata ("seconds behind master", value, "s", 324 xasprintf (&perf, "%s %s", perf, fperfdata ("seconds behind master", value, "s",
325 TRUE, (double) warning_time, 325 true, (double) warning_time,
326 TRUE, (double) critical_time, 326 true, (double) critical_time,
327 FALSE, 0, 327 false, 0,
328 FALSE, 0)); 328 false, 0));
329 329
330 if (status == STATE_WARNING) { 330 if (status == STATE_WARNING) {
331 printf("SLOW_SLAVE %s: %s|%s\n", _("WARNING"), slaveresult, perf); 331 printf("SLOW_SLAVE %s: %s|%s\n", _("WARNING"), slaveresult, perf);
@@ -456,10 +456,10 @@ process_arguments (int argc, char **argv)
456 db_port = atoi (optarg); 456 db_port = atoi (optarg);
457 break; 457 break;
458 case 'S': 458 case 'S':
459 check_slave = 1; /* check-slave */ 459 check_slave = true; /* check-slave */
460 break; 460 break;
461 case 'n': 461 case 'n':
462 ignore_auth = 1; /* ignore-auth */ 462 ignore_auth = true; /* ignore-auth */
463 break; 463 break;
464 case 'w': 464 case 'w':
465 warning = optarg; 465 warning = optarg;
diff --git a/plugins/check_mysql_query.c b/plugins/check_mysql_query.c
index ac2fb15d..842b7a2f 100644
--- a/plugins/check_mysql_query.c
+++ b/plugins/check_mysql_query.c
@@ -162,10 +162,10 @@ main (int argc, char **argv)
162 } 162 }
163 printf(_("'%s' returned %f | %s"), sql_query, value, 163 printf(_("'%s' returned %f | %s"), sql_query, value,
164 fperfdata("result", value, "", 164 fperfdata("result", value, "",
165 my_thresholds->warning?TRUE:FALSE, my_thresholds->warning?my_thresholds->warning->end:0, 165 my_thresholds->warning?true:false, my_thresholds->warning?my_thresholds->warning->end:0,
166 my_thresholds->critical?TRUE:FALSE, my_thresholds->critical?my_thresholds->critical->end:0, 166 my_thresholds->critical?true:false, my_thresholds->critical?my_thresholds->critical->end:0,
167 FALSE, 0, 167 false, 0,
168 FALSE, 0) 168 false, 0)
169 ); 169 );
170 printf("\n"); 170 printf("\n");
171 171
diff --git a/plugins/check_nt.c b/plugins/check_nt.c
index d73d83ce..19c050de 100644
--- a/plugins/check_nt.c
+++ b/plugins/check_nt.c
@@ -67,17 +67,17 @@ char *req_password=NULL;
67unsigned long lvalue_list[MAX_VALUE_LIST]; 67unsigned long lvalue_list[MAX_VALUE_LIST];
68unsigned long warning_value=0L; 68unsigned long warning_value=0L;
69unsigned long critical_value=0L; 69unsigned long critical_value=0L;
70int check_warning_value=FALSE; 70bool check_warning_value=false;
71int check_critical_value=FALSE; 71bool check_critical_value=false;
72enum checkvars vars_to_check = CHECK_NONE; 72enum checkvars vars_to_check = CHECK_NONE;
73int show_all=FALSE; 73bool show_all = false;
74 74
75char recv_buffer[MAX_INPUT_BUFFER]; 75char recv_buffer[MAX_INPUT_BUFFER];
76 76
77void fetch_data (const char* address, int port, const char* sendb); 77void fetch_data (const char* address, int port, const char* sendb);
78int process_arguments(int, char **); 78int process_arguments(int, char **);
79void preparelist(char *string); 79void preparelist(char *string);
80int strtoularray(unsigned long *array, char *string, const char *delim); 80bool strtoularray(unsigned long *array, char *string, const char *delim);
81void print_help(void); 81void print_help(void);
82void print_usage(void); 82void print_usage(void);
83 83
@@ -113,8 +113,8 @@ int main(int argc, char **argv){
113 int uphours=0; 113 int uphours=0;
114 int upminutes=0; 114 int upminutes=0;
115 115
116 int isPercent = FALSE; 116 bool isPercent = false;
117 int allRight = FALSE; 117 bool allRight = false;
118 118
119 setlocale (LC_ALL, ""); 119 setlocale (LC_ALL, "");
120 bindtextdomain (PACKAGE, LOCALEDIR); 120 bindtextdomain (PACKAGE, LOCALEDIR);
@@ -151,7 +151,7 @@ int main(int argc, char **argv){
151 151
152 if (value_list==NULL) 152 if (value_list==NULL)
153 output_message = strdup (_("missing -l parameters")); 153 output_message = strdup (_("missing -l parameters"));
154 else if (strtoularray(lvalue_list,value_list,",")==FALSE) 154 else if (! strtoularray(lvalue_list,value_list,","))
155 output_message = strdup (_("wrong -l parameter.")); 155 output_message = strdup (_("wrong -l parameter."));
156 else { 156 else {
157 /* -l parameters is present with only integers */ 157 /* -l parameters is present with only integers */
@@ -224,9 +224,9 @@ int main(int argc, char **argv){
224 224
225 xasprintf(&output_message,_("System Uptime - %u day(s) %u hour(s) %u minute(s) |uptime=%lu"),updays, uphours, upminutes, uptime); 225 xasprintf(&output_message,_("System Uptime - %u day(s) %u hour(s) %u minute(s) |uptime=%lu"),updays, uphours, upminutes, uptime);
226 226
227 if (check_critical_value==TRUE && uptime <= critical_value) 227 if (check_critical_value && uptime <= critical_value)
228 return_code=STATE_CRITICAL; 228 return_code=STATE_CRITICAL;
229 else if (check_warning_value==TRUE && uptime <= warning_value) 229 else if (check_warning_value && uptime <= warning_value)
230 return_code=STATE_WARNING; 230 return_code=STATE_WARNING;
231 else 231 else
232 return_code=STATE_OK; 232 return_code=STATE_OK;
@@ -261,9 +261,9 @@ int main(int argc, char **argv){
261 (total_disk_space - free_disk_space) / 1073741824, warning_used_space / 1073741824, 261 (total_disk_space - free_disk_space) / 1073741824, warning_used_space / 1073741824,
262 critical_used_space / 1073741824, total_disk_space / 1073741824); 262 critical_used_space / 1073741824, total_disk_space / 1073741824);
263 263
264 if(check_critical_value==TRUE && percent_used_space >= critical_value) 264 if(check_critical_value && percent_used_space >= critical_value)
265 return_code=STATE_CRITICAL; 265 return_code=STATE_CRITICAL;
266 else if (check_warning_value==TRUE && percent_used_space >= warning_value) 266 else if (check_warning_value && percent_used_space >= warning_value)
267 return_code=STATE_WARNING; 267 return_code=STATE_WARNING;
268 else 268 else
269 return_code=STATE_OK; 269 return_code=STATE_OK;
@@ -285,7 +285,7 @@ int main(int argc, char **argv){
285 else { 285 else {
286 preparelist(value_list); /* replace , between services with & to send the request */ 286 preparelist(value_list); /* replace , between services with & to send the request */
287 xasprintf(&send_buffer,"%s&%u&%s&%s", req_password,(vars_to_check==CHECK_SERVICESTATE)?5:6, 287 xasprintf(&send_buffer,"%s&%u&%s&%s", req_password,(vars_to_check==CHECK_SERVICESTATE)?5:6,
288 (show_all==TRUE) ? "ShowAll" : "ShowFail",value_list); 288 (show_all) ? "ShowAll" : "ShowFail",value_list);
289 fetch_data (server_address, server_port, send_buffer); 289 fetch_data (server_address, server_port, send_buffer);
290 numstr = strtok(recv_buffer,"&"); 290 numstr = strtok(recv_buffer,"&");
291 if (numstr == NULL) 291 if (numstr == NULL)
@@ -321,9 +321,9 @@ int main(int argc, char **argv){
321 warning_used_space / 1048567, critical_used_space / 1048567, mem_commitLimit / 1048567); 321 warning_used_space / 1048567, critical_used_space / 1048567, mem_commitLimit / 1048567);
322 322
323 return_code=STATE_OK; 323 return_code=STATE_OK;
324 if(check_critical_value==TRUE && percent_used_space >= critical_value) 324 if(check_critical_value && percent_used_space >= critical_value)
325 return_code=STATE_CRITICAL; 325 return_code=STATE_CRITICAL;
326 else if (check_warning_value==TRUE && percent_used_space >= warning_value) 326 else if (check_warning_value && percent_used_space >= warning_value)
327 return_code=STATE_WARNING; 327 return_code=STATE_WARNING;
328 328
329 break; 329 break;
@@ -371,7 +371,7 @@ int main(int argc, char **argv){
371 else if (isPercent) 371 else if (isPercent)
372 { 372 {
373 counter_unit = strdup ("%"); 373 counter_unit = strdup ("%");
374 allRight = TRUE; 374 allRight = true;
375 } 375 }
376 376
377 if ((counter_unit != NULL) && (!allRight)) 377 if ((counter_unit != NULL) && (!allRight))
@@ -391,7 +391,7 @@ int main(int argc, char **argv){
391 if ((fmaxval == 0) && (maxval == errcvt)) 391 if ((fmaxval == 0) && (maxval == errcvt))
392 output_message = strdup (_("Maximum value contains non-numbers")); 392 output_message = strdup (_("Maximum value contains non-numbers"));
393 else 393 else
394 allRight = TRUE; /* Everything is OK. */ 394 allRight = true; /* Everything is OK. */
395 395
396 } 396 }
397 } 397 }
@@ -418,9 +418,9 @@ int main(int argc, char **argv){
418 418
419 if (critical_value > warning_value) 419 if (critical_value > warning_value)
420 { /* Normal thresholds */ 420 { /* Normal thresholds */
421 if (check_critical_value == TRUE && counter_value >= critical_value) 421 if (check_critical_value && counter_value >= critical_value)
422 return_code = STATE_CRITICAL; 422 return_code = STATE_CRITICAL;
423 else if (check_warning_value == TRUE && counter_value >= warning_value) 423 else if (check_warning_value && counter_value >= warning_value)
424 return_code = STATE_WARNING; 424 return_code = STATE_WARNING;
425 else 425 else
426 return_code = STATE_OK; 426 return_code = STATE_OK;
@@ -428,9 +428,9 @@ int main(int argc, char **argv){
428 else 428 else
429 { /* inverse thresholds */ 429 { /* inverse thresholds */
430 return_code = STATE_OK; 430 return_code = STATE_OK;
431 if (check_critical_value == TRUE && counter_value <= critical_value) 431 if (check_critical_value && counter_value <= critical_value)
432 return_code = STATE_CRITICAL; 432 return_code = STATE_CRITICAL;
433 else if (check_warning_value == TRUE && counter_value <= warning_value) 433 else if (check_warning_value && counter_value <= warning_value)
434 return_code = STATE_WARNING; 434 return_code = STATE_WARNING;
435 } 435 }
436 break; 436 break;
@@ -448,17 +448,17 @@ int main(int argc, char **argv){
448 output_message = strdup (description); 448 output_message = strdup (description);
449 449
450 if (critical_value > warning_value) { /* Normal thresholds */ 450 if (critical_value > warning_value) { /* Normal thresholds */
451 if(check_critical_value==TRUE && age_in_minutes >= critical_value) 451 if(check_critical_value && age_in_minutes >= critical_value)
452 return_code=STATE_CRITICAL; 452 return_code=STATE_CRITICAL;
453 else if (check_warning_value==TRUE && age_in_minutes >= warning_value) 453 else if (check_warning_value && age_in_minutes >= warning_value)
454 return_code=STATE_WARNING; 454 return_code=STATE_WARNING;
455 else 455 else
456 return_code=STATE_OK; 456 return_code=STATE_OK;
457 } 457 }
458 else { /* inverse thresholds */ 458 else { /* inverse thresholds */
459 if(check_critical_value==TRUE && age_in_minutes <= critical_value) 459 if(check_critical_value && age_in_minutes <= critical_value)
460 return_code=STATE_CRITICAL; 460 return_code=STATE_CRITICAL;
461 else if (check_warning_value==TRUE && age_in_minutes <= warning_value) 461 else if (check_warning_value && age_in_minutes <= warning_value)
462 return_code=STATE_WARNING; 462 return_code=STATE_WARNING;
463 else 463 else
464 return_code=STATE_OK; 464 return_code=STATE_OK;
@@ -600,15 +600,15 @@ int process_arguments(int argc, char **argv){
600 break; 600 break;
601 case 'w': /* warning threshold */ 601 case 'w': /* warning threshold */
602 warning_value=strtoul(optarg,NULL,10); 602 warning_value=strtoul(optarg,NULL,10);
603 check_warning_value=TRUE; 603 check_warning_value=true;
604 break; 604 break;
605 case 'c': /* critical threshold */ 605 case 'c': /* critical threshold */
606 critical_value=strtoul(optarg,NULL,10); 606 critical_value=strtoul(optarg,NULL,10);
607 check_critical_value=TRUE; 607 check_critical_value=true;
608 break; 608 break;
609 case 'd': /* Display select for services */ 609 case 'd': /* Display select for services */
610 if (!strcmp(optarg,"SHOWALL")) 610 if (!strcmp(optarg,"SHOWALL"))
611 show_all = TRUE; 611 show_all = true;
612 break; 612 break;
613 case 'u': 613 case 'u':
614 socket_timeout_state=STATE_UNKNOWN; 614 socket_timeout_state=STATE_UNKNOWN;
@@ -646,7 +646,7 @@ void fetch_data (const char *address, int port, const char *sendb) {
646 die (STATE_UNKNOWN, "NSClient - %s\n",recv_buffer); 646 die (STATE_UNKNOWN, "NSClient - %s\n",recv_buffer);
647} 647}
648 648
649int strtoularray(unsigned long *array, char *string, const char *delim) { 649bool strtoularray(unsigned long *array, char *string, const char *delim) {
650 /* split a <delim> delimited string into a long array */ 650 /* split a <delim> delimited string into a long array */
651 int idx=0; 651 int idx=0;
652 char *t1; 652 char *t1;
@@ -660,9 +660,9 @@ int strtoularray(unsigned long *array, char *string, const char *delim) {
660 array[idx]=strtoul(t1,NULL,10); 660 array[idx]=strtoul(t1,NULL,10);
661 idx++; 661 idx++;
662 } else 662 } else
663 return FALSE; 663 return false;
664 } 664 }
665 return TRUE; 665 return true;
666} 666}
667 667
668void preparelist(char *string) { 668void preparelist(char *string) {
diff --git a/plugins/check_ntp.c b/plugins/check_ntp.c
index 36146505..61b2d699 100644
--- a/plugins/check_ntp.c
+++ b/plugins/check_ntp.c
@@ -40,10 +40,10 @@ const char *email = "devel@monitoring-plugins.org";
40 40
41static char *server_address=NULL; 41static char *server_address=NULL;
42static int verbose=0; 42static int verbose=0;
43static short do_offset=0; 43static bool do_offset = false;
44static char *owarn="60"; 44static char *owarn="60";
45static char *ocrit="120"; 45static char *ocrit="120";
46static short do_jitter=0; 46static bool do_jitter = false;
47static char *jwarn="5000"; 47static char *jwarn="5000";
48static char *jcrit="10000"; 48static char *jcrit="10000";
49 49
@@ -486,7 +486,7 @@ double offset_request(const char *host, int *status){
486 } 486 }
487 487
488 /* cleanup */ 488 /* cleanup */
489 /* FIXME: Not closing the socket to avoid re-use of the local port 489 /* FIXME: Not closing the socket to avoid reuse of the local port
490 * which can cause old NTP packets to be read instead of NTP control 490 * which can cause old NTP packets to be read instead of NTP control
491 * packets in jitter_request(). THERE MUST BE ANOTHER WAY... 491 * packets in jitter_request(). THERE MUST BE ANOTHER WAY...
492 * for(j=0; j<num_hosts; j++){ close(socklist[j]); } */ 492 * for(j=0; j<num_hosts; j++){ close(socklist[j]); } */
@@ -513,7 +513,8 @@ setup_control_request(ntp_control_message *p, uint8_t opcode, uint16_t seq){
513 513
514/* XXX handle responses with the error bit set */ 514/* XXX handle responses with the error bit set */
515double jitter_request(int *status){ 515double jitter_request(int *status){
516 int conn=-1, i, npeers=0, num_candidates=0, syncsource_found=0; 516 int conn=-1, i, npeers=0, num_candidates=0;
517 bool syncsource_found = false;
517 int run=0, min_peer_sel=PEER_INCLUDED, num_selected=0, num_valid=0; 518 int run=0, min_peer_sel=PEER_INCLUDED, num_selected=0, num_valid=0;
518 int peers_size=0, peer_offset=0; 519 int peers_size=0, peer_offset=0;
519 ntp_assoc_status_pair *peers=NULL; 520 ntp_assoc_status_pair *peers=NULL;
@@ -570,7 +571,7 @@ double jitter_request(int *status){
570 if (PEER_SEL(peers[i].status) >= PEER_INCLUDED){ 571 if (PEER_SEL(peers[i].status) >= PEER_INCLUDED){
571 num_candidates++; 572 num_candidates++;
572 if(PEER_SEL(peers[i].status) >= PEER_SYNCSOURCE){ 573 if(PEER_SEL(peers[i].status) >= PEER_SYNCSOURCE){
573 syncsource_found=1; 574 syncsource_found = true;
574 min_peer_sel=PEER_SYNCSOURCE; 575 min_peer_sel=PEER_SYNCSOURCE;
575 } 576 }
576 } 577 }
@@ -699,23 +700,23 @@ int process_arguments(int argc, char **argv){
699 verbose++; 700 verbose++;
700 break; 701 break;
701 case 'w': 702 case 'w':
702 do_offset=1; 703 do_offset = true;
703 owarn = optarg; 704 owarn = optarg;
704 break; 705 break;
705 case 'c': 706 case 'c':
706 do_offset=1; 707 do_offset = true;
707 ocrit = optarg; 708 ocrit = optarg;
708 break; 709 break;
709 case 'j': 710 case 'j':
710 do_jitter=1; 711 do_jitter = true;
711 jwarn = optarg; 712 jwarn = optarg;
712 break; 713 break;
713 case 'k': 714 case 'k':
714 do_jitter=1; 715 do_jitter = true;
715 jcrit = optarg; 716 jcrit = optarg;
716 break; 717 break;
717 case 'H': 718 case 'H':
718 if(is_host(optarg) == FALSE) 719 if(!is_host(optarg))
719 usage2(_("Invalid hostname/address"), optarg); 720 usage2(_("Invalid hostname/address"), optarg);
720 server_address = strdup(optarg); 721 server_address = strdup(optarg);
721 break; 722 break;
@@ -749,9 +750,9 @@ int process_arguments(int argc, char **argv){
749char *perfd_offset (double offset) 750char *perfd_offset (double offset)
750{ 751{
751 return fperfdata ("offset", offset, "s", 752 return fperfdata ("offset", offset, "s",
752 TRUE, offset_thresholds->warning->end, 753 true, offset_thresholds->warning->end,
753 TRUE, offset_thresholds->critical->end, 754 true, offset_thresholds->critical->end,
754 FALSE, 0, FALSE, 0); 755 false, 0, false, 0);
755} 756}
756 757
757char *perfd_jitter (double jitter) 758char *perfd_jitter (double jitter)
@@ -759,7 +760,7 @@ char *perfd_jitter (double jitter)
759 return fperfdata ("jitter", jitter, "s", 760 return fperfdata ("jitter", jitter, "s",
760 do_jitter, jitter_thresholds->warning->end, 761 do_jitter, jitter_thresholds->warning->end,
761 do_jitter, jitter_thresholds->critical->end, 762 do_jitter, jitter_thresholds->critical->end,
762 TRUE, 0, FALSE, 0); 763 true, 0, false, 0);
763} 764}
764 765
765int main(int argc, char *argv[]){ 766int main(int argc, char *argv[]){
diff --git a/plugins/check_ntp_peer.c b/plugins/check_ntp_peer.c
index 49cb1008..464a9e10 100644
--- a/plugins/check_ntp_peer.c
+++ b/plugins/check_ntp_peer.c
@@ -46,21 +46,20 @@ const char *email = "devel@monitoring-plugins.org";
46static char *server_address=NULL; 46static char *server_address=NULL;
47static int port=123; 47static int port=123;
48static int verbose=0; 48static int verbose=0;
49static int quiet=0; 49static bool quiet = false;
50static short do_offset=0;
51static char *owarn="60"; 50static char *owarn="60";
52static char *ocrit="120"; 51static char *ocrit="120";
53static short do_stratum=0; 52static bool do_stratum = false;
54static char *swarn="-1:16"; 53static char *swarn="-1:16";
55static char *scrit="-1:16"; 54static char *scrit="-1:16";
56static short do_jitter=0; 55static bool do_jitter = false;
57static char *jwarn="-1:5000"; 56static char *jwarn="-1:5000";
58static char *jcrit="-1:10000"; 57static char *jcrit="-1:10000";
59static short do_truechimers=0; 58static bool do_truechimers = false;
60static char *twarn="0:"; 59static char *twarn="0:";
61static char *tcrit="0:"; 60static char *tcrit="0:";
62static int syncsource_found=0; 61static bool syncsource_found = false;
63static int li_alarm=0; 62static bool li_alarm = false;
64 63
65int process_arguments (int, char **); 64int process_arguments (int, char **);
66thresholds *offset_thresholds = NULL; 65thresholds *offset_thresholds = NULL;
@@ -254,7 +253,7 @@ int ntp_request(double *offset, int *offset_result, double *jitter, int *stratum
254 die(STATE_CRITICAL, "NTP CRITICAL: Invalid packet received from NTP server\n"); 253 die(STATE_CRITICAL, "NTP CRITICAL: Invalid packet received from NTP server\n");
255 } while (!(req.op&OP_READSTAT && ntohs(req.seq) == 1)); 254 } while (!(req.op&OP_READSTAT && ntohs(req.seq) == 1));
256 255
257 if (LI(req.flags) == LI_ALARM) li_alarm = 1; 256 if (LI(req.flags) == LI_ALARM) li_alarm = true;
258 /* Each peer identifier is 4 bytes in the data section, which 257 /* Each peer identifier is 4 bytes in the data section, which
259 * we represent as a ntp_assoc_status_pair datatype. 258 * we represent as a ntp_assoc_status_pair datatype.
260 */ 259 */
@@ -276,7 +275,7 @@ int ntp_request(double *offset, int *offset_result, double *jitter, int *stratum
276 if(PEER_SEL(peers[i].status) >= PEER_INCLUDED){ 275 if(PEER_SEL(peers[i].status) >= PEER_INCLUDED){
277 num_candidates++; 276 num_candidates++;
278 if(PEER_SEL(peers[i].status) >= PEER_SYNCSOURCE){ 277 if(PEER_SEL(peers[i].status) >= PEER_SYNCSOURCE){
279 syncsource_found=1; 278 syncsource_found = true;
280 min_peer_sel=PEER_SYNCSOURCE; 279 min_peer_sel=PEER_SYNCSOURCE;
281 } 280 }
282 } 281 }
@@ -440,7 +439,7 @@ int process_arguments(int argc, char **argv){
440 if (argc < 2) 439 if (argc < 2)
441 usage ("\n"); 440 usage ("\n");
442 441
443 while (1) { 442 while (true) {
444 c = getopt_long (argc, argv, "Vhv46qw:c:W:C:j:k:m:n:t:H:p:", longopts, &option); 443 c = getopt_long (argc, argv, "Vhv46qw:c:W:C:j:k:m:n:t:H:p:", longopts, &option);
445 if (c == -1 || c == EOF || c == 1) 444 if (c == -1 || c == EOF || c == 1)
446 break; 445 break;
@@ -458,42 +457,40 @@ int process_arguments(int argc, char **argv){
458 verbose++; 457 verbose++;
459 break; 458 break;
460 case 'q': 459 case 'q':
461 quiet = 1; 460 quiet = true;
462 break; 461 break;
463 case 'w': 462 case 'w':
464 do_offset=1;
465 owarn = optarg; 463 owarn = optarg;
466 break; 464 break;
467 case 'c': 465 case 'c':
468 do_offset=1;
469 ocrit = optarg; 466 ocrit = optarg;
470 break; 467 break;
471 case 'W': 468 case 'W':
472 do_stratum=1; 469 do_stratum = true;
473 swarn = optarg; 470 swarn = optarg;
474 break; 471 break;
475 case 'C': 472 case 'C':
476 do_stratum=1; 473 do_stratum = true;
477 scrit = optarg; 474 scrit = optarg;
478 break; 475 break;
479 case 'j': 476 case 'j':
480 do_jitter=1; 477 do_jitter = true;
481 jwarn = optarg; 478 jwarn = optarg;
482 break; 479 break;
483 case 'k': 480 case 'k':
484 do_jitter=1; 481 do_jitter = true;
485 jcrit = optarg; 482 jcrit = optarg;
486 break; 483 break;
487 case 'm': 484 case 'm':
488 do_truechimers=1; 485 do_truechimers = true;
489 twarn = optarg; 486 twarn = optarg;
490 break; 487 break;
491 case 'n': 488 case 'n':
492 do_truechimers=1; 489 do_truechimers = true;
493 tcrit = optarg; 490 tcrit = optarg;
494 break; 491 break;
495 case 'H': 492 case 'H':
496 if(is_host(optarg) == FALSE) 493 if(!is_host(optarg))
497 usage2(_("Invalid hostname/address"), optarg); 494 usage2(_("Invalid hostname/address"), optarg);
498 server_address = strdup(optarg); 495 server_address = strdup(optarg);
499 break; 496 break;
@@ -530,9 +527,9 @@ int process_arguments(int argc, char **argv){
530char *perfd_offset (double offset) 527char *perfd_offset (double offset)
531{ 528{
532 return fperfdata ("offset", offset, "s", 529 return fperfdata ("offset", offset, "s",
533 TRUE, offset_thresholds->warning->end, 530 true, offset_thresholds->warning->end,
534 TRUE, offset_thresholds->critical->end, 531 true, offset_thresholds->critical->end,
535 FALSE, 0, FALSE, 0); 532 false, 0, false, 0);
536} 533}
537 534
538char *perfd_jitter (double jitter) 535char *perfd_jitter (double jitter)
@@ -540,7 +537,7 @@ char *perfd_jitter (double jitter)
540 return fperfdata ("jitter", jitter, "", 537 return fperfdata ("jitter", jitter, "",
541 do_jitter, jitter_thresholds->warning->end, 538 do_jitter, jitter_thresholds->warning->end,
542 do_jitter, jitter_thresholds->critical->end, 539 do_jitter, jitter_thresholds->critical->end,
543 TRUE, 0, FALSE, 0); 540 true, 0, false, 0);
544} 541}
545 542
546char *perfd_stratum (int stratum) 543char *perfd_stratum (int stratum)
@@ -548,7 +545,7 @@ char *perfd_stratum (int stratum)
548 return perfdata ("stratum", stratum, "", 545 return perfdata ("stratum", stratum, "",
549 do_stratum, (int)stratum_thresholds->warning->end, 546 do_stratum, (int)stratum_thresholds->warning->end,
550 do_stratum, (int)stratum_thresholds->critical->end, 547 do_stratum, (int)stratum_thresholds->critical->end,
551 TRUE, 0, TRUE, 16); 548 true, 0, true, 16);
552} 549}
553 550
554char *perfd_truechimers (int num_truechimers) 551char *perfd_truechimers (int num_truechimers)
@@ -556,11 +553,11 @@ char *perfd_truechimers (int num_truechimers)
556 return perfdata ("truechimers", num_truechimers, "", 553 return perfdata ("truechimers", num_truechimers, "",
557 do_truechimers, (int)truechimer_thresholds->warning->end, 554 do_truechimers, (int)truechimer_thresholds->warning->end,
558 do_truechimers, (int)truechimer_thresholds->critical->end, 555 do_truechimers, (int)truechimer_thresholds->critical->end,
559 TRUE, 0, FALSE, 0); 556 true, 0, false, 0);
560} 557}
561 558
562int main(int argc, char *argv[]){ 559int main(int argc, char *argv[]){
563 int result, offset_result, stratum, num_truechimers, oresult, jresult, sresult, tresult; 560 int result, offset_result, stratum, num_truechimers;
564 double offset=0, jitter=0; 561 double offset=0, jitter=0;
565 char *result_line, *perfdata_line; 562 char *result_line, *perfdata_line;
566 563
@@ -590,25 +587,35 @@ int main(int argc, char *argv[]){
590 587
591 if(offset_result == STATE_UNKNOWN) { 588 if(offset_result == STATE_UNKNOWN) {
592 /* if there's no sync peer (this overrides ntp_request output): */ 589 /* if there's no sync peer (this overrides ntp_request output): */
593 result = (quiet == 1 ? STATE_UNKNOWN : STATE_CRITICAL); 590 result = (quiet ? STATE_UNKNOWN : STATE_CRITICAL);
594 } else { 591 } else {
595 /* Be quiet if there's no candidates either */ 592 /* Be quiet if there's no candidates either */
596 if (quiet == 1 && result == STATE_WARNING) 593 if (quiet && result == STATE_WARNING)
597 result = STATE_UNKNOWN; 594 result = STATE_UNKNOWN;
598 result = max_state_alt(result, get_status(fabs(offset), offset_thresholds)); 595 result = max_state_alt(result, get_status(fabs(offset), offset_thresholds));
599 } 596 }
600 oresult = result; 597
598 int oresult = result;
599
600
601 int tresult = STATE_UNKNOWN;
601 602
602 if(do_truechimers) { 603 if(do_truechimers) {
603 tresult = get_status(num_truechimers, truechimer_thresholds); 604 tresult = get_status(num_truechimers, truechimer_thresholds);
604 result = max_state_alt(result, tresult); 605 result = max_state_alt(result, tresult);
605 } 606 }
606 607
608
609 int sresult = STATE_UNKNOWN;
610
607 if(do_stratum) { 611 if(do_stratum) {
608 sresult = get_status(stratum, stratum_thresholds); 612 sresult = get_status(stratum, stratum_thresholds);
609 result = max_state_alt(result, sresult); 613 result = max_state_alt(result, sresult);
610 } 614 }
611 615
616
617 int jresult = STATE_UNKNOWN;
618
612 if(do_jitter) { 619 if(do_jitter) {
613 jresult = get_status(jitter, jitter_thresholds); 620 jresult = get_status(jitter, jitter_thresholds);
614 result = max_state_alt(result, jresult); 621 result = max_state_alt(result, jresult);
diff --git a/plugins/check_ntp_time.c b/plugins/check_ntp_time.c
index 46cc604f..b2e16556 100644
--- a/plugins/check_ntp_time.c
+++ b/plugins/check_ntp_time.c
@@ -45,7 +45,7 @@ const char *email = "devel@monitoring-plugins.org";
45static char *server_address=NULL; 45static char *server_address=NULL;
46static char *port="123"; 46static char *port="123";
47static int verbose=0; 47static int verbose=0;
48static int quiet=0; 48static bool quiet = false;
49static char *owarn="60"; 49static char *owarn="60";
50static char *ocrit="120"; 50static char *ocrit="120";
51static int time_offset=0; 51static int time_offset=0;
@@ -485,7 +485,7 @@ int process_arguments(int argc, char **argv){
485 verbose++; 485 verbose++;
486 break; 486 break;
487 case 'q': 487 case 'q':
488 quiet = 1; 488 quiet = true;
489 break; 489 break;
490 case 'w': 490 case 'w':
491 owarn = optarg; 491 owarn = optarg;
@@ -494,7 +494,7 @@ int process_arguments(int argc, char **argv){
494 ocrit = optarg; 494 ocrit = optarg;
495 break; 495 break;
496 case 'H': 496 case 'H':
497 if(is_host(optarg) == FALSE) 497 if(!is_host(optarg))
498 usage2(_("Invalid hostname/address"), optarg); 498 usage2(_("Invalid hostname/address"), optarg);
499 server_address = strdup(optarg); 499 server_address = strdup(optarg);
500 break; 500 break;
@@ -531,12 +531,11 @@ int process_arguments(int argc, char **argv){
531 return 0; 531 return 0;
532} 532}
533 533
534char *perfd_offset (double offset) 534char *perfd_offset (double offset) {
535{
536 return fperfdata ("offset", offset, "s", 535 return fperfdata ("offset", offset, "s",
537 TRUE, offset_thresholds->warning->end, 536 true, offset_thresholds->warning->end,
538 TRUE, offset_thresholds->critical->end, 537 true, offset_thresholds->critical->end,
539 FALSE, 0, FALSE, 0); 538 false, 0, false, 0);
540} 539}
541 540
542int main(int argc, char *argv[]){ 541int main(int argc, char *argv[]){
@@ -566,7 +565,7 @@ int main(int argc, char *argv[]){
566 565
567 offset = offset_request(server_address, &offset_result); 566 offset = offset_request(server_address, &offset_result);
568 if (offset_result == STATE_UNKNOWN) { 567 if (offset_result == STATE_UNKNOWN) {
569 result = (quiet == 1 ? STATE_UNKNOWN : STATE_CRITICAL); 568 result = ( (!quiet) ? STATE_UNKNOWN : STATE_CRITICAL);
570 } else { 569 } else {
571 result = get_status(fabs(offset), offset_thresholds); 570 result = get_status(fabs(offset), offset_thresholds);
572 } 571 }
diff --git a/plugins/check_nwstat.c b/plugins/check_nwstat.c
index 3c9d23e2..10c493b6 100644
--- a/plugins/check_nwstat.c
+++ b/plugins/check_nwstat.c
@@ -46,6 +46,7 @@ enum checkvar {
46 VPF, /* check % free space on volume */ 46 VPF, /* check % free space on volume */
47 VMF, /* check MB free space on volume */ 47 VMF, /* check MB free space on volume */
48 VMU, /* check MB used space on volume */ 48 VMU, /* check MB used space on volume */
49 VPU, /* check % used space on volume */
49 VMP, /* check MB purgeable space on volume */ 50 VMP, /* check MB purgeable space on volume */
50 VKF, /* check KB free space on volume */ 51 VKF, /* check KB free space on volume */
51 LTCH, /* check long-term cache hit percentage */ 52 LTCH, /* check long-term cache hit percentage */
@@ -104,9 +105,9 @@ char *nss7_name=NULL;
104int server_port=PORT; 105int server_port=PORT;
105unsigned long warning_value=0L; 106unsigned long warning_value=0L;
106unsigned long critical_value=0L; 107unsigned long critical_value=0L;
107int check_warning_value=FALSE; 108bool check_warning_value = false;
108int check_critical_value=FALSE; 109bool check_critical_value = false;
109int check_netware_version=FALSE; 110bool check_netware_version = false;
110enum checkvar vars_to_check = NONE; 111enum checkvar vars_to_check = NONE;
111int sap_number=-1; 112int sap_number=-1;
112 113
@@ -146,6 +147,8 @@ main(int argc, char **argv) {
146 unsigned long nss6_value=0L; 147 unsigned long nss6_value=0L;
147 unsigned long nss7_value=0L; 148 unsigned long nss7_value=0L;
148 unsigned long total_disk_space=0L; 149 unsigned long total_disk_space=0L;
150 unsigned long used_disk_space=0L;
151 unsigned long percent_used_disk_space=0L;
149 unsigned long purgeable_disk_space=0L; 152 unsigned long purgeable_disk_space=0L;
150 unsigned long non_purgeable_disk_space=0L; 153 unsigned long non_purgeable_disk_space=0L;
151 unsigned long percent_free_space=0; 154 unsigned long percent_free_space=0;
@@ -182,7 +185,7 @@ main(int argc, char **argv) {
182 my_tcp_connect (server_address, server_port, &sd); 185 my_tcp_connect (server_address, server_port, &sd);
183 186
184 /* get OS version string */ 187 /* get OS version string */
185 if (check_netware_version==TRUE) { 188 if (check_netware_version) {
186 send_buffer = strdup ("S19\r\n"); 189 send_buffer = strdup ("S19\r\n");
187 result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer)); 190 result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
188 if (result!=STATE_OK) 191 if (result!=STATE_OK)
@@ -231,9 +234,9 @@ main(int argc, char **argv) {
231 recv_buffer[strlen(recv_buffer)-1]=0; 234 recv_buffer[strlen(recv_buffer)-1]=0;
232 sprintf(uptime,_("Up %s,"),recv_buffer); 235 sprintf(uptime,_("Up %s,"),recv_buffer);
233 236
234 if (check_critical_value==TRUE && utilization >= critical_value) 237 if (check_critical_value && utilization >= critical_value)
235 result=STATE_CRITICAL; 238 result=STATE_CRITICAL;
236 else if (check_warning_value==TRUE && utilization >= warning_value) 239 else if (check_warning_value && utilization >= warning_value)
237 result=STATE_WARNING; 240 result=STATE_WARNING;
238 241
239 xasprintf (&output_message, 242 xasprintf (&output_message,
@@ -259,9 +262,9 @@ main(int argc, char **argv) {
259 return result; 262 return result;
260 current_connections=strtoul(recv_buffer,NULL,10); 263 current_connections=strtoul(recv_buffer,NULL,10);
261 264
262 if (check_critical_value==TRUE && current_connections >= critical_value) 265 if (check_critical_value && current_connections >= critical_value)
263 result=STATE_CRITICAL; 266 result=STATE_CRITICAL;
264 else if (check_warning_value==TRUE && current_connections >= warning_value) 267 else if (check_warning_value && current_connections >= warning_value)
265 result=STATE_WARNING; 268 result=STATE_WARNING;
266 269
267 xasprintf (&output_message, 270 xasprintf (&output_message,
@@ -284,9 +287,9 @@ main(int argc, char **argv) {
284 return result; 287 return result;
285 cache_hits=atoi(recv_buffer); 288 cache_hits=atoi(recv_buffer);
286 289
287 if (check_critical_value==TRUE && cache_hits <= critical_value) 290 if (check_critical_value && cache_hits <= critical_value)
288 result=STATE_CRITICAL; 291 result=STATE_CRITICAL;
289 else if (check_warning_value==TRUE && cache_hits <= warning_value) 292 else if (check_warning_value && cache_hits <= warning_value)
290 result=STATE_WARNING; 293 result=STATE_WARNING;
291 294
292 xasprintf (&output_message, 295 xasprintf (&output_message,
@@ -306,9 +309,9 @@ main(int argc, char **argv) {
306 return result; 309 return result;
307 cache_buffers=strtoul(recv_buffer,NULL,10); 310 cache_buffers=strtoul(recv_buffer,NULL,10);
308 311
309 if (check_critical_value==TRUE && cache_buffers <= critical_value) 312 if (check_critical_value && cache_buffers <= critical_value)
310 result=STATE_CRITICAL; 313 result=STATE_CRITICAL;
311 else if (check_warning_value==TRUE && cache_buffers <= warning_value) 314 else if (check_warning_value && cache_buffers <= warning_value)
312 result=STATE_WARNING; 315 result=STATE_WARNING;
313 316
314 xasprintf (&output_message, 317 xasprintf (&output_message,
@@ -331,9 +334,9 @@ main(int argc, char **argv) {
331 return result; 334 return result;
332 cache_buffers=strtoul(recv_buffer,NULL,10); 335 cache_buffers=strtoul(recv_buffer,NULL,10);
333 336
334 if (check_critical_value==TRUE && cache_buffers >= critical_value) 337 if (check_critical_value && cache_buffers >= critical_value)
335 result=STATE_CRITICAL; 338 result=STATE_CRITICAL;
336 else if (check_warning_value==TRUE && cache_buffers >= warning_value) 339 else if (check_warning_value && cache_buffers >= warning_value)
337 result=STATE_WARNING; 340 result=STATE_WARNING;
338 341
339 xasprintf (&output_message, 342 xasprintf (&output_message,
@@ -356,9 +359,9 @@ main(int argc, char **argv) {
356 return result; 359 return result;
357 lru_time=strtoul(recv_buffer,NULL,10); 360 lru_time=strtoul(recv_buffer,NULL,10);
358 361
359 if (check_critical_value==TRUE && lru_time <= critical_value) 362 if (check_critical_value && lru_time <= critical_value)
360 result=STATE_CRITICAL; 363 result=STATE_CRITICAL;
361 else if (check_warning_value==TRUE && lru_time <= warning_value) 364 else if (check_warning_value && lru_time <= warning_value)
362 result=STATE_WARNING; 365 result=STATE_WARNING;
363 366
364 xasprintf (&output_message, 367 xasprintf (&output_message,
@@ -383,9 +386,9 @@ main(int argc, char **argv) {
383 result=STATE_CRITICAL; 386 result=STATE_CRITICAL;
384 } else { 387 } else {
385 free_disk_space=strtoul(recv_buffer,NULL,10); 388 free_disk_space=strtoul(recv_buffer,NULL,10);
386 if (check_critical_value==TRUE && free_disk_space <= critical_value) 389 if (check_critical_value && free_disk_space <= critical_value)
387 result=STATE_CRITICAL; 390 result=STATE_CRITICAL;
388 else if (check_warning_value==TRUE && free_disk_space <= warning_value) 391 else if (check_warning_value && free_disk_space <= warning_value)
389 result=STATE_WARNING; 392 result=STATE_WARNING;
390 xasprintf (&output_message, 393 xasprintf (&output_message,
391 _("%s%lu KB free on volume %s|KBFree%s=%lu;%lu;%lu;;"), 394 _("%s%lu KB free on volume %s|KBFree%s=%lu;%lu;%lu;;"),
@@ -411,9 +414,9 @@ main(int argc, char **argv) {
411 result=STATE_CRITICAL; 414 result=STATE_CRITICAL;
412 } else { 415 } else {
413 free_disk_space=strtoul(recv_buffer,NULL,10); 416 free_disk_space=strtoul(recv_buffer,NULL,10);
414 if (check_critical_value==TRUE && free_disk_space <= critical_value) 417 if (check_critical_value && free_disk_space <= critical_value)
415 result=STATE_CRITICAL; 418 result=STATE_CRITICAL;
416 else if (check_warning_value==TRUE && free_disk_space <= warning_value) 419 else if (check_warning_value && free_disk_space <= warning_value)
417 result=STATE_WARNING; 420 result=STATE_WARNING;
418 xasprintf (&output_message, 421 xasprintf (&output_message,
419 _("%s%lu MB free on volume %s|MBFree%s=%lu;%lu;%lu;;"), 422 _("%s%lu MB free on volume %s|MBFree%s=%lu;%lu;%lu;;"),
@@ -438,9 +441,9 @@ main(int argc, char **argv) {
438 result=STATE_CRITICAL; 441 result=STATE_CRITICAL;
439 } else { 442 } else {
440 free_disk_space=strtoul(recv_buffer,NULL,10); 443 free_disk_space=strtoul(recv_buffer,NULL,10);
441 if (check_critical_value==TRUE && free_disk_space <= critical_value) 444 if (check_critical_value && free_disk_space <= critical_value)
442 result=STATE_CRITICAL; 445 result=STATE_CRITICAL;
443 else if (check_warning_value==TRUE && free_disk_space <= warning_value) 446 else if (check_warning_value && free_disk_space <= warning_value)
444 result=STATE_WARNING; 447 result=STATE_WARNING;
445 xasprintf (&output_message, 448 xasprintf (&output_message,
446 _("%s%lu MB used on volume %s|MBUsed%s=%lu;%lu;%lu;;"), 449 _("%s%lu MB used on volume %s|MBUsed%s=%lu;%lu;%lu;;"),
@@ -452,7 +455,50 @@ main(int argc, char **argv) {
452 warning_value, 455 warning_value,
453 critical_value); 456 critical_value);
454 } 457 }
458 /* check % used space on volume */
459 } else if (vars_to_check==VPU) {
460 close(sd);
461 my_tcp_connect (server_address, server_port, &sd);
462
463 asprintf (&send_buffer,"VMU%s\r\n",volume_name);
464 result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
465
466 if (result!=STATE_OK)
467 return result;
468
469 if (!strcmp(recv_buffer,"-1\n")) {
470 asprintf (&output_message,_("CRITICAL - Volume '%s' does not exist!"),volume_name);
471 result=STATE_CRITICAL;
472
473 } else {
474 used_disk_space=strtoul(recv_buffer,NULL,10);
475 close(sd);
476 my_tcp_connect (server_address, server_port, &sd);
477 /* get total volume in MB */
478 asprintf (&send_buffer,"VMS%s\r\n",volume_name);
479 result=send_tcp_request(sd,send_buffer,recv_buffer,sizeof(recv_buffer));
480 if (result!=STATE_OK)
481 return result;
482 total_disk_space=strtoul(recv_buffer,NULL,10);
483 /* calculate percent used on volume */
484 percent_used_disk_space=(unsigned long)(((double)used_disk_space/(double)total_disk_space)*100.0);
455 485
486 if (check_critical_value && percent_used_disk_space >= critical_value)
487 result=STATE_CRITICAL;
488 else if (check_warning_value && percent_used_disk_space >= warning_value)
489 result=STATE_WARNING;
490
491 asprintf (&output_message,_("%lu MB (%lu%%) used on volume %s - total %lu MB|Used space in percent on %s=%lu;%lu;%lu;0;100"),
492 used_disk_space,
493 percent_used_disk_space,
494 volume_name,
495 total_disk_space,
496 volume_name,
497 percent_used_disk_space,
498 warning_value,
499 critical_value
500 );
501 }
456 502
457 /* check % free space on volume */ 503 /* check % free space on volume */
458 } else if (vars_to_check==VPF) { 504 } else if (vars_to_check==VPF) {
@@ -485,9 +531,9 @@ main(int argc, char **argv) {
485 531
486 percent_free_space=(unsigned long)(((double)free_disk_space/(double)total_disk_space)*100.0); 532 percent_free_space=(unsigned long)(((double)free_disk_space/(double)total_disk_space)*100.0);
487 533
488 if (check_critical_value==TRUE && percent_free_space <= critical_value) 534 if (check_critical_value && percent_free_space <= critical_value)
489 result=STATE_CRITICAL; 535 result=STATE_CRITICAL;
490 else if (check_warning_value==TRUE && percent_free_space <= warning_value) 536 else if (check_warning_value && percent_free_space <= warning_value)
491 result=STATE_WARNING; 537 result=STATE_WARNING;
492 free_disk_space/=1024; 538 free_disk_space/=1024;
493 total_disk_space/=1024; 539 total_disk_space/=1024;
@@ -596,14 +642,14 @@ main(int argc, char **argv) {
596 percent_used_packet_receive_buffers=(unsigned long)(((double)used_packet_receive_buffers/(double)max_packet_receive_buffers)*100.0); 642 percent_used_packet_receive_buffers=(unsigned long)(((double)used_packet_receive_buffers/(double)max_packet_receive_buffers)*100.0);
597 643
598 if (vars_to_check==UPRB) { 644 if (vars_to_check==UPRB) {
599 if (check_critical_value==TRUE && used_packet_receive_buffers >= critical_value) 645 if (check_critical_value && used_packet_receive_buffers >= critical_value)
600 result=STATE_CRITICAL; 646 result=STATE_CRITICAL;
601 else if (check_warning_value==TRUE && used_packet_receive_buffers >= warning_value) 647 else if (check_warning_value && used_packet_receive_buffers >= warning_value)
602 result=STATE_WARNING; 648 result=STATE_WARNING;
603 } else { 649 } else {
604 if (check_critical_value==TRUE && percent_used_packet_receive_buffers >= critical_value) 650 if (check_critical_value && percent_used_packet_receive_buffers >= critical_value)
605 result=STATE_CRITICAL; 651 result=STATE_CRITICAL;
606 else if (check_warning_value==TRUE && percent_used_packet_receive_buffers >= warning_value) 652 else if (check_warning_value && percent_used_packet_receive_buffers >= warning_value)
607 result=STATE_WARNING; 653 result=STATE_WARNING;
608 } 654 }
609 655
@@ -625,9 +671,9 @@ main(int argc, char **argv) {
625 671
626 sap_entries=atoi(recv_buffer); 672 sap_entries=atoi(recv_buffer);
627 673
628 if (check_critical_value==TRUE && sap_entries >= critical_value) 674 if (check_critical_value && sap_entries >= critical_value)
629 result=STATE_CRITICAL; 675 result=STATE_CRITICAL;
630 else if (check_warning_value==TRUE && sap_entries >= warning_value) 676 else if (check_warning_value && sap_entries >= warning_value)
631 result=STATE_WARNING; 677 result=STATE_WARNING;
632 678
633 if (sap_number==-1) 679 if (sap_number==-1)
@@ -651,9 +697,9 @@ main(int argc, char **argv) {
651 result=STATE_CRITICAL; 697 result=STATE_CRITICAL;
652 } else { 698 } else {
653 purgeable_disk_space=strtoul(recv_buffer,NULL,10); 699 purgeable_disk_space=strtoul(recv_buffer,NULL,10);
654 if (check_critical_value==TRUE && purgeable_disk_space >= critical_value) 700 if (check_critical_value && purgeable_disk_space >= critical_value)
655 result=STATE_CRITICAL; 701 result=STATE_CRITICAL;
656 else if (check_warning_value==TRUE && purgeable_disk_space >= warning_value) 702 else if (check_warning_value && purgeable_disk_space >= warning_value)
657 result=STATE_WARNING; 703 result=STATE_WARNING;
658 xasprintf (&output_message,_("%s%lu KB purgeable on volume %s|Purge%s=%lu;%lu;%lu;;"), 704 xasprintf (&output_message,_("%s%lu KB purgeable on volume %s|Purge%s=%lu;%lu;%lu;;"),
659 (result==STATE_OK)?"":_("Only "), 705 (result==STATE_OK)?"":_("Only "),
@@ -677,9 +723,9 @@ main(int argc, char **argv) {
677 result=STATE_CRITICAL; 723 result=STATE_CRITICAL;
678 } else { 724 } else {
679 purgeable_disk_space=strtoul(recv_buffer,NULL,10); 725 purgeable_disk_space=strtoul(recv_buffer,NULL,10);
680 if (check_critical_value==TRUE && purgeable_disk_space >= critical_value) 726 if (check_critical_value && purgeable_disk_space >= critical_value)
681 result=STATE_CRITICAL; 727 result=STATE_CRITICAL;
682 else if (check_warning_value==TRUE && purgeable_disk_space >= warning_value) 728 else if (check_warning_value && purgeable_disk_space >= warning_value)
683 result=STATE_WARNING; 729 result=STATE_WARNING;
684 xasprintf (&output_message,_("%s%lu MB purgeable on volume %s|Purge%s=%lu;%lu;%lu;;"), 730 xasprintf (&output_message,_("%s%lu MB purgeable on volume %s|Purge%s=%lu;%lu;%lu;;"),
685 (result==STATE_OK)?"":_("Only "), 731 (result==STATE_OK)?"":_("Only "),
@@ -722,9 +768,9 @@ main(int argc, char **argv) {
722 768
723 percent_purgeable_space=(unsigned long)(((double)purgeable_disk_space/(double)total_disk_space)*100.0); 769 percent_purgeable_space=(unsigned long)(((double)purgeable_disk_space/(double)total_disk_space)*100.0);
724 770
725 if (check_critical_value==TRUE && percent_purgeable_space >= critical_value) 771 if (check_critical_value && percent_purgeable_space >= critical_value)
726 result=STATE_CRITICAL; 772 result=STATE_CRITICAL;
727 else if (check_warning_value==TRUE && percent_purgeable_space >= warning_value) 773 else if (check_warning_value && percent_purgeable_space >= warning_value)
728 result=STATE_WARNING; 774 result=STATE_WARNING;
729 purgeable_disk_space/=1024; 775 purgeable_disk_space/=1024;
730 xasprintf (&output_message,_("%lu MB (%lu%%) purgeable on volume %s|Purgeable%s=%lu;%lu;%lu;0;100"), 776 xasprintf (&output_message,_("%lu MB (%lu%%) purgeable on volume %s|Purgeable%s=%lu;%lu;%lu;0;100"),
@@ -754,9 +800,9 @@ main(int argc, char **argv) {
754 result=STATE_CRITICAL; 800 result=STATE_CRITICAL;
755 } else { 801 } else {
756 non_purgeable_disk_space=strtoul(recv_buffer,NULL,10); 802 non_purgeable_disk_space=strtoul(recv_buffer,NULL,10);
757 if (check_critical_value==TRUE && non_purgeable_disk_space >= critical_value) 803 if (check_critical_value && non_purgeable_disk_space >= critical_value)
758 result=STATE_CRITICAL; 804 result=STATE_CRITICAL;
759 else if (check_warning_value==TRUE && non_purgeable_disk_space >= warning_value) 805 else if (check_warning_value && non_purgeable_disk_space >= warning_value)
760 result=STATE_WARNING; 806 result=STATE_WARNING;
761 xasprintf (&output_message,_("%s%lu KB not yet purgeable on volume %s"),(result==STATE_OK)?"":_("Only "),non_purgeable_disk_space,volume_name); 807 xasprintf (&output_message,_("%s%lu KB not yet purgeable on volume %s"),(result==STATE_OK)?"":_("Only "),non_purgeable_disk_space,volume_name);
762 } 808 }
@@ -792,9 +838,9 @@ main(int argc, char **argv) {
792 838
793 percent_non_purgeable_space=(unsigned long)(((double)non_purgeable_disk_space/(double)total_disk_space)*100.0); 839 percent_non_purgeable_space=(unsigned long)(((double)non_purgeable_disk_space/(double)total_disk_space)*100.0);
794 840
795 if (check_critical_value==TRUE && percent_non_purgeable_space >= critical_value) 841 if (check_critical_value && percent_non_purgeable_space >= critical_value)
796 result=STATE_CRITICAL; 842 result=STATE_CRITICAL;
797 else if (check_warning_value==TRUE && percent_non_purgeable_space >= warning_value) 843 else if (check_warning_value && percent_non_purgeable_space >= warning_value)
798 result=STATE_WARNING; 844 result=STATE_WARNING;
799 purgeable_disk_space/=1024; 845 purgeable_disk_space/=1024;
800 xasprintf (&output_message,_("%lu MB (%lu%%) not yet purgeable on volume %s"),non_purgeable_disk_space,percent_non_purgeable_space,volume_name); 846 xasprintf (&output_message,_("%lu MB (%lu%%) not yet purgeable on volume %s"),non_purgeable_disk_space,percent_non_purgeable_space,volume_name);
@@ -813,9 +859,9 @@ main(int argc, char **argv) {
813 859
814 open_files=atoi(recv_buffer); 860 open_files=atoi(recv_buffer);
815 861
816 if (check_critical_value==TRUE && open_files >= critical_value) 862 if (check_critical_value && open_files >= critical_value)
817 result=STATE_CRITICAL; 863 result=STATE_CRITICAL;
818 else if (check_warning_value==TRUE && open_files >= warning_value) 864 else if (check_warning_value && open_files >= warning_value)
819 result=STATE_WARNING; 865 result=STATE_WARNING;
820 866
821 xasprintf (&output_message,_("%lu open files|Openfiles=%lu;%lu;%lu;0,0"), 867 xasprintf (&output_message,_("%lu open files|Openfiles=%lu;%lu;%lu;0,0"),
@@ -838,9 +884,9 @@ main(int argc, char **argv) {
838 884
839 abended_threads=atoi(recv_buffer); 885 abended_threads=atoi(recv_buffer);
840 886
841 if (check_critical_value==TRUE && abended_threads >= critical_value) 887 if (check_critical_value && abended_threads >= critical_value)
842 result=STATE_CRITICAL; 888 result=STATE_CRITICAL;
843 else if (check_warning_value==TRUE && abended_threads >= warning_value) 889 else if (check_warning_value && abended_threads >= warning_value)
844 result=STATE_WARNING; 890 result=STATE_WARNING;
845 891
846 xasprintf (&output_message,_("%lu abended threads|Abends=%lu;%lu;%lu;;"), 892 xasprintf (&output_message,_("%lu abended threads|Abends=%lu;%lu;%lu;;"),
@@ -872,9 +918,9 @@ main(int argc, char **argv) {
872 918
873 current_service_processes=atoi(recv_buffer); 919 current_service_processes=atoi(recv_buffer);
874 920
875 if (check_critical_value==TRUE && current_service_processes >= critical_value) 921 if (check_critical_value && current_service_processes >= critical_value)
876 result=STATE_CRITICAL; 922 result=STATE_CRITICAL;
877 else if (check_warning_value==TRUE && current_service_processes >= warning_value) 923 else if (check_warning_value && current_service_processes >= warning_value)
878 result=STATE_WARNING; 924 result=STATE_WARNING;
879 925
880 xasprintf (&output_message, 926 xasprintf (&output_message,
@@ -923,9 +969,9 @@ main(int argc, char **argv) {
923 return result; 969 return result;
924 lru_time=strtoul(recv_buffer,NULL,10); 970 lru_time=strtoul(recv_buffer,NULL,10);
925 971
926 if (check_critical_value==TRUE && lru_time <= critical_value) 972 if (check_critical_value && lru_time <= critical_value)
927 result=STATE_CRITICAL; 973 result=STATE_CRITICAL;
928 else if (check_warning_value==TRUE && lru_time <= warning_value) 974 else if (check_warning_value && lru_time <= warning_value)
929 result=STATE_WARNING; 975 result=STATE_WARNING;
930 xasprintf (&output_message,_("LRU sitting time = %lu seconds"),lru_time); 976 xasprintf (&output_message,_("LRU sitting time = %lu seconds"),lru_time);
931 977
@@ -942,9 +988,9 @@ main(int argc, char **argv) {
942 return result; 988 return result;
943 dirty_cache_buffers=atoi(recv_buffer); 989 dirty_cache_buffers=atoi(recv_buffer);
944 990
945 if (check_critical_value==TRUE && dirty_cache_buffers <= critical_value) 991 if (check_critical_value && dirty_cache_buffers <= critical_value)
946 result=STATE_CRITICAL; 992 result=STATE_CRITICAL;
947 else if (check_warning_value==TRUE && dirty_cache_buffers <= warning_value) 993 else if (check_warning_value && dirty_cache_buffers <= warning_value)
948 result=STATE_WARNING; 994 result=STATE_WARNING;
949 xasprintf (&output_message,_("Dirty cache buffers = %lu%% of the total|DCB=%lu;%lu;%lu;0;100"), 995 xasprintf (&output_message,_("Dirty cache buffers = %lu%% of the total|DCB=%lu;%lu;%lu;0;100"),
950 dirty_cache_buffers, 996 dirty_cache_buffers,
@@ -964,9 +1010,9 @@ main(int argc, char **argv) {
964 return result; 1010 return result;
965 total_cache_buffers=atoi(recv_buffer); 1011 total_cache_buffers=atoi(recv_buffer);
966 1012
967 if (check_critical_value==TRUE && total_cache_buffers <= critical_value) 1013 if (check_critical_value && total_cache_buffers <= critical_value)
968 result=STATE_CRITICAL; 1014 result=STATE_CRITICAL;
969 else if (check_warning_value==TRUE && total_cache_buffers <= warning_value) 1015 else if (check_warning_value && total_cache_buffers <= warning_value)
970 result=STATE_WARNING; 1016 result=STATE_WARNING;
971 xasprintf (&output_message,_("Total cache buffers = %lu%% of the original|TCB=%lu;%lu;%lu;0;100"), 1017 xasprintf (&output_message,_("Total cache buffers = %lu%% of the original|TCB=%lu;%lu;%lu;0;100"),
972 total_cache_buffers, 1018 total_cache_buffers,
@@ -1034,9 +1080,9 @@ main(int argc, char **argv) {
1034 result=STATE_CRITICAL; 1080 result=STATE_CRITICAL;
1035 } else { 1081 } else {
1036 nrmp_value=strtoul(recv_buffer,NULL,10); 1082 nrmp_value=strtoul(recv_buffer,NULL,10);
1037 if (check_critical_value==TRUE && nrmp_value <= critical_value) 1083 if (check_critical_value && nrmp_value <= critical_value)
1038 result=STATE_CRITICAL; 1084 result=STATE_CRITICAL;
1039 else if (check_warning_value==TRUE && nrmp_value <= warning_value) 1085 else if (check_warning_value && nrmp_value <= warning_value)
1040 result=STATE_WARNING; 1086 result=STATE_WARNING;
1041 xasprintf (&output_message, 1087 xasprintf (&output_message,
1042 _("%s is %lu|%s=%lu;%lu;%lu;;"), 1088 _("%s is %lu|%s=%lu;%lu;%lu;;"),
@@ -1060,9 +1106,9 @@ main(int argc, char **argv) {
1060 result=STATE_CRITICAL; 1106 result=STATE_CRITICAL;
1061 } else { 1107 } else {
1062 nrmm_value=strtoul(recv_buffer,NULL,10); 1108 nrmm_value=strtoul(recv_buffer,NULL,10);
1063 if (check_critical_value==TRUE && nrmm_value <= critical_value) 1109 if (check_critical_value && nrmm_value <= critical_value)
1064 result=STATE_CRITICAL; 1110 result=STATE_CRITICAL;
1065 else if (check_warning_value==TRUE && nrmm_value <= warning_value) 1111 else if (check_warning_value && nrmm_value <= warning_value)
1066 result=STATE_WARNING; 1112 result=STATE_WARNING;
1067 xasprintf (&output_message, 1113 xasprintf (&output_message,
1068 _("%s is %lu|%s=%lu;%lu;%lu;;"), 1114 _("%s is %lu|%s=%lu;%lu;%lu;;"),
@@ -1086,9 +1132,9 @@ main(int argc, char **argv) {
1086 result=STATE_CRITICAL; 1132 result=STATE_CRITICAL;
1087 } else { 1133 } else {
1088 nrms_value=strtoul(recv_buffer,NULL,10); 1134 nrms_value=strtoul(recv_buffer,NULL,10);
1089 if (check_critical_value==TRUE && nrms_value >= critical_value) 1135 if (check_critical_value && nrms_value >= critical_value)
1090 result=STATE_CRITICAL; 1136 result=STATE_CRITICAL;
1091 else if (check_warning_value==TRUE && nrms_value >= warning_value) 1137 else if (check_warning_value && nrms_value >= warning_value)
1092 result=STATE_WARNING; 1138 result=STATE_WARNING;
1093 xasprintf (&output_message, 1139 xasprintf (&output_message,
1094 _("%s is %lu|%s=%lu;%lu;%lu;;"), 1140 _("%s is %lu|%s=%lu;%lu;%lu;;"),
@@ -1112,9 +1158,9 @@ main(int argc, char **argv) {
1112 result=STATE_CRITICAL; 1158 result=STATE_CRITICAL;
1113 } else { 1159 } else {
1114 nss1_value=strtoul(recv_buffer,NULL,10); 1160 nss1_value=strtoul(recv_buffer,NULL,10);
1115 if (check_critical_value==TRUE && nss1_value >= critical_value) 1161 if (check_critical_value && nss1_value >= critical_value)
1116 result=STATE_CRITICAL; 1162 result=STATE_CRITICAL;
1117 else if (check_warning_value==TRUE && nss1_value >= warning_value) 1163 else if (check_warning_value && nss1_value >= warning_value)
1118 result=STATE_WARNING; 1164 result=STATE_WARNING;
1119 xasprintf (&output_message, 1165 xasprintf (&output_message,
1120 _("%s is %lu|%s=%lu;%lu;%lu;;"), 1166 _("%s is %lu|%s=%lu;%lu;%lu;;"),
@@ -1138,9 +1184,9 @@ main(int argc, char **argv) {
1138 result=STATE_CRITICAL; 1184 result=STATE_CRITICAL;
1139 } else { 1185 } else {
1140 nss2_value=strtoul(recv_buffer,NULL,10); 1186 nss2_value=strtoul(recv_buffer,NULL,10);
1141 if (check_critical_value==TRUE && nss2_value >= critical_value) 1187 if (check_critical_value && nss2_value >= critical_value)
1142 result=STATE_CRITICAL; 1188 result=STATE_CRITICAL;
1143 else if (check_warning_value==TRUE && nss2_value >= warning_value) 1189 else if (check_warning_value && nss2_value >= warning_value)
1144 result=STATE_WARNING; 1190 result=STATE_WARNING;
1145 xasprintf (&output_message, 1191 xasprintf (&output_message,
1146 _("%s is %lu|%s=%lu;%lu;%lu;;"), 1192 _("%s is %lu|%s=%lu;%lu;%lu;;"),
@@ -1164,9 +1210,9 @@ main(int argc, char **argv) {
1164 result=STATE_CRITICAL; 1210 result=STATE_CRITICAL;
1165 } else { 1211 } else {
1166 nss3_value=strtoul(recv_buffer,NULL,10); 1212 nss3_value=strtoul(recv_buffer,NULL,10);
1167 if (check_critical_value==TRUE && nss3_value >= critical_value) 1213 if (check_critical_value && nss3_value >= critical_value)
1168 result=STATE_CRITICAL; 1214 result=STATE_CRITICAL;
1169 else if (check_warning_value==TRUE && nss3_value >= warning_value) 1215 else if (check_warning_value && nss3_value >= warning_value)
1170 result=STATE_WARNING; 1216 result=STATE_WARNING;
1171 xasprintf (&output_message, 1217 xasprintf (&output_message,
1172 _("%s is %lu|%s=%lu;%lu;%lu;;"), 1218 _("%s is %lu|%s=%lu;%lu;%lu;;"),
@@ -1190,9 +1236,9 @@ main(int argc, char **argv) {
1190 result=STATE_CRITICAL; 1236 result=STATE_CRITICAL;
1191 } else { 1237 } else {
1192 nss4_value=strtoul(recv_buffer,NULL,10); 1238 nss4_value=strtoul(recv_buffer,NULL,10);
1193 if (check_critical_value==TRUE && nss4_value >= critical_value) 1239 if (check_critical_value && nss4_value >= critical_value)
1194 result=STATE_CRITICAL; 1240 result=STATE_CRITICAL;
1195 else if (check_warning_value==TRUE && nss4_value >= warning_value) 1241 else if (check_warning_value && nss4_value >= warning_value)
1196 result=STATE_WARNING; 1242 result=STATE_WARNING;
1197 xasprintf (&output_message, 1243 xasprintf (&output_message,
1198 _("%s is %lu|%s=%lu;%lu;%lu;;"), 1244 _("%s is %lu|%s=%lu;%lu;%lu;;"),
@@ -1216,9 +1262,9 @@ main(int argc, char **argv) {
1216 result=STATE_CRITICAL; 1262 result=STATE_CRITICAL;
1217 } else { 1263 } else {
1218 nss5_value=strtoul(recv_buffer,NULL,10); 1264 nss5_value=strtoul(recv_buffer,NULL,10);
1219 if (check_critical_value==TRUE && nss5_value >= critical_value) 1265 if (check_critical_value && nss5_value >= critical_value)
1220 result=STATE_CRITICAL; 1266 result=STATE_CRITICAL;
1221 else if (check_warning_value==TRUE && nss5_value >= warning_value) 1267 else if (check_warning_value && nss5_value >= warning_value)
1222 result=STATE_WARNING; 1268 result=STATE_WARNING;
1223 xasprintf (&output_message, 1269 xasprintf (&output_message,
1224 _("%s is %lu|%s=%lu;%lu;%lu;;"), 1270 _("%s is %lu|%s=%lu;%lu;%lu;;"),
@@ -1242,9 +1288,9 @@ main(int argc, char **argv) {
1242 result=STATE_CRITICAL; 1288 result=STATE_CRITICAL;
1243 } else { 1289 } else {
1244 nss6_value=strtoul(recv_buffer,NULL,10); 1290 nss6_value=strtoul(recv_buffer,NULL,10);
1245 if (check_critical_value==TRUE && nss6_value >= critical_value) 1291 if (check_critical_value && nss6_value >= critical_value)
1246 result=STATE_CRITICAL; 1292 result=STATE_CRITICAL;
1247 else if (check_warning_value==TRUE && nss6_value >= warning_value) 1293 else if (check_warning_value && nss6_value >= warning_value)
1248 result=STATE_WARNING; 1294 result=STATE_WARNING;
1249 xasprintf (&output_message, 1295 xasprintf (&output_message,
1250 _("%s is %lu|%s=%lu;%lu;%lu;;"), 1296 _("%s is %lu|%s=%lu;%lu;%lu;;"),
@@ -1268,9 +1314,9 @@ main(int argc, char **argv) {
1268 result=STATE_CRITICAL; 1314 result=STATE_CRITICAL;
1269 } else { 1315 } else {
1270 nss7_value=strtoul(recv_buffer,NULL,10); 1316 nss7_value=strtoul(recv_buffer,NULL,10);
1271 if (check_critical_value==TRUE && nss7_value >= critical_value) 1317 if (check_critical_value && nss7_value >= critical_value)
1272 result=STATE_CRITICAL; 1318 result=STATE_CRITICAL;
1273 else if (check_warning_value==TRUE && nss7_value >= warning_value) 1319 else if (check_warning_value && nss7_value >= warning_value)
1274 result=STATE_WARNING; 1320 result=STATE_WARNING;
1275 xasprintf (&output_message, 1321 xasprintf (&output_message,
1276 _("%s is %lu|%s=%lu;%lu;%lu;;"), 1322 _("%s is %lu|%s=%lu;%lu;%lu;;"),
@@ -1362,7 +1408,7 @@ int process_arguments(int argc, char **argv) {
1362 server_address=optarg; 1408 server_address=optarg;
1363 break; 1409 break;
1364 case 'o': /* display nos version */ 1410 case 'o': /* display nos version */
1365 check_netware_version=TRUE; 1411 check_netware_version = true;
1366 break; 1412 break;
1367 case 'p': /* port */ 1413 case 'p': /* port */
1368 if (is_intnonneg(optarg)) 1414 if (is_intnonneg(optarg))
@@ -1450,6 +1496,12 @@ int process_arguments(int argc, char **argv) {
1450 if (!strcmp(volume_name,"")) 1496 if (!strcmp(volume_name,""))
1451 volume_name = strdup ("SYS"); 1497 volume_name = strdup ("SYS");
1452 } 1498 }
1499 else if (strncmp(optarg,"VPU",3)==0) {
1500 vars_to_check=VPU;
1501 volume_name = strdup (optarg+3);
1502 if (!strcmp(volume_name,""))
1503 volume_name = strdup ("SYS");
1504 }
1453 else if (strncmp(optarg,"VPP",3)==0) { 1505 else if (strncmp(optarg,"VPP",3)==0) {
1454 vars_to_check=VPP; 1506 vars_to_check=VPP;
1455 volume_name = strdup (optarg+3); 1507 volume_name = strdup (optarg+3);
@@ -1569,11 +1621,11 @@ int process_arguments(int argc, char **argv) {
1569 break; 1621 break;
1570 case 'w': /* warning threshold */ 1622 case 'w': /* warning threshold */
1571 warning_value=strtoul(optarg,NULL,10); 1623 warning_value=strtoul(optarg,NULL,10);
1572 check_warning_value=TRUE; 1624 check_warning_value = true;
1573 break; 1625 break;
1574 case 'c': /* critical threshold */ 1626 case 'c': /* critical threshold */
1575 critical_value=strtoul(optarg,NULL,10); 1627 critical_value=strtoul(optarg,NULL,10);
1576 check_critical_value=TRUE; 1628 check_critical_value = true;
1577 break; 1629 break;
1578 case 't': /* timeout */ 1630 case 't': /* timeout */
1579 socket_timeout=atoi(optarg); 1631 socket_timeout=atoi(optarg);
@@ -1626,6 +1678,7 @@ void print_help(void)
1626 printf (" %s\n", _("OFILES = number of open files")); 1678 printf (" %s\n", _("OFILES = number of open files"));
1627 printf (" %s\n", _(" VMF<vol> = MB of free space on Volume <vol>")); 1679 printf (" %s\n", _(" VMF<vol> = MB of free space on Volume <vol>"));
1628 printf (" %s\n", _(" VMU<vol> = MB used space on Volume <vol>")); 1680 printf (" %s\n", _(" VMU<vol> = MB used space on Volume <vol>"));
1681 printf (" %s\n", _(" VPU<vol> = percent used space on Volume <vol>"));
1629 printf (" %s\n", _(" VMP<vol> = MB of purgeable space on Volume <vol>")); 1682 printf (" %s\n", _(" VMP<vol> = MB of purgeable space on Volume <vol>"));
1630 printf (" %s\n", _(" VPF<vol> = percent free space on volume <vol>")); 1683 printf (" %s\n", _(" VPF<vol> = percent free space on volume <vol>"));
1631 printf (" %s\n", _(" VKF<vol> = KB of free space on volume <vol>")); 1684 printf (" %s\n", _(" VKF<vol> = KB of free space on volume <vol>"));
diff --git a/plugins/check_overcr.c b/plugins/check_overcr.c
index 9a4d25fa..5165c828 100644
--- a/plugins/check_overcr.c
+++ b/plugins/check_overcr.c
@@ -56,15 +56,15 @@ char *server_address = NULL;
56int server_port = PORT; 56int server_port = PORT;
57double warning_value = 0L; 57double warning_value = 0L;
58double critical_value = 0L; 58double critical_value = 0L;
59int check_warning_value = FALSE; 59bool check_warning_value = false;
60int check_critical_value = FALSE; 60bool check_critical_value = false;
61enum checkvar vars_to_check = NONE; 61enum checkvar vars_to_check = NONE;
62int cmd_timeout = 1; 62int cmd_timeout = 1;
63 63
64int netstat_port = 0; 64int netstat_port = 0;
65char *disk_name = NULL; 65char *disk_name = NULL;
66char *process_name = NULL; 66char *process_name = NULL;
67 char send_buffer[MAX_INPUT_BUFFER]; 67char send_buffer[MAX_INPUT_BUFFER];
68 68
69int process_arguments (int, char **); 69int process_arguments (int, char **);
70void print_usage (void); 70void print_usage (void);
@@ -77,7 +77,7 @@ main (int argc, char **argv)
77 char recv_buffer[MAX_INPUT_BUFFER]; 77 char recv_buffer[MAX_INPUT_BUFFER];
78 char temp_buffer[MAX_INPUT_BUFFER]; 78 char temp_buffer[MAX_INPUT_BUFFER];
79 char *temp_ptr = NULL; 79 char *temp_ptr = NULL;
80 int found_disk = FALSE; 80 bool found_disk = false;
81 unsigned long percent_used_disk_space = 100; 81 unsigned long percent_used_disk_space = 100;
82 double load; 82 double load;
83 double load_1min; 83 double load_1min;
@@ -155,9 +155,9 @@ main (int argc, char **argv)
155 break; 155 break;
156 } 156 }
157 157
158 if (check_critical_value == TRUE && (load >= critical_value)) 158 if (check_critical_value && (load >= critical_value))
159 result = STATE_CRITICAL; 159 result = STATE_CRITICAL;
160 else if (check_warning_value == TRUE && (load >= warning_value)) 160 else if (check_warning_value && (load >= warning_value))
161 result = STATE_WARNING; 161 result = STATE_WARNING;
162 162
163 die (result, 163 die (result,
@@ -178,7 +178,7 @@ main (int argc, char **argv)
178 temp_ptr = (char *) strtok (NULL, " ")) { 178 temp_ptr = (char *) strtok (NULL, " ")) {
179 179
180 if (!strcmp (temp_ptr, disk_name)) { 180 if (!strcmp (temp_ptr, disk_name)) {
181 found_disk = TRUE; 181 found_disk = true;
182 temp_ptr = (char *) strtok (NULL, "%"); 182 temp_ptr = (char *) strtok (NULL, "%");
183 if (temp_ptr == NULL) 183 if (temp_ptr == NULL)
184 die (STATE_CRITICAL, _("Invalid response from server\n")); 184 die (STATE_CRITICAL, _("Invalid response from server\n"));
@@ -191,14 +191,14 @@ main (int argc, char **argv)
191 } 191 }
192 192
193 /* error if we couldn't find the info for the disk */ 193 /* error if we couldn't find the info for the disk */
194 if (found_disk == FALSE) 194 if (!found_disk)
195 die (STATE_CRITICAL, 195 die (STATE_CRITICAL,
196 "CRITICAL - Disk '%s' non-existent or not mounted", 196 "CRITICAL - Disk '%s' non-existent or not mounted",
197 disk_name); 197 disk_name);
198 198
199 if (check_critical_value == TRUE && (percent_used_disk_space >= critical_value)) 199 if (check_critical_value && (percent_used_disk_space >= critical_value))
200 result = STATE_CRITICAL; 200 result = STATE_CRITICAL;
201 else if (check_warning_value == TRUE && (percent_used_disk_space >= warning_value)) 201 else if (check_warning_value && (percent_used_disk_space >= warning_value))
202 result = STATE_WARNING; 202 result = STATE_WARNING;
203 203
204 die (result, "Disk %s - %lu%% used on %s", state_text(result), percent_used_disk_space, disk_name); 204 die (result, "Disk %s - %lu%% used on %s", state_text(result), percent_used_disk_space, disk_name);
@@ -212,9 +212,9 @@ main (int argc, char **argv)
212 else 212 else
213 port_connections = strtod (recv_buffer, NULL); 213 port_connections = strtod (recv_buffer, NULL);
214 214
215 if (check_critical_value == TRUE && (port_connections >= critical_value)) 215 if (check_critical_value && (port_connections >= critical_value))
216 result = STATE_CRITICAL; 216 result = STATE_CRITICAL;
217 else if (check_warning_value == TRUE && (port_connections >= warning_value)) 217 else if (check_warning_value && (port_connections >= warning_value))
218 result = STATE_WARNING; 218 result = STATE_WARNING;
219 219
220 die (result, 220 die (result,
@@ -241,9 +241,9 @@ main (int argc, char **argv)
241 else 241 else
242 processes = strtod (temp_ptr, NULL); 242 processes = strtod (temp_ptr, NULL);
243 243
244 if (check_critical_value == TRUE && (processes >= critical_value)) 244 if (check_critical_value && (processes >= critical_value))
245 result = STATE_CRITICAL; 245 result = STATE_CRITICAL;
246 else if (check_warning_value == TRUE && (processes >= warning_value)) 246 else if (check_warning_value && (processes >= warning_value))
247 result = STATE_WARNING; 247 result = STATE_WARNING;
248 248
249 die (result, 249 die (result,
@@ -262,9 +262,9 @@ main (int argc, char **argv)
262 uptime_raw_hours = strtod (recv_buffer, NULL); 262 uptime_raw_hours = strtod (recv_buffer, NULL);
263 uptime_raw_minutes = (unsigned long) (uptime_raw_hours * 60.0); 263 uptime_raw_minutes = (unsigned long) (uptime_raw_hours * 60.0);
264 264
265 if (check_critical_value == TRUE && (uptime_raw_minutes <= critical_value)) 265 if (check_critical_value && (uptime_raw_minutes <= critical_value))
266 result = STATE_CRITICAL; 266 result = STATE_CRITICAL;
267 else if (check_warning_value == TRUE && (uptime_raw_minutes <= warning_value)) 267 else if (check_warning_value && (uptime_raw_minutes <= warning_value))
268 result = STATE_WARNING; 268 result = STATE_WARNING;
269 269
270 uptime_days = uptime_raw_minutes / 1440; 270 uptime_days = uptime_raw_minutes / 1440;
@@ -388,11 +388,11 @@ process_arguments (int argc, char **argv)
388 break; 388 break;
389 case 'w': /* warning threshold */ 389 case 'w': /* warning threshold */
390 warning_value = strtoul (optarg, NULL, 10); 390 warning_value = strtoul (optarg, NULL, 10);
391 check_warning_value = TRUE; 391 check_warning_value = true;
392 break; 392 break;
393 case 'c': /* critical threshold */ 393 case 'c': /* critical threshold */
394 critical_value = strtoul (optarg, NULL, 10); 394 critical_value = strtoul (optarg, NULL, 10);
395 check_critical_value = TRUE; 395 check_critical_value = true;
396 break; 396 break;
397 case 't': /* timeout */ 397 case 't': /* timeout */
398 socket_timeout = atoi (optarg); 398 socket_timeout = atoi (optarg);
diff --git a/plugins/check_pgsql.c b/plugins/check_pgsql.c
index 61990335..94d589e1 100644
--- a/plugins/check_pgsql.c
+++ b/plugins/check_pgsql.c
@@ -69,7 +69,7 @@ int process_arguments (int, char **);
69int validate_arguments (void); 69int validate_arguments (void);
70void print_usage (void); 70void print_usage (void);
71void print_help (void); 71void print_help (void);
72int is_pg_logname (char *); 72bool is_pg_logname (char *);
73int do_query (PGconn *, char *); 73int do_query (PGconn *, char *);
74 74
75char *pghost = NULL; /* host name of the backend server */ 75char *pghost = NULL; /* host name of the backend server */
@@ -252,7 +252,7 @@ main (int argc, char **argv)
252 printf (_(" %s - database %s (%f sec.)|%s\n"), 252 printf (_(" %s - database %s (%f sec.)|%s\n"),
253 state_text(status), dbName, elapsed_time, 253 state_text(status), dbName, elapsed_time,
254 fperfdata("time", elapsed_time, "s", 254 fperfdata("time", elapsed_time, "s",
255 !!(twarn > 0.0), twarn, !!(tcrit > 0.0), tcrit, TRUE, 0, FALSE,0)); 255 !!(twarn > 0.0), twarn, !!(tcrit > 0.0), tcrit, true, 0, false,0));
256 256
257 if (pgquery) 257 if (pgquery)
258 query_status = do_query (conn, pgquery); 258 query_status = do_query (conn, pgquery);
@@ -393,7 +393,7 @@ process_arguments (int argc, char **argv)
393 393
394<para>&PROTO_validate_arguments;</para> 394<para>&PROTO_validate_arguments;</para>
395 395
396<para>Given a database name, this function returns TRUE if the string 396<para>Given a database name, this function returns true if the string
397is a valid PostgreSQL database name, and returns false if it is 397is a valid PostgreSQL database name, and returns false if it is
398not.</para> 398not.</para>
399 399
@@ -424,7 +424,7 @@ function prototype
424 424
425<para>&PROTO_is_pg_logname;</para> 425<para>&PROTO_is_pg_logname;</para>
426 426
427<para>Given a username, this function returns TRUE if the string is a 427<para>Given a username, this function returns true if the string is a
428valid PostgreSQL username, and returns false if it is not. Valid PostgreSQL 428valid PostgreSQL username, and returns false if it is not. Valid PostgreSQL
429usernames are less than &NAMEDATALEN; characters long and consist of 429usernames are less than &NAMEDATALEN; characters long and consist of
430letters, numbers, dashes, and underscores, plus possibly some other 430letters, numbers, dashes, and underscores, plus possibly some other
@@ -439,12 +439,10 @@ should be added.</para>
439 439
440 440
441 441
442int 442bool is_pg_logname (char *username) {
443is_pg_logname (char *username)
444{
445 if (strlen (username) > NAMEDATALEN - 1) 443 if (strlen (username) > NAMEDATALEN - 1)
446 return (FALSE); 444 return (false);
447 return (TRUE); 445 return (true);
448} 446}
449 447
450/****************************************************************************** 448/******************************************************************************
diff --git a/plugins/check_ping.c b/plugins/check_ping.c
index 741f732e..6e162e6a 100644
--- a/plugins/check_ping.c
+++ b/plugins/check_ping.c
@@ -55,7 +55,7 @@ int error_scan (char buf[MAX_INPUT_BUFFER], const char *addr);
55void print_usage (void); 55void print_usage (void);
56void print_help (void); 56void print_help (void);
57 57
58int display_html = FALSE; 58bool display_html = false;
59int wpl = UNKNOWN_PACKET_LOSS; 59int wpl = UNKNOWN_PACKET_LOSS;
60int cpl = UNKNOWN_PACKET_LOSS; 60int cpl = UNKNOWN_PACKET_LOSS;
61float wrta = UNKNOWN_TRIP_TIME; 61float wrta = UNKNOWN_TRIP_TIME;
@@ -153,7 +153,7 @@ main (int argc, char **argv)
153 if (n_addresses > 1 && this_result != STATE_UNKNOWN) 153 if (n_addresses > 1 && this_result != STATE_UNKNOWN)
154 die (STATE_OK, "%s is alive\n", addresses[i]); 154 die (STATE_OK, "%s is alive\n", addresses[i]);
155 155
156 if (display_html == TRUE) 156 if (display_html == true)
157 printf ("<A HREF='%s/traceroute.cgi?%s'>", CGIURL, addresses[i]); 157 printf ("<A HREF='%s/traceroute.cgi?%s'>", CGIURL, addresses[i]);
158 if (pl == 100) 158 if (pl == 100)
159 printf (_("PING %s - %sPacket loss = %d%%"), state_text (this_result), warn_text, 159 printf (_("PING %s - %sPacket loss = %d%%"), state_text (this_result), warn_text,
@@ -161,22 +161,22 @@ main (int argc, char **argv)
161 else 161 else
162 printf (_("PING %s - %sPacket loss = %d%%, RTA = %2.2f ms"), 162 printf (_("PING %s - %sPacket loss = %d%%, RTA = %2.2f ms"),
163 state_text (this_result), warn_text, pl, rta); 163 state_text (this_result), warn_text, pl, rta);
164 if (display_html == TRUE) 164 if (display_html == true)
165 printf ("</A>"); 165 printf ("</A>");
166 166
167 /* Print performance data */ 167 /* Print performance data */
168 if (pl != 100) { 168 if (pl != 100) {
169 printf("|%s", fperfdata ("rta", (double) rta, "ms", 169 printf("|%s", fperfdata ("rta", (double) rta, "ms",
170 wrta>0?TRUE:FALSE, wrta, 170 wrta>0?true:false, wrta,
171 crta>0?TRUE:FALSE, crta, 171 crta>0?true:false, crta,
172 TRUE, 0, FALSE, 0)); 172 true, 0, false, 0));
173 } else { 173 } else {
174 printf("| rta=U;%f;%f;;", wrta, crta); 174 printf("| rta=U;%f;%f;;", wrta, crta);
175 } 175 }
176 printf(" %s\n", perfdata ("pl", (long) pl, "%", 176 printf(" %s\n", perfdata ("pl", (long) pl, "%",
177 wpl>0?TRUE:FALSE, wpl, 177 wpl>0?true:false, wpl,
178 cpl>0?TRUE:FALSE, cpl, 178 cpl>0?true:false, cpl,
179 TRUE, 0, FALSE, 0)); 179 true, 0, false, 0));
180 180
181 if (verbose >= 2) 181 if (verbose >= 2)
182 printf ("%f:%d%% %f:%d%%\n", wrta, wpl, crta, cpl); 182 printf ("%f:%d%% %f:%d%%\n", wrta, wpl, crta, cpl);
@@ -278,10 +278,10 @@ process_arguments (int argc, char **argv)
278 usage2 (_("<max_packets> (%s) must be a non-negative number\n"), optarg); 278 usage2 (_("<max_packets> (%s) must be a non-negative number\n"), optarg);
279 break; 279 break;
280 case 'n': /* no HTML */ 280 case 'n': /* no HTML */
281 display_html = FALSE; 281 display_html = false;
282 break; 282 break;
283 case 'L': /* show HTML */ 283 case 'L': /* show HTML */
284 display_html = TRUE; 284 display_html = true;
285 break; 285 break;
286 case 'c': 286 case 'c':
287 get_threshold (optarg, &crta, &cpl); 287 get_threshold (optarg, &crta, &cpl);
@@ -297,7 +297,7 @@ process_arguments (int argc, char **argv)
297 return validate_arguments (); 297 return validate_arguments ();
298 298
299 if (addresses[0] == NULL) { 299 if (addresses[0] == NULL) {
300 if (is_host (argv[c]) == FALSE) { 300 if (!is_host (argv[c])) {
301 usage2 (_("Invalid hostname/address"), argv[c]); 301 usage2 (_("Invalid hostname/address"), argv[c]);
302 } else { 302 } else {
303 addresses[0] = argv[c++]; 303 addresses[0] = argv[c++];
@@ -308,7 +308,7 @@ process_arguments (int argc, char **argv)
308 } 308 }
309 309
310 if (wpl == UNKNOWN_PACKET_LOSS) { 310 if (wpl == UNKNOWN_PACKET_LOSS) {
311 if (is_intpercent (argv[c]) == FALSE) { 311 if (!is_intpercent (argv[c])) {
312 printf (_("<wpl> (%s) must be an integer percentage\n"), argv[c]); 312 printf (_("<wpl> (%s) must be an integer percentage\n"), argv[c]);
313 return ERROR; 313 return ERROR;
314 } else { 314 } else {
@@ -319,7 +319,7 @@ process_arguments (int argc, char **argv)
319 } 319 }
320 320
321 if (cpl == UNKNOWN_PACKET_LOSS) { 321 if (cpl == UNKNOWN_PACKET_LOSS) {
322 if (is_intpercent (argv[c]) == FALSE) { 322 if (!is_intpercent (argv[c])) {
323 printf (_("<cpl> (%s) must be an integer percentage\n"), argv[c]); 323 printf (_("<cpl> (%s) must be an integer percentage\n"), argv[c]);
324 return ERROR; 324 return ERROR;
325 } else { 325 } else {
@@ -420,7 +420,7 @@ validate_arguments ()
420 timeout_interval = (int)max_seconds; 420 timeout_interval = (int)max_seconds;
421 421
422 for (i=0; i<n_addresses; i++) { 422 for (i=0; i<n_addresses; i++) {
423 if (is_host(addresses[i]) == FALSE) 423 if (!is_host(addresses[i]))
424 usage2 (_("Invalid hostname/address"), addresses[i]); 424 usage2 (_("Invalid hostname/address"), addresses[i]);
425 } 425 }
426 426
diff --git a/plugins/check_procs.c b/plugins/check_procs.c
index c17c6996..1fcbd981 100644
--- a/plugins/check_procs.c
+++ b/plugins/check_procs.c
@@ -14,6 +14,9 @@
14* defaults to number of processes. Search filters can be applied to limit 14* defaults to number of processes. Search filters can be applied to limit
15* the processes to check. 15* the processes to check.
16* 16*
17* The parent process, check_procs itself and any child process of
18* check_procs (ps) are excluded from any checks to prevent false positives.
19*
17* 20*
18* This program is free software: you can redistribute it and/or modify 21* This program is free software: you can redistribute it and/or modify
19* it under the terms of the GNU General Public License as published by 22* it under the terms of the GNU General Public License as published by
@@ -153,7 +156,7 @@ main (int argc, char **argv)
153 int expected_cols = PS_COLS - 1; 156 int expected_cols = PS_COLS - 1;
154 int warn = 0; /* number of processes in warn state */ 157 int warn = 0; /* number of processes in warn state */
155 int crit = 0; /* number of processes in crit state */ 158 int crit = 0; /* number of processes in crit state */
156 int i = 0, j = 0; 159 int i = 0;
157 int result = STATE_UNKNOWN; 160 int result = STATE_UNKNOWN;
158 int ret = 0; 161 int ret = 0;
159 output chld_out, chld_err; 162 output chld_out, chld_err;
@@ -207,7 +210,7 @@ main (int argc, char **argv)
207 } 210 }
208 211
209 /* flush first line: j starts at 1 */ 212 /* flush first line: j starts at 1 */
210 for (j = 1; j < chld_out.lines; j++) { 213 for (size_t j = 1; j < chld_out.lines; j++) {
211 input_line = chld_out.line[j]; 214 input_line = chld_out.line[j];
212 215
213 if (verbose >= 3) 216 if (verbose >= 3)
@@ -241,8 +244,9 @@ main (int argc, char **argv)
241 244
242 /* Ignore self */ 245 /* Ignore self */
243 if ((usepid && mypid == procpid) || 246 if ((usepid && mypid == procpid) ||
244 (!usepid && ((ret = stat_exe(procpid, &statbuf) != -1) && statbuf.st_dev == mydev && statbuf.st_ino == myino) || 247 ( ((!usepid) && ((ret = stat_exe(procpid, &statbuf) != -1) && statbuf.st_dev == mydev && statbuf.st_ino == myino)) ||
245 (ret == -1 && errno == ENOENT))) { 248 (ret == -1 && errno == ENOENT))
249 ) {
246 if (verbose >= 3) 250 if (verbose >= 3)
247 printf("not considering - is myself or gone\n"); 251 printf("not considering - is myself or gone\n");
248 continue; 252 continue;
@@ -254,6 +258,13 @@ main (int argc, char **argv)
254 continue; 258 continue;
255 } 259 }
256 260
261 /* Ignore our own children */
262 if (procppid == mypid) {
263 if (verbose >= 3)
264 printf("not considering - is our child\n");
265 continue;
266 }
267
257 /* Ignore excluded processes by name */ 268 /* Ignore excluded processes by name */
258 if(options & EXCLUDE_PROGS) { 269 if(options & EXCLUDE_PROGS) {
259 int found = 0; 270 int found = 0;
@@ -727,18 +738,23 @@ convert_to_seconds(char *etime) {
727void 738void
728print_help (void) 739print_help (void)
729{ 740{
730 print_revision (progname, NP_VERSION); 741 print_revision (progname, NP_VERSION);
731 742
732 printf ("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>\n"); 743 printf ("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>\n");
733 printf (COPYRIGHT, copyright, email); 744 printf (COPYRIGHT, copyright, email);
734 745
735 printf ("%s\n", _("Checks all processes and generates WARNING or CRITICAL states if the specified")); 746 printf ("%s\n", _("Checks all processes and generates WARNING or CRITICAL states if the specified"));
736 printf ("%s\n", _("metric is outside the required threshold ranges. The metric defaults to number")); 747 printf ("%s\n", _("metric is outside the required threshold ranges. The metric defaults to number"));
737 printf ("%s\n", _("of processes. Search filters can be applied to limit the processes to check.")); 748 printf ("%s\n", _("of processes. Search filters can be applied to limit the processes to check."));
738 749
739 printf ("\n\n"); 750 printf ("\n\n");
740 751
741 print_usage (); 752 printf ("%s\n", _("The parent process, check_procs itself and any child process of check_procs (ps)"));
753 printf ("%s\n", _("are excluded from any checks to prevent false positives."));
754
755 printf ("\n\n");
756
757 print_usage ();
742 758
743 printf (UT_HELP_VRSN); 759 printf (UT_HELP_VRSN);
744 printf (UT_EXTRA_OPTS); 760 printf (UT_EXTRA_OPTS);
@@ -754,11 +770,11 @@ print_help (void)
754 printf (" %s\n", _("CPU - percentage CPU")); 770 printf (" %s\n", _("CPU - percentage CPU"));
755/* only linux etime is support currently */ 771/* only linux etime is support currently */
756#if defined( __linux__ ) 772#if defined( __linux__ )
757 printf (" %s\n", _("ELAPSED - time elapsed in seconds")); 773 printf (" %s\n", _("ELAPSED - time elapsed in seconds"));
758#endif /* defined(__linux__) */ 774#endif /* defined(__linux__) */
759 printf (UT_PLUG_TIMEOUT, DEFAULT_SOCKET_TIMEOUT); 775 printf (UT_PLUG_TIMEOUT, DEFAULT_SOCKET_TIMEOUT);
760 776
761 printf (" %s\n", "-v, --verbose"); 777 printf (" %s\n", "-v, --verbose");
762 printf (" %s\n", _("Extra information. Up to 3 verbosity levels")); 778 printf (" %s\n", _("Extra information. Up to 3 verbosity levels"));
763 779
764 printf (" %s\n", "-T, --traditional"); 780 printf (" %s\n", "-T, --traditional");
@@ -776,7 +792,7 @@ print_help (void)
776 printf (" %s\n", _("Only scan for processes with VSZ higher than indicated.")); 792 printf (" %s\n", _("Only scan for processes with VSZ higher than indicated."));
777 printf (" %s\n", "-r, --rss=RSS"); 793 printf (" %s\n", "-r, --rss=RSS");
778 printf (" %s\n", _("Only scan for processes with RSS higher than indicated.")); 794 printf (" %s\n", _("Only scan for processes with RSS higher than indicated."));
779 printf (" %s\n", "-P, --pcpu=PCPU"); 795 printf (" %s\n", "-P, --pcpu=PCPU");
780 printf (" %s\n", _("Only scan for processes with PCPU higher than indicated.")); 796 printf (" %s\n", _("Only scan for processes with PCPU higher than indicated."));
781 printf (" %s\n", "-u, --user=USER"); 797 printf (" %s\n", "-u, --user=USER");
782 printf (" %s\n", _("Only scan for processes with user name or ID indicated.")); 798 printf (" %s\n", _("Only scan for processes with user name or ID indicated."));
@@ -791,19 +807,19 @@ print_help (void)
791 printf (" %s\n", "-k, --no-kthreads"); 807 printf (" %s\n", "-k, --no-kthreads");
792 printf (" %s\n", _("Only scan for non kernel threads (works on Linux only).")); 808 printf (" %s\n", _("Only scan for non kernel threads (works on Linux only)."));
793 809
794 printf(_("\n\ 810 printf(_("\n\
795RANGEs are specified 'min:max' or 'min:' or ':max' (or 'max'). If\n\ 811RANGEs are specified 'min:max' or 'min:' or ':max' (or 'max'). If\n\
796specified 'max:min', a warning status will be generated if the\n\ 812specified 'max:min', a warning status will be generated if the\n\
797count is inside the specified range\n\n")); 813count is inside the specified range\n\n"));
798 814
799 printf(_("\ 815 printf(_("\
800This plugin checks the number of currently running processes and\n\ 816This plugin checks the number of currently running processes and\n\
801generates WARNING or CRITICAL states if the process count is outside\n\ 817generates WARNING or CRITICAL states if the process count is outside\n\
802the specified threshold ranges. The process count can be filtered by\n\ 818the specified threshold ranges. The process count can be filtered by\n\
803process owner, parent process PID, current state (e.g., 'Z'), or may\n\ 819process owner, parent process PID, current state (e.g., 'Z'), or may\n\
804be the total number of running processes\n\n")); 820be the total number of running processes\n\n"));
805 821
806 printf ("%s\n", _("Examples:")); 822 printf ("%s\n", _("Examples:"));
807 printf (" %s\n", "check_procs -w 2:2 -c 2:1024 -C portsentry"); 823 printf (" %s\n", "check_procs -w 2:2 -c 2:1024 -C portsentry");
808 printf (" %s\n", _("Warning if not two processes with command name portsentry.")); 824 printf (" %s\n", _("Warning if not two processes with command name portsentry."));
809 printf (" %s\n\n", _("Critical if < 2 or > 1024 processes")); 825 printf (" %s\n\n", _("Critical if < 2 or > 1024 processes"));
@@ -820,14 +836,14 @@ be the total number of running processes\n\n"));
820 printf (" %s\n", "check_procs -w 10 -c 20 --metric=CPU"); 836 printf (" %s\n", "check_procs -w 10 -c 20 --metric=CPU");
821 printf (" %s\n", _("Alert if CPU of any processes over 10\% or 20\%")); 837 printf (" %s\n", _("Alert if CPU of any processes over 10\% or 20\%"));
822 838
823 printf (UT_SUPPORT); 839 printf (UT_SUPPORT);
824} 840}
825 841
826void 842void
827print_usage (void) 843print_usage (void)
828{ 844{
829 printf ("%s\n", _("Usage:")); 845 printf ("%s\n", _("Usage:"));
830 printf ("%s -w <range> -c <range> [-m metric] [-s state] [-p ppid]\n", progname); 846 printf ("%s -w <range> -c <range> [-m metric] [-s state] [-p ppid]\n", progname);
831 printf (" [-u user] [-r rss] [-z vsz] [-P %%cpu] [-a argument-array]\n"); 847 printf (" [-u user] [-r rss] [-z vsz] [-P %%cpu] [-a argument-array]\n");
832 printf (" [-C command] [-X process_to_exclude] [-k] [-t timeout] [-v]\n"); 848 printf (" [-C command] [-X process_to_exclude] [-k] [-t timeout] [-v]\n");
833} 849}
diff --git a/plugins/check_radius.c b/plugins/check_radius.c
index b1b4938c..6b32710a 100644
--- a/plugins/check_radius.c
+++ b/plugins/check_radius.c
@@ -93,7 +93,7 @@ char *expect = NULL;
93char *config_file = NULL; 93char *config_file = NULL;
94unsigned short port = PW_AUTH_UDP_PORT; 94unsigned short port = PW_AUTH_UDP_PORT;
95int retries = 1; 95int retries = 1;
96int verbose = FALSE; 96bool verbose = false;
97 97
98/****************************************************************************** 98/******************************************************************************
99 99
@@ -272,10 +272,10 @@ process_arguments (int argc, char **argv)
272 print_revision (progname, NP_VERSION); 272 print_revision (progname, NP_VERSION);
273 exit (STATE_UNKNOWN); 273 exit (STATE_UNKNOWN);
274 case 'v': /* verbose mode */ 274 case 'v': /* verbose mode */
275 verbose = TRUE; 275 verbose = true;
276 break; 276 break;
277 case 'H': /* hostname */ 277 case 'H': /* hostname */
278 if (is_host (optarg) == FALSE) { 278 if (!is_host (optarg)) {
279 usage2 (_("Invalid hostname/address"), optarg); 279 usage2 (_("Invalid hostname/address"), optarg);
280 } 280 }
281 server = optarg; 281 server = optarg;
diff --git a/plugins/check_real.c b/plugins/check_real.c
index fbdb70f3..15e035b6 100644
--- a/plugins/check_real.c
+++ b/plugins/check_real.c
@@ -54,10 +54,10 @@ char *host_name;
54char *server_url = NULL; 54char *server_url = NULL;
55char *server_expect; 55char *server_expect;
56int warning_time = 0; 56int warning_time = 0;
57int check_warning_time = FALSE; 57bool check_warning_time = false;
58int critical_time = 0; 58int critical_time = 0;
59int check_critical_time = FALSE; 59bool check_critical_time = false;
60int verbose = FALSE; 60bool verbose = false;
61 61
62 62
63 63
@@ -238,9 +238,9 @@ main (int argc, char **argv)
238 /* Return results */ 238 /* Return results */
239 if (result == STATE_OK) { 239 if (result == STATE_OK) {
240 240
241 if (check_critical_time == TRUE 241 if (check_critical_time
242 && (end_time - start_time) > critical_time) result = STATE_CRITICAL; 242 && (end_time - start_time) > critical_time) result = STATE_CRITICAL;
243 else if (check_warning_time == TRUE 243 else if (check_warning_time
244 && (end_time - start_time) > warning_time) result = 244 && (end_time - start_time) > warning_time) result =
245 STATE_WARNING; 245 STATE_WARNING;
246 246
@@ -331,7 +331,7 @@ process_arguments (int argc, char **argv)
331 case 'w': /* warning time threshold */ 331 case 'w': /* warning time threshold */
332 if (is_intnonneg (optarg)) { 332 if (is_intnonneg (optarg)) {
333 warning_time = atoi (optarg); 333 warning_time = atoi (optarg);
334 check_warning_time = TRUE; 334 check_warning_time = true;
335 } 335 }
336 else { 336 else {
337 usage4 (_("Warning time must be a positive integer")); 337 usage4 (_("Warning time must be a positive integer"));
@@ -340,14 +340,14 @@ process_arguments (int argc, char **argv)
340 case 'c': /* critical time threshold */ 340 case 'c': /* critical time threshold */
341 if (is_intnonneg (optarg)) { 341 if (is_intnonneg (optarg)) {
342 critical_time = atoi (optarg); 342 critical_time = atoi (optarg);
343 check_critical_time = TRUE; 343 check_critical_time = true;
344 } 344 }
345 else { 345 else {
346 usage4 (_("Critical time must be a positive integer")); 346 usage4 (_("Critical time must be a positive integer"));
347 } 347 }
348 break; 348 break;
349 case 'v': /* verbose */ 349 case 'v': /* verbose */
350 verbose = TRUE; 350 verbose = true;
351 break; 351 break;
352 case 't': /* timeout */ 352 case 't': /* timeout */
353 if (is_intnonneg (optarg)) { 353 if (is_intnonneg (optarg)) {
diff --git a/plugins/check_smtp.c b/plugins/check_smtp.c
index fc0ae2c4..986c3e18 100644
--- a/plugins/check_smtp.c
+++ b/plugins/check_smtp.c
@@ -40,7 +40,7 @@ const char *email = "devel@monitoring-plugins.org";
40#include <ctype.h> 40#include <ctype.h>
41 41
42#ifdef HAVE_SSL 42#ifdef HAVE_SSL
43int check_cert = FALSE; 43bool check_cert = false;
44int days_till_exp_warn, days_till_exp_crit; 44int days_till_exp_warn, days_till_exp_crit;
45# define my_recv(buf, len) (((use_starttls || use_ssl) && ssl_established) ? np_net_ssl_read(buf, len) : read(sd, buf, len)) 45# define my_recv(buf, len) (((use_starttls || use_ssl) && ssl_established) ? np_net_ssl_read(buf, len) : read(sd, buf, len))
46# define my_send(buf, len) (((use_starttls || use_ssl) && ssl_established) ? np_net_ssl_write(buf, len) : send(sd, buf, len, 0)) 46# define my_send(buf, len) (((use_starttls || use_ssl) && ssl_established) ? np_net_ssl_write(buf, len) : send(sd, buf, len, 0))
@@ -100,17 +100,17 @@ char *authtype = NULL;
100char *authuser = NULL; 100char *authuser = NULL;
101char *authpass = NULL; 101char *authpass = NULL;
102double warning_time = 0; 102double warning_time = 0;
103int check_warning_time = FALSE; 103bool check_warning_time = false;
104double critical_time = 0; 104double critical_time = 0;
105int check_critical_time = FALSE; 105bool check_critical_time = false;
106int verbose = 0; 106int verbose = 0;
107int use_ssl = FALSE; 107bool use_ssl = false;
108int use_starttls = FALSE; 108bool use_starttls = false;
109int use_sni = FALSE; 109bool use_sni = false;
110short use_proxy_prefix = FALSE; 110bool use_proxy_prefix = false;
111short use_ehlo = FALSE; 111bool use_ehlo = false;
112short use_lhlo = FALSE; 112bool use_lhlo = false;
113short ssl_established = 0; 113bool ssl_established = false;
114char *localhostname = NULL; 114char *localhostname = NULL;
115int sd; 115int sd;
116char buffer[MAX_INPUT_BUFFER]; 116char buffer[MAX_INPUT_BUFFER];
@@ -118,13 +118,13 @@ enum {
118 TCP_PROTOCOL = 1, 118 TCP_PROTOCOL = 1,
119 UDP_PROTOCOL = 2, 119 UDP_PROTOCOL = 2,
120}; 120};
121int ignore_send_quit_failure = FALSE; 121bool ignore_send_quit_failure = false;
122 122
123 123
124int 124int
125main (int argc, char **argv) 125main (int argc, char **argv)
126{ 126{
127 short supports_tls=FALSE; 127 bool supports_tls = false;
128 int n = 0; 128 int n = 0;
129 double elapsed_time; 129 double elapsed_time;
130 long microsec; 130 long microsec;
@@ -230,7 +230,7 @@ main (int argc, char **argv)
230 } else if(use_ehlo || use_lhlo){ 230 } else if(use_ehlo || use_lhlo){
231 if(strstr(buffer, "250 STARTTLS") != NULL || 231 if(strstr(buffer, "250 STARTTLS") != NULL ||
232 strstr(buffer, "250-STARTTLS") != NULL){ 232 strstr(buffer, "250-STARTTLS") != NULL){
233 supports_tls=TRUE; 233 supports_tls=true;
234 } 234 }
235 } 235 }
236 236
@@ -466,7 +466,7 @@ main (int argc, char **argv)
466 fperfdata ("time", elapsed_time, "s", 466 fperfdata ("time", elapsed_time, "s",
467 (int)check_warning_time, warning_time, 467 (int)check_warning_time, warning_time,
468 (int)check_critical_time, critical_time, 468 (int)check_critical_time, critical_time,
469 TRUE, 0, FALSE, 0)); 469 true, 0, false, 0));
470 470
471 return result; 471 return result;
472} 472}
@@ -480,6 +480,8 @@ process_arguments (int argc, char **argv)
480 int c; 480 int c;
481 char* temp; 481 char* temp;
482 482
483 bool implicit_tls = false;
484
483 enum { 485 enum {
484 SNI_OPTION 486 SNI_OPTION
485 }; 487 };
@@ -560,7 +562,7 @@ process_arguments (int argc, char **argv)
560 break; 562 break;
561 case 'A': 563 case 'A':
562 authtype = optarg; 564 authtype = optarg;
563 use_ehlo = TRUE; 565 use_ehlo = true;
564 break; 566 break;
565 case 'U': 567 case 'U':
566 authuser = optarg; 568 authuser = optarg;
@@ -600,7 +602,7 @@ process_arguments (int argc, char **argv)
600 usage4 (_("Critical time must be a positive")); 602 usage4 (_("Critical time must be a positive"));
601 else { 603 else {
602 critical_time = strtod (optarg, NULL); 604 critical_time = strtod (optarg, NULL);
603 check_critical_time = TRUE; 605 check_critical_time = true;
604 } 606 }
605 break; 607 break;
606 case 'w': /* warning time threshold */ 608 case 'w': /* warning time threshold */
@@ -608,14 +610,14 @@ process_arguments (int argc, char **argv)
608 usage4 (_("Warning time must be a positive")); 610 usage4 (_("Warning time must be a positive"));
609 else { 611 else {
610 warning_time = strtod (optarg, NULL); 612 warning_time = strtod (optarg, NULL);
611 check_warning_time = TRUE; 613 check_warning_time = true;
612 } 614 }
613 break; 615 break;
614 case 'v': /* verbose */ 616 case 'v': /* verbose */
615 verbose++; 617 verbose++;
616 break; 618 break;
617 case 'q': 619 case 'q':
618 ignore_send_quit_failure++; /* ignore problem sending QUIT */ 620 ignore_send_quit_failure = true; /* ignore problem sending QUIT */
619 break; 621 break;
620 case 't': /* timeout */ 622 case 't': /* timeout */
621 if (is_intnonneg (optarg)) { 623 if (is_intnonneg (optarg)) {
@@ -645,33 +647,35 @@ process_arguments (int argc, char **argv)
645 usage2 ("Invalid certificate expiration period", optarg); 647 usage2 ("Invalid certificate expiration period", optarg);
646 days_till_exp_warn = atoi (optarg); 648 days_till_exp_warn = atoi (optarg);
647 } 649 }
648 check_cert = TRUE; 650 check_cert = true;
649 ignore_send_quit_failure = TRUE; 651 ignore_send_quit_failure = true;
650#else 652#else
651 usage (_("SSL support not available - install OpenSSL and recompile")); 653 usage (_("SSL support not available - install OpenSSL and recompile"));
652#endif 654#endif
655 implicit_tls = true;
656 // fallthrough
653 case 's': 657 case 's':
654 /* ssl */ 658 /* ssl */
655 use_ssl = TRUE; 659 use_ssl = true;
656 server_port = SMTPS_PORT; 660 server_port = SMTPS_PORT;
657 break; 661 break;
658 case 'S': 662 case 'S':
659 /* starttls */ 663 /* starttls */
660 use_starttls = TRUE; 664 use_starttls = true;
661 use_ehlo = TRUE; 665 use_ehlo = true;
662 break; 666 break;
663 case SNI_OPTION: 667 case SNI_OPTION:
664#ifdef HAVE_SSL 668#ifdef HAVE_SSL
665 use_sni = TRUE; 669 use_sni = true;
666#else 670#else
667 usage (_("SSL support not available - install OpenSSL and recompile")); 671 usage (_("SSL support not available - install OpenSSL and recompile"));
668#endif 672#endif
669 break; 673 break;
670 case 'r': 674 case 'r':
671 use_proxy_prefix = TRUE; 675 use_proxy_prefix = true;
672 break; 676 break;
673 case 'L': 677 case 'L':
674 use_lhlo = TRUE; 678 use_lhlo = true;
675 break; 679 break;
676 case '4': 680 case '4':
677 address_family = AF_INET; 681 address_family = AF_INET;
@@ -717,7 +721,12 @@ process_arguments (int argc, char **argv)
717 from_arg = strdup(" "); 721 from_arg = strdup(" ");
718 722
719 if (use_starttls && use_ssl) { 723 if (use_starttls && use_ssl) {
720 usage4 (_("Set either -s/--ssl/--tls or -S/--starttls")); 724 if (implicit_tls) {
725 use_ssl = false;
726 server_port = SMTP_PORT;
727 } else {
728 usage4 (_("Set either -s/--ssl/--tls or -S/--starttls"));
729 }
721 } 730 }
722 731
723 if (server_port_option != 0) { 732 if (server_port_option != 0) {
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c
index 56a586ad..90a04027 100644
--- a/plugins/check_snmp.c
+++ b/plugins/check_snmp.c
@@ -55,8 +55,6 @@ const char *email = "devel@monitoring-plugins.org";
55#define CRIT_STRING 2 55#define CRIT_STRING 2
56#define CRIT_REGEX 4 56#define CRIT_REGEX 4
57#define WARN_PRESENT 8 57#define WARN_PRESENT 8
58#define WARN_STRING 16
59#define WARN_REGEX 32
60 58
61#define OID_COUNT_STEP 8 59#define OID_COUNT_STEP 8
62 60
@@ -86,82 +84,82 @@ const char *email = "devel@monitoring-plugins.org";
86 84
87 85
88 86
89int process_arguments (int, char **); 87static int process_arguments (int, char **);
90int validate_arguments (void); 88static int validate_arguments (void);
91char *thisarg (char *str); 89static char *thisarg (char *str);
92char *nextarg (char *str); 90static char *nextarg (char *str);
93void print_usage (void); 91void print_usage (void);
94void print_help (void); 92static void print_help (void);
95char *multiply (char *str); 93static char *multiply (char *str);
96 94
97#include "regex.h" 95#include "regex.h"
98char regex_expect[MAX_INPUT_BUFFER] = ""; 96static char regex_expect[MAX_INPUT_BUFFER] = "";
99regex_t preg; 97static regex_t preg;
100regmatch_t pmatch[10]; 98static regmatch_t pmatch[10];
101char errbuf[MAX_INPUT_BUFFER] = ""; 99static char errbuf[MAX_INPUT_BUFFER] = "";
102char perfstr[MAX_INPUT_BUFFER] = "| "; 100static char perfstr[MAX_INPUT_BUFFER] = "| ";
103int cflags = REG_EXTENDED | REG_NOSUB | REG_NEWLINE; 101static int cflags = REG_EXTENDED | REG_NOSUB | REG_NEWLINE;
104int eflags = 0; 102static int eflags = 0;
105int errcode, excode; 103static int errcode, excode;
106 104
107char *server_address = NULL; 105static char *server_address = NULL;
108char *community = NULL; 106static char *community = NULL;
109char **contextargs = NULL; 107static char **contextargs = NULL;
110char *context = NULL; 108static char *context = NULL;
111char **authpriv = NULL; 109static char **authpriv = NULL;
112char *proto = NULL; 110static char *proto = NULL;
113char *seclevel = NULL; 111static char *seclevel = NULL;
114char *secname = NULL; 112static char *secname = NULL;
115char *authproto = NULL; 113static char *authproto = NULL;
116char *privproto = NULL; 114static char *privproto = NULL;
117char *authpasswd = NULL; 115static char *authpasswd = NULL;
118char *privpasswd = NULL; 116static char *privpasswd = NULL;
119int nulloid = STATE_UNKNOWN; 117static int nulloid = STATE_UNKNOWN;
120char **oids = NULL; 118static char **oids = NULL;
121size_t oids_size = 0; 119static size_t oids_size = 0;
122char *label; 120static char *label;
123char *units; 121static char *units;
124char *port; 122static char *port;
125char *snmpcmd; 123static char *snmpcmd;
126char string_value[MAX_INPUT_BUFFER] = ""; 124static char string_value[MAX_INPUT_BUFFER] = "";
127int invert_search=0; 125static int invert_search=0;
128char **labels = NULL; 126static char **labels = NULL;
129char **unitv = NULL; 127static char **unitv = NULL;
130size_t nlabels = 0; 128static size_t nlabels = 0;
131size_t labels_size = OID_COUNT_STEP; 129static size_t labels_size = OID_COUNT_STEP;
132size_t nunits = 0; 130static size_t nunits = 0;
133size_t unitv_size = OID_COUNT_STEP; 131static size_t unitv_size = OID_COUNT_STEP;
134int numoids = 0; 132static size_t numoids = 0;
135int numauthpriv = 0; 133static int numauthpriv = 0;
136int numcontext = 0; 134static int numcontext = 0;
137int verbose = 0; 135static int verbose = 0;
138int usesnmpgetnext = FALSE; 136static bool usesnmpgetnext = false;
139char *warning_thresholds = NULL; 137static char *warning_thresholds = NULL;
140char *critical_thresholds = NULL; 138static char *critical_thresholds = NULL;
141thresholds **thlds; 139static thresholds **thlds;
142size_t thlds_size = OID_COUNT_STEP; 140static size_t thlds_size = OID_COUNT_STEP;
143double *response_value; 141static double *response_value;
144size_t response_size = OID_COUNT_STEP; 142static size_t response_size = OID_COUNT_STEP;
145int retries = 0; 143static int retries = 0;
146int *eval_method; 144static int *eval_method;
147size_t eval_size = OID_COUNT_STEP; 145static size_t eval_size = OID_COUNT_STEP;
148char *delimiter; 146static char *delimiter;
149char *output_delim; 147static char *output_delim;
150char *miblist = NULL; 148static char *miblist = NULL;
151int needmibs = FALSE; 149static bool needmibs = false;
152int calculate_rate = 0; 150static int calculate_rate = 0;
153double offset = 0.0; 151static double offset = 0.0;
154int rate_multiplier = 1; 152static int rate_multiplier = 1;
155state_data *previous_state; 153static state_data *previous_state;
156double *previous_value; 154static double *previous_value;
157size_t previous_size = OID_COUNT_STEP; 155static size_t previous_size = OID_COUNT_STEP;
158int perf_labels = 1; 156static int perf_labels = 1;
159char* ip_version = ""; 157static char* ip_version = "";
160double multiplier = 1.0; 158static double multiplier = 1.0;
161char *fmtstr = ""; 159static char *fmtstr = "";
162bool fmtstr_set = false; 160static bool fmtstr_set = false;
163char buffer[DEFAULT_BUFFER_SIZE]; 161static char buffer[DEFAULT_BUFFER_SIZE];
164bool ignore_mib_parsing_errors = false; 162static bool ignore_mib_parsing_errors = false;
165 163
166static char *fix_snmp_range(char *th) 164static char *fix_snmp_range(char *th)
167{ 165{
@@ -187,7 +185,8 @@ static char *fix_snmp_range(char *th)
187int 185int
188main (int argc, char **argv) 186main (int argc, char **argv)
189{ 187{
190 int i, len, line, total_oids; 188 int len, total_oids;
189 size_t line;
191 unsigned int bk_count = 0, dq_count = 0; 190 unsigned int bk_count = 0, dq_count = 0;
192 int iresult = STATE_UNKNOWN; 191 int iresult = STATE_UNKNOWN;
193 int result = STATE_UNKNOWN; 192 int result = STATE_UNKNOWN;
@@ -253,14 +252,16 @@ main (int argc, char **argv)
253 if(calculate_rate) { 252 if(calculate_rate) {
254 if (!strcmp(label, "SNMP")) 253 if (!strcmp(label, "SNMP"))
255 label = strdup("SNMP RATE"); 254 label = strdup("SNMP RATE");
256 i=0; 255
256 size_t i = 0;
257
257 previous_state = np_state_read(); 258 previous_state = np_state_read();
258 if(previous_state!=NULL) { 259 if(previous_state!=NULL) {
259 /* Split colon separated values */ 260 /* Split colon separated values */
260 previous_string = strdup((char *) previous_state->data); 261 previous_string = strdup((char *) previous_state->data);
261 while((ap = strsep(&previous_string, ":")) != NULL) { 262 while((ap = strsep(&previous_string, ":")) != NULL) {
262 if(verbose>2) 263 if(verbose>2)
263 printf("State for %d=%s\n", i, ap); 264 printf("State for %zd=%s\n", i, ap);
264 while (i >= previous_size) { 265 while (i >= previous_size) {
265 previous_size += OID_COUNT_STEP; 266 previous_size += OID_COUNT_STEP;
266 previous_value = realloc(previous_value, previous_size * sizeof(*previous_value)); 267 previous_value = realloc(previous_value, previous_size * sizeof(*previous_value));
@@ -273,7 +274,7 @@ main (int argc, char **argv)
273 /* Populate the thresholds */ 274 /* Populate the thresholds */
274 th_warn=warning_thresholds; 275 th_warn=warning_thresholds;
275 th_crit=critical_thresholds; 276 th_crit=critical_thresholds;
276 for (i=0; i<numoids; i++) { 277 for (size_t i = 0; i < numoids; i++) {
277 char *w = th_warn ? strndup(th_warn, strcspn(th_warn, ",")) : NULL; 278 char *w = th_warn ? strndup(th_warn, strcspn(th_warn, ",")) : NULL;
278 char *c = th_crit ? strndup(th_crit, strcspn(th_crit, ",")) : NULL; 279 char *c = th_crit ? strndup(th_crit, strcspn(th_crit, ",")) : NULL;
279 /* translate "2:1" to "@1:2" for backwards compatibility */ 280 /* translate "2:1" to "@1:2" for backwards compatibility */
@@ -302,7 +303,7 @@ main (int argc, char **argv)
302 } 303 }
303 304
304 /* Create the command array to execute */ 305 /* Create the command array to execute */
305 if(usesnmpgetnext == TRUE) { 306 if(usesnmpgetnext) {
306 snmpcmd = strdup (PATH_TO_SNMPGETNEXT); 307 snmpcmd = strdup (PATH_TO_SNMPGETNEXT);
307 }else{ 308 }else{
308 snmpcmd = strdup (PATH_TO_SNMPGET); 309 snmpcmd = strdup (PATH_TO_SNMPGET);
@@ -333,11 +334,11 @@ main (int argc, char **argv)
333 } 334 }
334 335
335 336
336 for (i = 0; i < numcontext; i++) { 337 for (int i = 0; i < numcontext; i++) {
337 command_line[index++] = contextargs[i]; 338 command_line[index++] = contextargs[i];
338 } 339 }
339 340
340 for (i = 0; i < numauthpriv; i++) { 341 for (int i = 0; i < numauthpriv; i++) {
341 command_line[index++] = authpriv[i]; 342 command_line[index++] = authpriv[i];
342 } 343 }
343 344
@@ -348,7 +349,7 @@ main (int argc, char **argv)
348 server_address, 349 server_address,
349 port); 350 port);
350 351
351 for (i = 0; i < numoids; i++) { 352 for (size_t i = 0; i < numoids; i++) {
352 command_line[index++] = oids[i]; 353 command_line[index++] = oids[i];
353 xasprintf(&cl_hidden_auth, "%s %s", cl_hidden_auth, oids[i]); 354 xasprintf(&cl_hidden_auth, "%s %s", cl_hidden_auth, oids[i]);
354 } 355 }
@@ -382,7 +383,7 @@ main (int argc, char **argv)
382 if (external_error) { 383 if (external_error) {
383 if (chld_err.lines > 0) { 384 if (chld_err.lines > 0) {
384 printf (_("External command error: %s\n"), chld_err.line[0]); 385 printf (_("External command error: %s\n"), chld_err.line[0]);
385 for (i = 1; i < chld_err.lines; i++) { 386 for (size_t i = 1; i < chld_err.lines; i++) {
386 printf ("%s\n", chld_err.line[i]); 387 printf ("%s\n", chld_err.line[i]);
387 } 388 }
388 } else { 389 } else {
@@ -392,12 +393,14 @@ main (int argc, char **argv)
392 } 393 }
393 394
394 if (verbose) { 395 if (verbose) {
395 for (i = 0; i < chld_out.lines; i++) { 396 for (size_t i = 0; i < chld_out.lines; i++) {
396 printf ("%s\n", chld_out.line[i]); 397 printf ("%s\n", chld_out.line[i]);
397 } 398 }
398 } 399 }
399 400
400 for (line=0, i=0; line < chld_out.lines && i < numoids ; line++, i++) { 401 line = 0;
402 total_oids = 0;
403 for (size_t i = 0; line < chld_out.lines && i < numoids ; line++, i++, total_oids++) {
401 if(calculate_rate) 404 if(calculate_rate)
402 conv = "%.10g"; 405 conv = "%.10g";
403 else 406 else
@@ -410,7 +413,7 @@ main (int argc, char **argv)
410 break; 413 break;
411 414
412 if (verbose > 2) { 415 if (verbose > 2) {
413 printf("Processing oid %i (line %i)\n oidname: %s\n response: %s\n", i+1, line+1, oidname, response); 416 printf("Processing oid %zi (line %zi)\n oidname: %s\n response: %s\n", i+1, line+1, oidname, response);
414 } 417 }
415 418
416 /* Clean up type array - Sol10 does not necessarily zero it out */ 419 /* Clean up type array - Sol10 does not necessarily zero it out */
@@ -634,7 +637,6 @@ main (int argc, char **argv)
634 strncat(perfstr, " ", sizeof(perfstr)-strlen(perfstr)-1); 637 strncat(perfstr, " ", sizeof(perfstr)-strlen(perfstr)-1);
635 } 638 }
636 } 639 }
637 total_oids=i;
638 640
639 /* Save state data, as all data collected now */ 641 /* Save state data, as all data collected now */
640 if(calculate_rate) { 642 if(calculate_rate) {
@@ -644,7 +646,7 @@ main (int argc, char **argv)
644 die(STATE_UNKNOWN, _("Cannot malloc")); 646 die(STATE_UNKNOWN, _("Cannot malloc"));
645 647
646 current_length=0; 648 current_length=0;
647 for(i=0; i<total_oids; i++) { 649 for(int i = 0; i < total_oids; i++) {
648 xasprintf(&temp_string,"%.0f",response_value[i]); 650 xasprintf(&temp_string,"%.0f",response_value[i]);
649 if(temp_string==NULL) 651 if(temp_string==NULL)
650 die(STATE_UNKNOWN,_("Cannot asprintf()")); 652 die(STATE_UNKNOWN,_("Cannot asprintf()"));
@@ -687,7 +689,7 @@ process_arguments (int argc, char **argv)
687{ 689{
688 char *ptr; 690 char *ptr;
689 int c = 1; 691 int c = 1;
690 int j = 0, jj = 0, ii = 0; 692 size_t j = 0, jj = 0;
691 693
692 int option = 0; 694 int option = 0;
693 static struct option longopts[] = { 695 static struct option longopts[] = {
@@ -777,7 +779,7 @@ process_arguments (int argc, char **argv)
777 miblist = optarg; 779 miblist = optarg;
778 break; 780 break;
779 case 'n': /* usesnmpgetnext */ 781 case 'n': /* usesnmpgetnext */
780 usesnmpgetnext = TRUE; 782 usesnmpgetnext = true;
781 break; 783 break;
782 case 'P': /* SNMP protocol version */ 784 case 'P': /* SNMP protocol version */
783 proto = optarg; 785 proto = optarg;
@@ -831,7 +833,7 @@ process_arguments (int argc, char **argv)
831 * so we have a mib variable, rather than just an SNMP OID, 833 * so we have a mib variable, rather than just an SNMP OID,
832 * so we have to actually read the mib files 834 * so we have to actually read the mib files
833 */ 835 */
834 needmibs = TRUE; 836 needmibs = true;
835 } 837 }
836 for (ptr = strtok(optarg, ", "); ptr != NULL; ptr = strtok(NULL, ", "), j++) { 838 for (ptr = strtok(optarg, ", "); ptr != NULL; ptr = strtok(NULL, ", "), j++) {
837 while (j >= oids_size) { 839 while (j >= oids_size) {
@@ -843,7 +845,6 @@ process_arguments (int argc, char **argv)
843 numoids = j; 845 numoids = j;
844 if (c == 'E' || c == 'e') { 846 if (c == 'E' || c == 'e') {
845 jj++; 847 jj++;
846 ii++;
847 while (j+1 >= eval_size) { 848 while (j+1 >= eval_size) {
848 eval_size += OID_COUNT_STEP; 849 eval_size += OID_COUNT_STEP;
849 eval_method = realloc(eval_method, eval_size * sizeof(*eval_method)); 850 eval_method = realloc(eval_method, eval_size * sizeof(*eval_method));
@@ -870,7 +871,6 @@ process_arguments (int argc, char **argv)
870 memset(eval_method + eval_size - OID_COUNT_STEP, 0, 8); 871 memset(eval_method + eval_size - OID_COUNT_STEP, 0, 8);
871 } 872 }
872 eval_method[jj++] = CRIT_STRING; 873 eval_method[jj++] = CRIT_STRING;
873 ii++;
874 break; 874 break;
875 case 'R': /* regex */ 875 case 'R': /* regex */
876 cflags = REG_ICASE; 876 cflags = REG_ICASE;
@@ -891,7 +891,6 @@ process_arguments (int argc, char **argv)
891 memset(eval_method + eval_size - OID_COUNT_STEP, 0, 8); 891 memset(eval_method + eval_size - OID_COUNT_STEP, 0, 8);
892 } 892 }
893 eval_method[jj++] = CRIT_REGEX; 893 eval_method[jj++] = CRIT_REGEX;
894 ii++;
895 break; 894 break;
896 895
897 /* Format */ 896 /* Format */
@@ -1029,12 +1028,12 @@ selected.</para>
1029 1028
1030 1029
1031 1030
1032int 1031static int
1033validate_arguments () 1032validate_arguments ()
1034{ 1033{
1035 /* check whether to load locally installed MIBS (CPU/disk intensive) */ 1034 /* check whether to load locally installed MIBS (CPU/disk intensive) */
1036 if (miblist == NULL) { 1035 if (miblist == NULL) {
1037 if ( needmibs == TRUE ) { 1036 if (needmibs) {
1038 miblist = strdup (DEFAULT_MIBLIST); 1037 miblist = strdup (DEFAULT_MIBLIST);
1039 }else{ 1038 }else{
1040 miblist = ""; /* don't read any mib files for numeric oids */ 1039 miblist = ""; /* don't read any mib files for numeric oids */
@@ -1138,7 +1137,7 @@ validate_arguments ()
1138/* trim leading whitespace 1137/* trim leading whitespace
1139 if there is a leading quote, make sure it balances */ 1138 if there is a leading quote, make sure it balances */
1140 1139
1141char * 1140static char *
1142thisarg (char *str) 1141thisarg (char *str)
1143{ 1142{
1144 str += strspn (str, " \t\r\n"); /* trim any leading whitespace */ 1143 str += strspn (str, " \t\r\n"); /* trim any leading whitespace */
@@ -1155,7 +1154,7 @@ thisarg (char *str)
1155 set the trailing quote to '\x0' 1154 set the trailing quote to '\x0'
1156 if the string continues, advance beyond the comma */ 1155 if the string continues, advance beyond the comma */
1157 1156
1158char * 1157static char *
1159nextarg (char *str) 1158nextarg (char *str)
1160{ 1159{
1161 if (str[0] == '\'') { 1160 if (str[0] == '\'') {
@@ -1187,7 +1186,7 @@ nextarg (char *str)
1187 1186
1188 1187
1189/* multiply result (values 0 < n < 1 work as divider) */ 1188/* multiply result (values 0 < n < 1 work as divider) */
1190char * 1189static char *
1191multiply (char *str) 1190multiply (char *str)
1192{ 1191{
1193 char *endptr; 1192 char *endptr;
@@ -1224,7 +1223,7 @@ multiply (char *str)
1224} 1223}
1225 1224
1226 1225
1227void 1226static void
1228print_help (void) 1227print_help (void)
1229{ 1228{
1230 print_revision (progname, NP_VERSION); 1229 print_revision (progname, NP_VERSION);
@@ -1252,10 +1251,12 @@ print_help (void)
1252 printf (" %s\n", _("SNMPv3 context")); 1251 printf (" %s\n", _("SNMPv3 context"));
1253 printf (" %s\n", "-L, --seclevel=[noAuthNoPriv|authNoPriv|authPriv]"); 1252 printf (" %s\n", "-L, --seclevel=[noAuthNoPriv|authNoPriv|authPriv]");
1254 printf (" %s\n", _("SNMPv3 securityLevel")); 1253 printf (" %s\n", _("SNMPv3 securityLevel"));
1255 printf (" %s\n", "-a, --authproto=[MD5|SHA]"); 1254 printf (" %s\n", "-a, --authproto=AUTHENTICATION_PROTOCOL");
1256 printf (" %s\n", _("SNMPv3 auth proto")); 1255 printf (" %s\n", _("SNMPv3 authentication protocol (default MD5), available options depend on the specific version of the net-snmp tools"));
1257 printf (" %s\n", "-x, --privproto=[DES|AES]"); 1256 printf (" %s\n", _("if < 5.8 SHA (1) and MD5 should be available, if >= 5.8 additionally SHA-224, SHA-256, SHA-384 and SHA-512"));
1258 printf (" %s\n", _("SNMPv3 priv proto (default DES)")); 1257 printf (" %s\n", "-x, --privproto=PRIVACY_PROTOCOL");
1258 printf (" %s\n", _("SNMPv3 privacy protocol (default DES), available options depend on the specific version of the net-snmp tools"));
1259 printf (" %s\n", _("if < 5.8 DES and AES should be available, if >= 5.8 additionally AES-192 and AES-256"));
1259 1260
1260 /* Authentication Tokens*/ 1261 /* Authentication Tokens*/
1261 printf (" %s\n", "-C, --community=STRING"); 1262 printf (" %s\n", "-C, --community=STRING");
diff --git a/plugins/check_ssh.c b/plugins/check_ssh.c
index 8ccbd5a7..34ef37b7 100644
--- a/plugins/check_ssh.c
+++ b/plugins/check_ssh.c
@@ -1,39 +1,39 @@
1/***************************************************************************** 1/*****************************************************************************
2* 2*
3* Monitoring check_ssh plugin 3* Monitoring check_ssh plugin
4* 4*
5* License: GPL 5* License: GPL
6* Copyright (c) 2000-2007 Monitoring Plugins Development Team 6* Copyright (c) 2000-2007 Monitoring Plugins Development Team
7* 7*
8* Description: 8* Description:
9* 9*
10* This file contains the check_ssh plugin 10* This file contains the check_ssh plugin
11* 11*
12* Try to connect to an SSH server at specified server and port 12* Try to connect to an SSH server at specified server and port
13* 13*
14* 14*
15* This program is free software: you can redistribute it and/or modify 15* This program is free software: you can redistribute it and/or modify
16* it under the terms of the GNU General Public License as published by 16* it under the terms of the GNU General Public License as published by
17* the Free Software Foundation, either version 3 of the License, or 17* the Free Software Foundation, either version 3 of the License, or
18* (at your option) any later version. 18* (at your option) any later version.
19* 19*
20* This program is distributed in the hope that it will be useful, 20* This program is distributed in the hope that it will be useful,
21* but WITHOUT ANY WARRANTY; without even the implied warranty of 21* but WITHOUT ANY WARRANTY; without even the implied warranty of
22* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23* GNU General Public License for more details. 23* GNU General Public License for more details.
24* 24*
25* You should have received a copy of the GNU General Public License 25* You should have received a copy of the GNU General Public License
26* along with this program. If not, see <http://www.gnu.org/licenses/>. 26* along with this program. If not, see <http://www.gnu.org/licenses/>.
27* 27*
28* 28*
29*****************************************************************************/ 29*****************************************************************************/
30 30
31const char *progname = "check_ssh"; 31const char *progname = "check_ssh";
32const char *copyright = "2000-2007"; 32const char *copyright = "2000-2007";
33const char *email = "devel@monitoring-plugins.org"; 33const char *email = "devel@monitoring-plugins.org";
34 34
35#include "common.h" 35#include "./common.h"
36#include "netutils.h" 36#include "./netutils.h"
37#include "utils.h" 37#include "utils.h"
38 38
39#ifndef MSG_DONTWAIT 39#ifndef MSG_DONTWAIT
@@ -47,7 +47,7 @@ int port = -1;
47char *server_name = NULL; 47char *server_name = NULL;
48char *remote_version = NULL; 48char *remote_version = NULL;
49char *remote_protocol = NULL; 49char *remote_protocol = NULL;
50int verbose = FALSE; 50bool verbose = false;
51 51
52int process_arguments (int, char **); 52int process_arguments (int, char **);
53int validate_arguments (void); 53int validate_arguments (void);
@@ -57,7 +57,6 @@ void print_usage (void);
57int ssh_connect (char *haddr, int hport, char *remote_version, char *remote_protocol); 57int ssh_connect (char *haddr, int hport, char *remote_version, char *remote_protocol);
58 58
59 59
60
61int 60int
62main (int argc, char **argv) 61main (int argc, char **argv)
63{ 62{
@@ -106,7 +105,7 @@ process_arguments (int argc, char **argv)
106 {"timeout", required_argument, 0, 't'}, 105 {"timeout", required_argument, 0, 't'},
107 {"verbose", no_argument, 0, 'v'}, 106 {"verbose", no_argument, 0, 'v'},
108 {"remote-version", required_argument, 0, 'r'}, 107 {"remote-version", required_argument, 0, 'r'},
109 {"remote-protcol", required_argument, 0, 'P'}, 108 {"remote-protocol", required_argument, 0, 'P'},
110 {0, 0, 0, 0} 109 {0, 0, 0, 0}
111 }; 110 };
112 111
@@ -133,7 +132,7 @@ process_arguments (int argc, char **argv)
133 print_help (); 132 print_help ();
134 exit (STATE_UNKNOWN); 133 exit (STATE_UNKNOWN);
135 case 'v': /* verbose */ 134 case 'v': /* verbose */
136 verbose = TRUE; 135 verbose = true;
137 break; 136 break;
138 case 't': /* timeout period */ 137 case 't': /* timeout period */
139 if (!is_integer (optarg)) 138 if (!is_integer (optarg))
@@ -158,7 +157,7 @@ process_arguments (int argc, char **argv)
158 remote_protocol = optarg; 157 remote_protocol = optarg;
159 break; 158 break;
160 case 'H': /* host */ 159 case 'H': /* host */
161 if (is_host (optarg) == FALSE) 160 if (!is_host (optarg))
162 usage2 (_("Invalid hostname/address"), optarg); 161 usage2 (_("Invalid hostname/address"), optarg);
163 server_name = optarg; 162 server_name = optarg;
164 break; 163 break;
@@ -215,7 +214,9 @@ ssh_connect (char *haddr, int hport, char *remote_version, char *remote_protocol
215{ 214{
216 int sd; 215 int sd;
217 int result; 216 int result;
218 char *output = NULL; 217 int len = 0;
218 ssize_t recv_ret = 0;
219 char *version_control_string = NULL;
219 char *buffer = NULL; 220 char *buffer = NULL;
220 char *ssh_proto = NULL; 221 char *ssh_proto = NULL;
221 char *ssh_server = NULL; 222 char *ssh_server = NULL;
@@ -230,52 +231,126 @@ ssh_connect (char *haddr, int hport, char *remote_version, char *remote_protocol
230 if (result != STATE_OK) 231 if (result != STATE_OK)
231 return result; 232 return result;
232 233
233 output = (char *) malloc (BUFF_SZ + 1); 234 char *output = (char *) calloc (BUFF_SZ + 1, sizeof(char));
234 memset (output, 0, BUFF_SZ + 1); 235
235 recv (sd, output, BUFF_SZ, 0); 236 unsigned int iteration = 0;
236 if (strncmp (output, "SSH", 3)) { 237 ssize_t byte_offset = 0;
237 printf (_("Server answer: %s"), output); 238
238 close(sd); 239 while ((version_control_string == NULL) && (recv_ret = recv(sd, output+byte_offset, BUFF_SZ - byte_offset, 0) > 0)) {
240
241 if (strchr(output, '\n')) { /* we've got at least one full line, start parsing*/
242 byte_offset = 0;
243
244 char *index = NULL;
245 while ((index = strchr(output+byte_offset, '\n')) != NULL) {
246 /*Partition the buffer so that this line is a separate string,
247 * by replacing the newline with NUL*/
248 output[(index - output)] = '\0';
249 len = strlen(output + byte_offset);
250
251 if ((len >= 4) && (strncmp (output+byte_offset, "SSH-", 4) == 0)) {
252 /*if the string starts with SSH-, this _should_ be a valid version control string*/
253 version_control_string = output+byte_offset;
254 break;
255 }
256
257 /*the start of the next line (if one exists) will be after the current one (+ NUL)*/
258 byte_offset += (len + 1);
259 }
260
261 if(version_control_string == NULL) {
262 /* move unconsumed data to beginning of buffer, null rest */
263 memmove((void *)output, (void *)output+byte_offset+1, BUFF_SZ - len+1);
264 memset(output+byte_offset+1, 0, BUFF_SZ-byte_offset+1);
265
266 /*start reading from end of current line chunk on next recv*/
267 byte_offset = strlen(output);
268 }
269 } else {
270 byte_offset += recv_ret;
271 }
272 }
273
274 if (recv_ret < 0) {
275 printf("SSH CRITICAL - %s", strerror(errno));
276 exit(STATE_CRITICAL);
277 }
278
279 if (version_control_string == NULL) {
280 printf("SSH CRITICAL - No version control string received");
281 exit(STATE_CRITICAL);
282 }
283 /*
284 * "When the connection has been established, both sides MUST send an
285 * identification string. This identification string MUST be
286 *
287 * SSH-protoversion-softwareversion SP comments CR LF"
288 * - RFC 4253:4.2
289 */
290 strip (version_control_string);
291 if (verbose)
292 printf ("%s\n", version_control_string);
293 ssh_proto = version_control_string + 4;
294
295 /*
296 * We assume the protoversion is of the form Major.Minor, although
297 * this is not _strictly_ required. See
298 *
299 * "Both the 'protoversion' and 'softwareversion' strings MUST consist of
300 * printable US-ASCII characters, with the exception of whitespace
301 * characters and the minus sign (-)"
302 * - RFC 4253:4.2
303 * and,
304 *
305 * "As stated earlier, the 'protoversion' specified for this protocol is
306 * "2.0". Earlier versions of this protocol have not been formally
307 * documented, but it is widely known that they use 'protoversion' of
308 * "1.x" (e.g., "1.5" or "1.3")."
309 * - RFC 4253:5
310 */
311 ssh_server = ssh_proto + strspn (ssh_proto, "0123456789.") + 1; /* (+1 for the '-' separating protoversion from softwareversion) */
312
313 /* If there's a space in the version string, whatever's after the space is a comment
314 * (which is NOT part of the server name/version)*/
315 char *tmp = strchr(ssh_server, ' ');
316 if (tmp) {
317 ssh_server[tmp - ssh_server] = '\0';
318 }
319 if (strlen(ssh_proto) == 0 || strlen(ssh_server) == 0) {
320 printf(_("SSH CRITICAL - Invalid protocol version control string %s\n"), version_control_string);
239 exit (STATE_CRITICAL); 321 exit (STATE_CRITICAL);
240 } 322 }
241 else { 323 ssh_proto[strspn (ssh_proto, "0123456789. ")] = 0;
242 strip (output);
243 if (verbose)
244 printf ("%s\n", output);
245 ssh_proto = output + 4;
246 ssh_server = ssh_proto + strspn (ssh_proto, "-0123456789. ");
247 ssh_proto[strspn (ssh_proto, "0123456789. ")] = 0;
248
249 xasprintf (&buffer, "SSH-%s-check_ssh_%s\r\n", ssh_proto, rev_no);
250 send (sd, buffer, strlen (buffer), MSG_DONTWAIT);
251 if (verbose)
252 printf ("%s\n", buffer);
253
254 if (remote_version && strcmp(remote_version, ssh_server)) {
255 printf
256 (_("SSH CRITICAL - %s (protocol %s) version mismatch, expected '%s'\n"),
257 ssh_server, ssh_proto, remote_version);
258 close(sd);
259 exit (STATE_CRITICAL);
260 }
261 324
262 if (remote_protocol && strcmp(remote_protocol, ssh_proto)) { 325 xasprintf (&buffer, "SSH-%s-check_ssh_%s\r\n", ssh_proto, rev_no);
263 printf 326 send (sd, buffer, strlen (buffer), MSG_DONTWAIT);
264 (_("SSH CRITICAL - %s (protocol %s) protocol version mismatch, expected '%s'\n"), 327 if (verbose)
265 ssh_server, ssh_proto, remote_protocol); 328 printf ("%s\n", buffer);
266 close(sd);
267 exit (STATE_CRITICAL);
268 }
269 329
270 elapsed_time = (double)deltime(tv) / 1.0e6; 330 if (remote_version && strcmp(remote_version, ssh_server)) {
331 printf
332 (_("SSH CRITICAL - %s (protocol %s) version mismatch, expected '%s'\n"),
333 ssh_server, ssh_proto, remote_version);
334 close(sd);
335 exit (STATE_CRITICAL);
336 }
271 337
338 if (remote_protocol && strcmp(remote_protocol, ssh_proto)) {
272 printf 339 printf
273 (_("SSH OK - %s (protocol %s) | %s\n"), 340 (_("SSH CRITICAL - %s (protocol %s) protocol version mismatch, expected '%s' | %s\n"),
274 ssh_server, ssh_proto, fperfdata("time", elapsed_time, "s", 341 ssh_server, ssh_proto, remote_protocol, fperfdata("time", elapsed_time, "s",
275 FALSE, 0, FALSE, 0, TRUE, 0, TRUE, (int)socket_timeout)); 342 false, 0, false, 0, true, 0, true, (int)socket_timeout));
276 close(sd); 343 close(sd);
277 exit (STATE_OK); 344 exit (STATE_CRITICAL);
278 } 345 }
346 elapsed_time = (double)deltime(tv) / 1.0e6;
347
348 printf
349 (_("SSH OK - %s (protocol %s) | %s\n"),
350 ssh_server, ssh_proto, fperfdata("time", elapsed_time, "s",
351 false, 0, false, 0, true, 0, true, (int)socket_timeout));
352 close(sd);
353 exit (STATE_OK);
279} 354}
280 355
281 356
@@ -293,7 +368,7 @@ print_help (void)
293 368
294 printf ("%s\n", _("Try to connect to an SSH server at specified server and port")); 369 printf ("%s\n", _("Try to connect to an SSH server at specified server and port"));
295 370
296 printf ("\n\n"); 371 printf ("\n\n");
297 372
298 print_usage (); 373 print_usage ();
299 374
@@ -307,10 +382,10 @@ print_help (void)
307 printf (UT_CONN_TIMEOUT, DEFAULT_SOCKET_TIMEOUT); 382 printf (UT_CONN_TIMEOUT, DEFAULT_SOCKET_TIMEOUT);
308 383
309 printf (" %s\n", "-r, --remote-version=STRING"); 384 printf (" %s\n", "-r, --remote-version=STRING");
310 printf (" %s\n", _("Alert if string doesn't match expected server version (ex: OpenSSH_3.9p1)")); 385 printf (" %s\n", _("Alert if string doesn't match expected server version (ex: OpenSSH_3.9p1)"));
311 386
312 printf (" %s\n", "-P, --remote-protocol=STRING"); 387 printf (" %s\n", "-P, --remote-protocol=STRING");
313 printf (" %s\n", _("Alert if protocol doesn't match expected protocol version (ex: 2.0)")); 388 printf (" %s\n", _("Alert if protocol doesn't match expected protocol version (ex: 2.0)"));
314 389
315 printf (UT_VERBOSE); 390 printf (UT_VERBOSE);
316 391
@@ -322,7 +397,7 @@ print_help (void)
322void 397void
323print_usage (void) 398print_usage (void)
324{ 399{
325 printf ("%s\n", _("Usage:")); 400 printf ("%s\n", _("Usage:"));
326 printf ("%s [-4|-6] [-t <timeout>] [-r <remote version>] [-p <port>] <host>\n", progname); 401 printf ("%s [-4|-6] [-t <timeout>] [-r <remote version>] [-p <port>] <host>\n", progname);
327} 402}
328 403
diff --git a/plugins/check_swap.c b/plugins/check_swap.c
index cd965e31..e7ee785d 100644
--- a/plugins/check_swap.c
+++ b/plugins/check_swap.c
@@ -4,7 +4,7 @@
4* 4*
5* License: GPL 5* License: GPL
6* Copyright (c) 2000 Karl DeBisschop (kdebisschop@users.sourceforge.net) 6* Copyright (c) 2000 Karl DeBisschop (kdebisschop@users.sourceforge.net)
7* Copyright (c) 2000-2007 Monitoring Plugins Development Team 7* Copyright (c) 2000-2024 Monitoring Plugins Development Team
8* 8*
9* Description: 9* Description:
10* 10*
@@ -28,7 +28,7 @@
28*****************************************************************************/ 28*****************************************************************************/
29 29
30const char *progname = "check_swap"; 30const char *progname = "check_swap";
31const char *copyright = "2000-2007"; 31const char *copyright = "2000-2024";
32const char *email = "devel@monitoring-plugins.org"; 32const char *email = "devel@monitoring-plugins.org";
33 33
34#include "common.h" 34#include "common.h"
@@ -52,9 +52,9 @@ const char *email = "devel@monitoring-plugins.org";
52#endif 52#endif
53 53
54typedef struct { 54typedef struct {
55 int is_percentage; 55 bool is_percentage;
56 uint64_t value; 56 uint64_t value;
57} threshold_t; 57} threshold;
58 58
59int check_swap (float free_swap_mb, float total_swap_mb); 59int check_swap (float free_swap_mb, float total_swap_mb);
60int process_arguments (int argc, char **argv); 60int process_arguments (int argc, char **argv);
@@ -62,10 +62,10 @@ int validate_arguments (void);
62void print_usage (void); 62void print_usage (void);
63void print_help (void); 63void print_help (void);
64 64
65threshold_t warn; 65threshold warn;
66threshold_t crit; 66threshold crit;
67int verbose; 67int verbose;
68int allswaps; 68bool allswaps = false;
69int no_swap_state = STATE_CRITICAL; 69int no_swap_state = STATE_CRITICAL;
70 70
71int 71int
@@ -383,10 +383,10 @@ main (int argc, char **argv)
383 if (crit.is_percentage) crit_print = crit.value * (total_swap_mb *1024 *1024/100); 383 if (crit.is_percentage) crit_print = crit.value * (total_swap_mb *1024 *1024/100);
384 384
385 puts (perfdata_uint64 ("swap", free_swap_mb *1024 *1024, "B", 385 puts (perfdata_uint64 ("swap", free_swap_mb *1024 *1024, "B",
386 TRUE, warn_print, 386 true, warn_print,
387 TRUE, crit_print, 387 true, crit_print,
388 TRUE, 0, 388 true, 0,
389 TRUE, (long) total_swap_mb * 1024 * 1024)); 389 true, (long) total_swap_mb * 1024 * 1024));
390 390
391 return result; 391 return result;
392} 392}
@@ -399,28 +399,30 @@ check_swap(float free_swap_mb, float total_swap_mb)
399 if (!total_swap_mb) return no_swap_state; 399 if (!total_swap_mb) return no_swap_state;
400 400
401 uint64_t free_swap = free_swap_mb * (1024 * 1024); /* Convert back to bytes as warn and crit specified in bytes */ 401 uint64_t free_swap = free_swap_mb * (1024 * 1024); /* Convert back to bytes as warn and crit specified in bytes */
402
403 if (!crit.is_percentage && crit.value >= free_swap) return STATE_CRITICAL;
404 if (!warn.is_percentage && warn.value >= free_swap) return STATE_WARNING;
405
406
407 uint64_t usage_percentage = ((total_swap_mb - free_swap_mb) / total_swap_mb) * 100; 402 uint64_t usage_percentage = ((total_swap_mb - free_swap_mb) / total_swap_mb) * 100;
408 403
409 if (crit.is_percentage && 404 if (warn.value || crit.value) { /* Thresholds defined */
410 crit.value != 0 && 405 if (!crit.is_percentage && crit.value >= free_swap) return STATE_CRITICAL;
411 usage_percentage >= (100 - crit.value)) 406 if (!warn.is_percentage && warn.value >= free_swap) return STATE_WARNING;
412 { 407
413 return STATE_CRITICAL; 408 if (crit.is_percentage &&
414 } 409 crit.value != 0 &&
415 410 usage_percentage >= (100 - crit.value))
416 if (warn.is_percentage && 411 {
417 warn.value != 0 && 412 return STATE_CRITICAL;
418 usage_percentage >= (100 - warn.value)) 413 }
419 { 414
420 return STATE_WARNING; 415 if (warn.is_percentage &&
421 } 416 warn.value != 0 &&
422 417 usage_percentage >= (100 - warn.value))
423 return STATE_OK; 418 {
419 return STATE_WARNING;
420 }
421
422 return STATE_OK;
423 } else { /* Without thresholds */
424 return STATE_OK;
425 }
424} 426}
425 427
426 428
@@ -443,9 +445,6 @@ process_arguments (int argc, char **argv)
443 {0, 0, 0, 0} 445 {0, 0, 0, 0}
444 }; 446 };
445 447
446 if (argc < 2)
447 return ERROR;
448
449 while (1) { 448 while (1) {
450 c = getopt_long (argc, argv, "+?Vvhac:w:n:", longopts, &option); 449 c = getopt_long (argc, argv, "+?Vvhac:w:n:", longopts, &option);
451 450
@@ -465,7 +464,7 @@ process_arguments (int argc, char **argv)
465 464
466 if (optarg[length - 1] == '%') { 465 if (optarg[length - 1] == '%') {
467 /* It's percentage */ 466 /* It's percentage */
468 warn.is_percentage = 1; 467 warn.is_percentage = true;
469 optarg[length - 1] = '\0'; 468 optarg[length - 1] = '\0';
470 if (is_uint64(optarg, &warn.value)) { 469 if (is_uint64(optarg, &warn.value)) {
471 if (warn.value > 100) { 470 if (warn.value > 100) {
@@ -475,7 +474,7 @@ process_arguments (int argc, char **argv)
475 break; 474 break;
476 } else { 475 } else {
477 /* It's Bytes */ 476 /* It's Bytes */
478 warn.is_percentage = 0; 477 warn.is_percentage = false;
479 if (is_uint64(optarg, &warn.value)) { 478 if (is_uint64(optarg, &warn.value)) {
480 break; 479 break;
481 } else { 480 } else {
@@ -495,7 +494,7 @@ process_arguments (int argc, char **argv)
495 494
496 if (optarg[length - 1] == '%') { 495 if (optarg[length - 1] == '%') {
497 /* It's percentage */ 496 /* It's percentage */
498 crit.is_percentage = 1; 497 crit.is_percentage = true;
499 optarg[length - 1] = '\0'; 498 optarg[length - 1] = '\0';
500 if (is_uint64(optarg, &crit.value)) { 499 if (is_uint64(optarg, &crit.value)) {
501 if (crit.value> 100) { 500 if (crit.value> 100) {
@@ -505,7 +504,7 @@ process_arguments (int argc, char **argv)
505 break; 504 break;
506 } else { 505 } else {
507 /* It's Bytes */ 506 /* It's Bytes */
508 crit.is_percentage = 0; 507 crit.is_percentage = false;
509 if (is_uint64(optarg, &crit.value)) { 508 if (is_uint64(optarg, &crit.value)) {
510 break; 509 break;
511 } else { 510 } else {
@@ -514,7 +513,7 @@ process_arguments (int argc, char **argv)
514 } 513 }
515 } 514 }
516 case 'a': /* all swap */ 515 case 'a': /* all swap */
517 allswaps = TRUE; 516 allswaps = true;
518 break; 517 break;
519 case 'n': 518 case 'n':
520 if ((no_swap_state = mp_translate_state(optarg)) == ERROR) { 519 if ((no_swap_state = mp_translate_state(optarg)) == ERROR) {
@@ -547,10 +546,7 @@ process_arguments (int argc, char **argv)
547int 546int
548validate_arguments (void) 547validate_arguments (void)
549{ 548{
550 if (warn.value == 0 && crit.value == 0) { 549 if ((warn.is_percentage == crit.is_percentage) && (warn.value < crit.value)) {
551 return ERROR;
552 }
553 else if ((warn.is_percentage == crit.is_percentage) && (warn.value < crit.value)) {
554 /* This is NOT triggered if warn and crit are different units, e.g warn is percentage 550 /* This is NOT triggered if warn and crit are different units, e.g warn is percentage
555 * and crit is absolute. We cannot determine the condition at this point since we 551 * and crit is absolute. We cannot determine the condition at this point since we
556 * dont know the value of total swap yet 552 * dont know the value of total swap yet
@@ -595,6 +591,7 @@ print_help (void)
595 printf ("\n"); 591 printf ("\n");
596 printf ("%s\n", _("Notes:")); 592 printf ("%s\n", _("Notes:"));
597 printf (" %s\n", _("Both INTEGER and PERCENT thresholds can be specified, they are all checked.")); 593 printf (" %s\n", _("Both INTEGER and PERCENT thresholds can be specified, they are all checked."));
594 printf (" %s\n", _("Without thresholds, the plugin shows free swap space and performance data, but always returns OK."));
598 printf (" %s\n", _("On AIX, if -a is specified, uses lsps -a, otherwise uses lsps -s.")); 595 printf (" %s\n", _("On AIX, if -a is specified, uses lsps -a, otherwise uses lsps -s."));
599 596
600 printf (UT_SUPPORT); 597 printf (UT_SUPPORT);
@@ -605,6 +602,6 @@ void
605print_usage (void) 602print_usage (void)
606{ 603{
607 printf ("%s\n", _("Usage:")); 604 printf ("%s\n", _("Usage:"));
608 printf (" %s [-av] -w <percent_free>%% -c <percent_free>%%\n",progname); 605 printf (" %s [-av] [-w <percent_free>%%] [-c <percent_free>%%]\n",progname);
609 printf (" -w <bytes_free> -c <bytes_free> [-n <state>]\n"); 606 printf (" [-w <bytes_free>] [-c <bytes_free>] [-n <state>]\n");
610} 607}
diff --git a/plugins/check_tcp.c b/plugins/check_tcp.c
index 1d307cf3..01dd35eb 100644
--- a/plugins/check_tcp.c
+++ b/plugins/check_tcp.c
@@ -41,7 +41,7 @@ const char *email = "devel@monitoring-plugins.org";
41#include <sys/select.h> 41#include <sys/select.h>
42 42
43#ifdef HAVE_SSL 43#ifdef HAVE_SSL
44static int check_cert = FALSE; 44static bool check_cert = false;
45static int days_till_exp_warn, days_till_exp_crit; 45static int days_till_exp_warn, days_till_exp_crit;
46# define my_recv(buf, len) ((flags & FLAG_SSL) ? np_net_ssl_read(buf, len) : read(sd, buf, len)) 46# define my_recv(buf, len) ((flags & FLAG_SSL) ? np_net_ssl_read(buf, len) : read(sd, buf, len))
47# define my_send(buf, len) ((flags & FLAG_SSL) ? np_net_ssl_write(buf, len) : send(sd, buf, len, 0)) 47# define my_send(buf, len) ((flags & FLAG_SSL) ? np_net_ssl_write(buf, len) : send(sd, buf, len, 0))
@@ -65,12 +65,12 @@ static int READ_TIMEOUT = 2;
65 65
66static int server_port = 0; 66static int server_port = 0;
67static char *server_address = NULL; 67static char *server_address = NULL;
68static int host_specified = FALSE; 68static bool host_specified = false;
69static char *server_send = NULL; 69static char *server_send = NULL;
70static char *server_quit = NULL; 70static char *server_quit = NULL;
71static char **server_expect; 71static char **server_expect;
72static size_t server_expect_count = 0; 72static size_t server_expect_count = 0;
73static size_t maxbytes = 0; 73static ssize_t maxbytes = 0;
74static char **warn_codes = NULL; 74static char **warn_codes = NULL;
75static size_t warn_codes_count = 0; 75static size_t warn_codes_count = 0;
76static char **crit_codes = NULL; 76static char **crit_codes = NULL;
@@ -88,7 +88,7 @@ static int match_flags = NP_MATCH_EXACT;
88 88
89#ifdef HAVE_SSL 89#ifdef HAVE_SSL
90static char *sni = NULL; 90static char *sni = NULL;
91static int sni_specified = FALSE; 91static bool sni_specified = false;
92#endif 92#endif
93 93
94#define FLAG_SSL 0x01 94#define FLAG_SSL 0x01
@@ -102,11 +102,9 @@ int
102main (int argc, char **argv) 102main (int argc, char **argv)
103{ 103{
104 int result = STATE_UNKNOWN; 104 int result = STATE_UNKNOWN;
105 int i;
106 char *status = NULL; 105 char *status = NULL;
107 struct timeval tv; 106 struct timeval tv;
108 struct timeval timeout; 107 struct timeval timeout;
109 size_t len;
110 int match = -1; 108 int match = -1;
111 fd_set rfds; 109 fd_set rfds;
112 110
@@ -121,10 +119,10 @@ main (int argc, char **argv)
121 if(progname != NULL) progname++; 119 if(progname != NULL) progname++;
122 else progname = argv[0]; 120 else progname = argv[0];
123 121
124 len = strlen(progname); 122 size_t prog_name_len = strlen(progname);
125 if(len > 6 && !memcmp(progname, "check_", 6)) { 123 if(prog_name_len > 6 && !memcmp(progname, "check_", 6)) {
126 SERVICE = strdup(progname + 6); 124 SERVICE = strdup(progname + 6);
127 for(i = 0; i < len - 6; i++) 125 for(size_t i = 0; i < prog_name_len - 6; i++)
128 SERVICE[i] = toupper(SERVICE[i]); 126 SERVICE[i] = toupper(SERVICE[i]);
129 } 127 }
130 128
@@ -247,7 +245,7 @@ main (int argc, char **argv)
247#ifdef HAVE_SSL 245#ifdef HAVE_SSL
248 if (flags & FLAG_SSL){ 246 if (flags & FLAG_SSL){
249 result = np_net_ssl_init_with_hostname(sd, (sni_specified ? sni : NULL)); 247 result = np_net_ssl_init_with_hostname(sd, (sni_specified ? sni : NULL));
250 if (result == STATE_OK && check_cert == TRUE) { 248 if (result == STATE_OK && check_cert) {
251 result = np_net_ssl_check_cert(days_till_exp_warn, days_till_exp_crit); 249 result = np_net_ssl_check_cert(days_till_exp_warn, days_till_exp_crit);
252 } 250 }
253 } 251 }
@@ -275,19 +273,21 @@ main (int argc, char **argv)
275 printf("Quit string: %s\n", server_quit); 273 printf("Quit string: %s\n", server_quit);
276 } 274 }
277 printf("server_expect_count: %d\n", (int)server_expect_count); 275 printf("server_expect_count: %d\n", (int)server_expect_count);
278 for(i = 0; i < server_expect_count; i++) 276 for(size_t i = 0; i < server_expect_count; i++)
279 printf("\t%d: %s\n", i, server_expect[i]); 277 printf("\t%zd: %s\n", i, server_expect[i]);
280 } 278 }
281 279
282 /* if(len) later on, we know we have a non-NULL response */ 280 /* if(len) later on, we know we have a non-NULL response */
283 len = 0; 281 ssize_t len = 0;
282
284 if (server_expect_count) { 283 if (server_expect_count) {
284 ssize_t received = 0;
285 285
286 /* watch for the expect string */ 286 /* watch for the expect string */
287 while ((i = my_recv(buffer, sizeof(buffer))) > 0) { 287 while ((received = my_recv(buffer, sizeof(buffer))) > 0) {
288 status = realloc(status, len + i + 1); 288 status = realloc(status, len + received + 1);
289 memcpy(&status[len], buffer, i); 289 memcpy(&status[len], buffer, received);
290 len += i; 290 len += received;
291 status[len] = '\0'; 291 status[len] = '\0';
292 292
293 /* stop reading if user-forced */ 293 /* stop reading if user-forced */
@@ -307,6 +307,7 @@ main (int argc, char **argv)
307 if(select(sd + 1, &rfds, NULL, NULL, &timeout) <= 0) 307 if(select(sd + 1, &rfds, NULL, NULL, &timeout) <= 0)
308 break; 308 break;
309 } 309 }
310
310 if (match == NP_MATCH_RETRY) 311 if (match == NP_MATCH_RETRY)
311 match = NP_MATCH_FAILURE; 312 match = NP_MATCH_FAILURE;
312 313
@@ -378,18 +379,18 @@ main (int argc, char **argv)
378 if(match == NP_MATCH_FAILURE) 379 if(match == NP_MATCH_FAILURE)
379 printf ("|%s", 380 printf ("|%s",
380 fperfdata ("time", elapsed_time, "s", 381 fperfdata ("time", elapsed_time, "s",
381 (flags & FLAG_TIME_WARN ? TRUE : FALSE), 0, 382 (flags & FLAG_TIME_WARN ? true : false), 0,
382 (flags & FLAG_TIME_CRIT ? TRUE : FALSE), 0, 383 (flags & FLAG_TIME_CRIT ? true : false), 0,
383 TRUE, 0, 384 true, 0,
384 TRUE, socket_timeout) 385 true, socket_timeout)
385 ); 386 );
386 else 387 else
387 printf("|%s", 388 printf("|%s",
388 fperfdata ("time", elapsed_time, "s", 389 fperfdata ("time", elapsed_time, "s",
389 (flags & FLAG_TIME_WARN ? TRUE : FALSE), warning_time, 390 (flags & FLAG_TIME_WARN ? true : false), warning_time,
390 (flags & FLAG_TIME_CRIT ? TRUE : FALSE), critical_time, 391 (flags & FLAG_TIME_CRIT ? true : false), critical_time,
391 TRUE, 0, 392 true, 0,
392 TRUE, socket_timeout) 393 true, socket_timeout)
393 ); 394 );
394 395
395 putchar('\n'); 396 putchar('\n');
@@ -399,11 +400,9 @@ main (int argc, char **argv)
399 400
400 401
401/* process command-line arguments */ 402/* process command-line arguments */
402static int 403static int process_arguments (int argc, char **argv) {
403process_arguments (int argc, char **argv)
404{
405 int c; 404 int c;
406 int escape = 0; 405 bool escape = false;
407 char *temp; 406 char *temp;
408 407
409 enum { 408 enum {
@@ -492,7 +491,7 @@ process_arguments (int argc, char **argv)
492#endif 491#endif
493 break; 492 break;
494 case 'H': /* hostname */ 493 case 'H': /* hostname */
495 host_specified = TRUE; 494 host_specified = true;
496 server_address = optarg; 495 server_address = optarg;
497 break; 496 break;
498 case 'c': /* critical */ 497 case 'c': /* critical */
@@ -527,7 +526,7 @@ process_arguments (int argc, char **argv)
527 server_port = atoi (optarg); 526 server_port = atoi (optarg);
528 break; 527 break;
529 case 'E': 528 case 'E':
530 escape = 1; 529 escape = true;
531 break; 530 break;
532 case 's': 531 case 's':
533 if (escape) 532 if (escape)
@@ -601,7 +600,7 @@ process_arguments (int argc, char **argv)
601 usage2 (_("Invalid certificate expiration period"), optarg); 600 usage2 (_("Invalid certificate expiration period"), optarg);
602 days_till_exp_warn = atoi (optarg); 601 days_till_exp_warn = atoi (optarg);
603 } 602 }
604 check_cert = TRUE; 603 check_cert = true;
605 flags |= FLAG_SSL; 604 flags |= FLAG_SSL;
606 break; 605 break;
607# endif /* USE_OPENSSL */ 606# endif /* USE_OPENSSL */
@@ -617,7 +616,7 @@ process_arguments (int argc, char **argv)
617 case SNI_OPTION: 616 case SNI_OPTION:
618#ifdef HAVE_SSL 617#ifdef HAVE_SSL
619 flags |= FLAG_SSL; 618 flags |= FLAG_SSL;
620 sni_specified = TRUE; 619 sni_specified = true;
621 sni = optarg; 620 sni = optarg;
622#else 621#else
623 die (STATE_UNKNOWN, _("Invalid option - SSL is not available")); 622 die (STATE_UNKNOWN, _("Invalid option - SSL is not available"));
@@ -630,15 +629,15 @@ process_arguments (int argc, char **argv)
630 } 629 }
631 630
632 c = optind; 631 c = optind;
633 if(host_specified == FALSE && c < argc) 632 if(!host_specified && c < argc)
634 server_address = strdup (argv[c++]); 633 server_address = strdup (argv[c++]);
635 634
636 if (server_address == NULL) 635 if (server_address == NULL)
637 usage4 (_("You must provide a server address")); 636 usage4 (_("You must provide a server address"));
638 else if (server_address[0] != '/' && is_host (server_address) == FALSE) 637 else if (server_address[0] != '/' && !is_host(server_address))
639 die (STATE_CRITICAL, "%s %s - %s: %s\n", SERVICE, state_text(STATE_CRITICAL), _("Invalid hostname, address or socket"), server_address); 638 die (STATE_CRITICAL, "%s %s - %s: %s\n", SERVICE, state_text(STATE_CRITICAL), _("Invalid hostname, address or socket"), server_address);
640 639
641 return TRUE; 640 return OK;
642} 641}
643 642
644 643
diff --git a/plugins/check_time.c b/plugins/check_time.c
index baf8c591..f50ea427 100644
--- a/plugins/check_time.c
+++ b/plugins/check_time.c
@@ -45,16 +45,16 @@ enum {
45uint32_t raw_server_time; 45uint32_t raw_server_time;
46unsigned long server_time, diff_time; 46unsigned long server_time, diff_time;
47int warning_time = 0; 47int warning_time = 0;
48int check_warning_time = FALSE; 48bool check_warning_time = false;
49int critical_time = 0; 49int critical_time = 0;
50int check_critical_time = FALSE; 50bool check_critical_time = false;
51unsigned long warning_diff = 0; 51unsigned long warning_diff = 0;
52int check_warning_diff = FALSE; 52bool check_warning_diff = false;
53unsigned long critical_diff = 0; 53unsigned long critical_diff = 0;
54int check_critical_diff = FALSE; 54bool check_critical_diff = false;
55int server_port = TIME_PORT; 55int server_port = TIME_PORT;
56char *server_address = NULL; 56char *server_address = NULL;
57int use_udp = FALSE; 57bool use_udp = false;
58 58
59int process_arguments (int, char **); 59int process_arguments (int, char **);
60void print_help (void); 60void print_help (void);
@@ -92,9 +92,9 @@ main (int argc, char **argv)
92 } 92 }
93 93
94 if (result != STATE_OK) { 94 if (result != STATE_OK) {
95 if (check_critical_time == TRUE) 95 if (check_critical_time)
96 result = STATE_CRITICAL; 96 result = STATE_CRITICAL;
97 else if (check_warning_time == TRUE) 97 else if (check_warning_time)
98 result = STATE_WARNING; 98 result = STATE_WARNING;
99 else 99 else
100 result = STATE_UNKNOWN; 100 result = STATE_UNKNOWN;
@@ -105,9 +105,9 @@ main (int argc, char **argv)
105 105
106 if (use_udp) { 106 if (use_udp) {
107 if (send (sd, "", 0, 0) < 0) { 107 if (send (sd, "", 0, 0) < 0) {
108 if (check_critical_time == TRUE) 108 if (check_critical_time)
109 result = STATE_CRITICAL; 109 result = STATE_CRITICAL;
110 else if (check_warning_time == TRUE) 110 else if (check_warning_time)
111 result = STATE_WARNING; 111 result = STATE_WARNING;
112 else 112 else
113 result = STATE_UNKNOWN; 113 result = STATE_UNKNOWN;
@@ -129,9 +129,9 @@ main (int argc, char **argv)
129 129
130 /* return a WARNING status if we couldn't read any data */ 130 /* return a WARNING status if we couldn't read any data */
131 if (result <= 0) { 131 if (result <= 0) {
132 if (check_critical_time == TRUE) 132 if (check_critical_time)
133 result = STATE_CRITICAL; 133 result = STATE_CRITICAL;
134 else if (check_warning_time == TRUE) 134 else if (check_warning_time)
135 result = STATE_WARNING; 135 result = STATE_WARNING;
136 else 136 else
137 result = STATE_UNKNOWN; 137 result = STATE_UNKNOWN;
@@ -143,9 +143,9 @@ main (int argc, char **argv)
143 result = STATE_OK; 143 result = STATE_OK;
144 144
145 conntime = (end_time - start_time); 145 conntime = (end_time - start_time);
146 if (check_critical_time == TRUE && conntime > critical_time) 146 if (check_critical_time&& conntime > critical_time)
147 result = STATE_CRITICAL; 147 result = STATE_CRITICAL;
148 else if (check_warning_time == TRUE && conntime > warning_time) 148 else if (check_warning_time && conntime > warning_time)
149 result = STATE_WARNING; 149 result = STATE_WARNING;
150 150
151 if (result != STATE_OK) 151 if (result != STATE_OK)
@@ -154,7 +154,7 @@ main (int argc, char **argv)
154 perfdata ("time", (long)conntime, "s", 154 perfdata ("time", (long)conntime, "s",
155 check_warning_time, (long)warning_time, 155 check_warning_time, (long)warning_time,
156 check_critical_time, (long)critical_time, 156 check_critical_time, (long)critical_time,
157 TRUE, 0, FALSE, 0)); 157 true, 0, false, 0));
158 158
159 server_time = ntohl (raw_server_time) - UNIX_EPOCH; 159 server_time = ntohl (raw_server_time) - UNIX_EPOCH;
160 if (server_time > (unsigned long)end_time) 160 if (server_time > (unsigned long)end_time)
@@ -162,9 +162,9 @@ main (int argc, char **argv)
162 else 162 else
163 diff_time = (unsigned long)end_time - server_time; 163 diff_time = (unsigned long)end_time - server_time;
164 164
165 if (check_critical_diff == TRUE && diff_time > critical_diff) 165 if (check_critical_diff&& diff_time > critical_diff)
166 result = STATE_CRITICAL; 166 result = STATE_CRITICAL;
167 else if (check_warning_diff == TRUE && diff_time > warning_diff) 167 else if (check_warning_diff&& diff_time > warning_diff)
168 result = STATE_WARNING; 168 result = STATE_WARNING;
169 169
170 printf (_("TIME %s - %lu second time difference|%s %s\n"), 170 printf (_("TIME %s - %lu second time difference|%s %s\n"),
@@ -172,11 +172,11 @@ main (int argc, char **argv)
172 perfdata ("time", (long)conntime, "s", 172 perfdata ("time", (long)conntime, "s",
173 check_warning_time, (long)warning_time, 173 check_warning_time, (long)warning_time,
174 check_critical_time, (long)critical_time, 174 check_critical_time, (long)critical_time,
175 TRUE, 0, FALSE, 0), 175 true, 0, false, 0),
176 perfdata ("offset", diff_time, "s", 176 perfdata ("offset", diff_time, "s",
177 check_warning_diff, warning_diff, 177 check_warning_diff, warning_diff,
178 check_critical_diff, critical_diff, 178 check_critical_diff, critical_diff,
179 TRUE, 0, FALSE, 0)); 179 true, 0, false, 0));
180 return result; 180 return result;
181} 181}
182 182
@@ -219,7 +219,7 @@ process_arguments (int argc, char **argv)
219 strcpy (argv[c], "-C"); 219 strcpy (argv[c], "-C");
220 } 220 }
221 221
222 while (1) { 222 while (true) {
223 c = getopt_long (argc, argv, "hVH:w:c:W:C:p:t:u", longopts, 223 c = getopt_long (argc, argv, "hVH:w:c:W:C:p:t:u", longopts,
224 &option); 224 &option);
225 225
@@ -236,19 +236,19 @@ process_arguments (int argc, char **argv)
236 print_revision (progname, NP_VERSION); 236 print_revision (progname, NP_VERSION);
237 exit (STATE_UNKNOWN); 237 exit (STATE_UNKNOWN);
238 case 'H': /* hostname */ 238 case 'H': /* hostname */
239 if (is_host (optarg) == FALSE) 239 if (!is_host (optarg))
240 usage2 (_("Invalid hostname/address"), optarg); 240 usage2 (_("Invalid hostname/address"), optarg);
241 server_address = optarg; 241 server_address = optarg;
242 break; 242 break;
243 case 'w': /* warning-variance */ 243 case 'w': /* warning-variance */
244 if (is_intnonneg (optarg)) { 244 if (is_intnonneg (optarg)) {
245 warning_diff = strtoul (optarg, NULL, 10); 245 warning_diff = strtoul (optarg, NULL, 10);
246 check_warning_diff = TRUE; 246 check_warning_diff = true;
247 } 247 }
248 else if (strspn (optarg, "0123456789:,") > 0) { 248 else if (strspn (optarg, "0123456789:,") > 0) {
249 if (sscanf (optarg, "%lu%*[:,]%d", &warning_diff, &warning_time) == 2) { 249 if (sscanf (optarg, "%lu%*[:,]%d", &warning_diff, &warning_time) == 2) {
250 check_warning_diff = TRUE; 250 check_warning_diff = true;
251 check_warning_time = TRUE; 251 check_warning_time = true;
252 } 252 }
253 else { 253 else {
254 usage4 (_("Warning thresholds must be a positive integer")); 254 usage4 (_("Warning thresholds must be a positive integer"));
@@ -261,13 +261,13 @@ process_arguments (int argc, char **argv)
261 case 'c': /* critical-variance */ 261 case 'c': /* critical-variance */
262 if (is_intnonneg (optarg)) { 262 if (is_intnonneg (optarg)) {
263 critical_diff = strtoul (optarg, NULL, 10); 263 critical_diff = strtoul (optarg, NULL, 10);
264 check_critical_diff = TRUE; 264 check_critical_diff = true;
265 } 265 }
266 else if (strspn (optarg, "0123456789:,") > 0) { 266 else if (strspn (optarg, "0123456789:,") > 0) {
267 if (sscanf (optarg, "%lu%*[:,]%d", &critical_diff, &critical_time) == 267 if (sscanf (optarg, "%lu%*[:,]%d", &critical_diff, &critical_time) ==
268 2) { 268 2) {
269 check_critical_diff = TRUE; 269 check_critical_diff = true;
270 check_critical_time = TRUE; 270 check_critical_time = true;
271 } 271 }
272 else { 272 else {
273 usage4 (_("Critical thresholds must be a positive integer")); 273 usage4 (_("Critical thresholds must be a positive integer"));
@@ -282,14 +282,14 @@ process_arguments (int argc, char **argv)
282 usage4 (_("Warning threshold must be a positive integer")); 282 usage4 (_("Warning threshold must be a positive integer"));
283 else 283 else
284 warning_time = atoi (optarg); 284 warning_time = atoi (optarg);
285 check_warning_time = TRUE; 285 check_warning_time = true;
286 break; 286 break;
287 case 'C': /* critical-connect */ 287 case 'C': /* critical-connect */
288 if (!is_intnonneg (optarg)) 288 if (!is_intnonneg (optarg))
289 usage4 (_("Critical threshold must be a positive integer")); 289 usage4 (_("Critical threshold must be a positive integer"));
290 else 290 else
291 critical_time = atoi (optarg); 291 critical_time = atoi (optarg);
292 check_critical_time = TRUE; 292 check_critical_time = true;
293 break; 293 break;
294 case 'p': /* port */ 294 case 'p': /* port */
295 if (!is_intnonneg (optarg)) 295 if (!is_intnonneg (optarg))
@@ -304,14 +304,14 @@ process_arguments (int argc, char **argv)
304 socket_timeout = atoi (optarg); 304 socket_timeout = atoi (optarg);
305 break; 305 break;
306 case 'u': /* udp */ 306 case 'u': /* udp */
307 use_udp = TRUE; 307 use_udp = true;
308 } 308 }
309 } 309 }
310 310
311 c = optind; 311 c = optind;
312 if (server_address == NULL) { 312 if (server_address == NULL) {
313 if (argc > c) { 313 if (argc > c) {
314 if (is_host (argv[c]) == FALSE) 314 if (!is_host (argv[c]))
315 usage2 (_("Invalid hostname/address"), optarg); 315 usage2 (_("Invalid hostname/address"), optarg);
316 server_address = argv[c]; 316 server_address = argv[c];
317 } 317 }
diff --git a/plugins/check_ups.c b/plugins/check_ups.c
index 68737c4b..380ff3bc 100644
--- a/plugins/check_ups.c
+++ b/plugins/check_ups.c
@@ -1,665 +1,746 @@
1/***************************************************************************** 1/*****************************************************************************
2* 2 *
3* Monitoring check_ups plugin 3 * Monitoring check_ups plugin
4* 4 *
5* License: GPL 5 * License: GPL
6* Copyright (c) 2000 Tom Shields 6 * Copyright (c) 2000 Tom Shields
7* 2004 Alain Richard <alain.richard@equation.fr> 7 * 2004 Alain Richard <alain.richard@equation.fr>
8* 2004 Arnaud Quette <arnaud.quette@mgeups.com> 8 * 2004 Arnaud Quette <arnaud.quette@mgeups.com>
9* Copyright (c) 2002-2007 Monitoring Plugins Development Team 9 * Copyright (c) 2002-2023 Monitoring Plugins Development Team
10* 10 *
11* Description: 11 * Description:
12* 12 *
13* This file contains Network UPS Tools plugin for Monitoring 13 * This file contains Network UPS Tools plugin for Monitoring
14* 14 *
15* This plugin tests the UPS service on the specified host. Network UPS Tools 15 * This plugin tests the UPS service on the specified host. Network UPS Tools
16* from www.networkupstools.org must be running for this plugin to work. 16 * from www.networkupstools.org must be running for this plugin to work.
17* 17 *
18* 18 *
19* This program is free software: you can redistribute it and/or modify 19 * This program is free software: you can redistribute it and/or modify
20* it under the terms of the GNU General Public License as published by 20 * it under the terms of the GNU General Public License as published by
21* the Free Software Foundation, either version 3 of the License, or 21 * the Free Software Foundation, either version 3 of the License, or
22* (at your option) any later version. 22 * (at your option) any later version.
23* 23 *
24* This program is distributed in the hope that it will be useful, 24 * This program is distributed in the hope that it will be useful,
25* but WITHOUT ANY WARRANTY; without even the implied warranty of 25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27* GNU General Public License for more details. 27 * GNU General Public License for more details.
28* 28 *
29* You should have received a copy of the GNU General Public License 29 * You should have received a copy of the GNU General Public License
30* along with this program. If not, see <http://www.gnu.org/licenses/>. 30 * along with this program. If not, see <http://www.gnu.org/licenses/>.
31* 31 *
32* 32 *
33*****************************************************************************/ 33 *****************************************************************************/
34 34
35const char *progname = "check_ups"; 35const char *progname = "check_ups";
36const char *copyright = "2000-2007"; 36const char *copyright = "2000-2023";
37const char *email = "devel@monitoring-plugins.org"; 37const char *email = "devel@monitoring-plugins.org";
38 38
39#include "common.h" 39#include "common.h"
40#include "netutils.h" 40#include "netutils.h"
41#include "utils.h" 41#include "utils.h"
42 42
43enum { 43enum { PORT = 3493 };
44 PORT = 3493 44
45}; 45#define UPS_NONE 0 /* no supported options */
46 46#define UPS_UTILITY 1 /* supports utility line */
47#define CHECK_NONE 0 47#define UPS_BATTPCT 2 /* supports percent battery remaining */
48 48#define UPS_STATUS 4 /* supports UPS status */
49#define UPS_NONE 0 /* no supported options */ 49#define UPS_TEMP 8 /* supports UPS temperature */
50#define UPS_UTILITY 1 /* supports utility line voltage */ 50#define UPS_LOADPCT 16 /* supports load percent */
51#define UPS_BATTPCT 2 /* supports percent battery remaining */ 51#define UPS_REALPOWER 32 /* supports real power */
52#define UPS_STATUS 4 /* supports UPS status */ 52
53#define UPS_TEMP 8 /* supports UPS temperature */ 53#define UPSSTATUS_NONE 0
54#define UPS_LOADPCT 16 /* supports load percent */ 54#define UPSSTATUS_OFF 1
55 55#define UPSSTATUS_OL 2
56#define UPSSTATUS_NONE 0 56#define UPSSTATUS_OB 4
57#define UPSSTATUS_OFF 1 57#define UPSSTATUS_LB 8
58#define UPSSTATUS_OL 2 58#define UPSSTATUS_CAL 16
59#define UPSSTATUS_OB 4 59#define UPSSTATUS_RB 32 /*Replace Battery */
60#define UPSSTATUS_LB 8 60#define UPSSTATUS_BYPASS 64
61#define UPSSTATUS_CAL 16 61#define UPSSTATUS_OVER 128
62#define UPSSTATUS_RB 32 /*Replace Battery */ 62#define UPSSTATUS_TRIM 256
63#define UPSSTATUS_BYPASS 64 63#define UPSSTATUS_BOOST 512
64#define UPSSTATUS_OVER 128
65#define UPSSTATUS_TRIM 256
66#define UPSSTATUS_BOOST 512
67#define UPSSTATUS_CHRG 1024 64#define UPSSTATUS_CHRG 1024
68#define UPSSTATUS_DISCHRG 2048 65#define UPSSTATUS_DISCHRG 2048
69#define UPSSTATUS_UNKNOWN 4096 66#define UPSSTATUS_UNKNOWN 4096
70 67#define UPSSTATUS_ALARM 8192
71enum { NOSUCHVAR = ERROR-1 }; 68
72 69enum { NOSUCHVAR = ERROR - 1 };
73int server_port = PORT; 70
74char *server_address; 71typedef struct ups_config {
75char *ups_name = NULL; 72 unsigned int server_port;
76double warning_value = 0.0; 73 char *server_address;
77double critical_value = 0.0; 74 char *ups_name;
78int check_warn = FALSE; 75 double warning_value;
79int check_crit = FALSE; 76 double critical_value;
80int check_variable = UPS_NONE; 77 bool check_warn;
81int supported_options = UPS_NONE; 78 bool check_crit;
82int status = UPSSTATUS_NONE; 79 int check_variable;
83 80 int status;
84double ups_utility_voltage = 0.0; 81 bool temp_output_c;
85double ups_battery_percent = 0.0; 82} ups_config;
86double ups_load_percent = 0.0; 83
87double ups_temperature = 0.0; 84ups_config ups_config_init(void) {
88char *ups_status; 85 ups_config tmp = {0};
89int temp_output_c = 0; 86 tmp.server_port = PORT;
90 87 tmp.server_address = NULL;
91int determine_status (void); 88 tmp.ups_name = NULL;
92int get_ups_variable (const char *, char *); 89 tmp.check_variable = UPS_NONE;
93 90 tmp.status = UPSSTATUS_NONE;
94int process_arguments (int, char **); 91
95int validate_arguments (void); 92 return tmp;
96void print_help (void); 93}
97void print_usage (void); 94
98 95// Forward declarations
99int 96int determine_status(ups_config *, int *supported_options);
100main (int argc, char **argv) 97int get_ups_variable(const char *, char *, const ups_config config);
101{ 98
102 int result = STATE_UNKNOWN; 99int process_arguments(int, char **, ups_config *);
103 char *message; 100int validate_arguments(ups_config);
101void print_help(void);
102void print_usage(void);
103
104int main(int argc, char **argv) {
105 setlocale(LC_ALL, "");
106 bindtextdomain(PACKAGE, LOCALEDIR);
107 textdomain(PACKAGE);
108
109 char *ups_status;
110 ups_status = strdup("N/A");
111
104 char *data; 112 char *data;
105 char *tunits; 113 data = strdup("");
106 char temp_buffer[MAX_INPUT_BUFFER];
107 double ups_utility_deviation = 0.0;
108 int res;
109 114
110 setlocale (LC_ALL, ""); 115 char *message;
111 bindtextdomain (PACKAGE, LOCALEDIR); 116 message = strdup("");
112 textdomain (PACKAGE);
113 117
114 ups_status = strdup ("N/A"); 118 // Exit result
115 data = strdup (""); 119 int result = STATE_UNKNOWN;
116 message = strdup ("");
117 120
118 /* Parse extra opts if any */ 121 /* Parse extra opts if any */
119 argv=np_extra_opts (&argc, argv, progname); 122 argv = np_extra_opts(&argc, argv, progname);
120 123
121 if (process_arguments (argc, argv) == ERROR) 124 // Config from commandline
122 usage4 (_("Could not parse arguments")); 125 ups_config config = ups_config_init();
126
127 if (process_arguments(argc, argv, &config) == ERROR) {
128 usage4(_("Could not parse arguments"));
129 }
123 130
124 /* initialize alarm signal handling */ 131 /* initialize alarm signal handling */
125 signal (SIGALRM, socket_timeout_alarm_handler); 132 signal(SIGALRM, socket_timeout_alarm_handler);
126 133
127 /* set socket timeout */ 134 /* set socket timeout */
128 alarm (socket_timeout); 135 alarm(socket_timeout);
136
137 int supported_options = UPS_NONE;
129 138
130 /* get the ups status if possible */ 139 /* get the ups status if possible */
131 if (determine_status () != OK) 140 if (determine_status(&config, &supported_options) != OK) {
132 return STATE_CRITICAL; 141 return STATE_CRITICAL;
142 }
143
144
133 if (supported_options & UPS_STATUS) { 145 if (supported_options & UPS_STATUS) {
134 146
135 ups_status = strdup (""); 147 ups_status = strdup("");
148
136 result = STATE_OK; 149 result = STATE_OK;
137 150
138 if (status & UPSSTATUS_OFF) { 151 if (config.status & UPSSTATUS_OFF) {
139 xasprintf (&ups_status, "Off"); 152 xasprintf(&ups_status, "Off");
140 result = STATE_CRITICAL; 153 result = STATE_CRITICAL;
141 } 154 } else if ((config.status & (UPSSTATUS_OB | UPSSTATUS_LB)) ==
142 else if ((status & (UPSSTATUS_OB | UPSSTATUS_LB)) == 155 (UPSSTATUS_OB | UPSSTATUS_LB)) {
143 (UPSSTATUS_OB | UPSSTATUS_LB)) { 156 xasprintf(&ups_status, _("On Battery, Low Battery"));
144 xasprintf (&ups_status, _("On Battery, Low Battery"));
145 result = STATE_CRITICAL; 157 result = STATE_CRITICAL;
146 } 158 } else {
147 else { 159 if (config.status & UPSSTATUS_OL) {
148 if (status & UPSSTATUS_OL) { 160 xasprintf(&ups_status, "%s%s", ups_status, _("Online"));
149 xasprintf (&ups_status, "%s%s", ups_status, _("Online"));
150 } 161 }
151 if (status & UPSSTATUS_OB) { 162 if (config.status & UPSSTATUS_OB) {
152 xasprintf (&ups_status, "%s%s", ups_status, _("On Battery")); 163 xasprintf(&ups_status, "%s%s", ups_status, _("On Battery"));
153 result = STATE_WARNING; 164 result = max_state(result, STATE_WARNING);
154 } 165 }
155 if (status & UPSSTATUS_LB) { 166 if (config.status & UPSSTATUS_LB) {
156 xasprintf (&ups_status, "%s%s", ups_status, _(", Low Battery")); 167 xasprintf(&ups_status, "%s%s", ups_status, _(", Low Battery"));
157 result = STATE_WARNING; 168 result = max_state(result, STATE_WARNING);
158 } 169 }
159 if (status & UPSSTATUS_CAL) { 170 if (config.status & UPSSTATUS_CAL) {
160 xasprintf (&ups_status, "%s%s", ups_status, _(", Calibrating")); 171 xasprintf(&ups_status, "%s%s", ups_status, _(", Calibrating"));
161 } 172 }
162 if (status & UPSSTATUS_RB) { 173 if (config.status & UPSSTATUS_RB) {
163 xasprintf (&ups_status, "%s%s", ups_status, _(", Replace Battery")); 174 xasprintf(&ups_status, "%s%s", ups_status,
164 result = STATE_WARNING; 175 _(", Replace Battery"));
176 result = max_state(result, STATE_WARNING);
165 } 177 }
166 if (status & UPSSTATUS_BYPASS) { 178 if (config.status & UPSSTATUS_BYPASS) {
167 xasprintf (&ups_status, "%s%s", ups_status, _(", On Bypass")); 179 xasprintf(&ups_status, "%s%s", ups_status, _(", On Bypass"));
180 // Bypassing the battery is likely a bad thing
181 result = STATE_CRITICAL;
182 }
183 if (config.status & UPSSTATUS_OVER) {
184 xasprintf(&ups_status, "%s%s", ups_status, _(", Overload"));
185 result = max_state(result, STATE_WARNING);
168 } 186 }
169 if (status & UPSSTATUS_OVER) { 187 if (config.status & UPSSTATUS_TRIM) {
170 xasprintf (&ups_status, "%s%s", ups_status, _(", Overload")); 188 xasprintf(&ups_status, "%s%s", ups_status, _(", Trimming"));
171 } 189 }
172 if (status & UPSSTATUS_TRIM) { 190 if (config.status & UPSSTATUS_BOOST) {
173 xasprintf (&ups_status, "%s%s", ups_status, _(", Trimming")); 191 xasprintf(&ups_status, "%s%s", ups_status, _(", Boosting"));
174 } 192 }
175 if (status & UPSSTATUS_BOOST) { 193 if (config.status & UPSSTATUS_CHRG) {
176 xasprintf (&ups_status, "%s%s", ups_status, _(", Boosting")); 194 xasprintf(&ups_status, "%s%s", ups_status, _(", Charging"));
177 } 195 }
178 if (status & UPSSTATUS_CHRG) { 196 if (config.status & UPSSTATUS_DISCHRG) {
179 xasprintf (&ups_status, "%s%s", ups_status, _(", Charging")); 197 xasprintf(&ups_status, "%s%s", ups_status, _(", Discharging"));
198 result = max_state(result, STATE_WARNING);
180 } 199 }
181 if (status & UPSSTATUS_DISCHRG) { 200 if (config.status & UPSSTATUS_ALARM) {
182 xasprintf (&ups_status, "%s%s", ups_status, _(", Discharging")); 201 xasprintf(&ups_status, "%s%s", ups_status, _(", ALARM"));
202 result = STATE_CRITICAL;
183 } 203 }
184 if (status & UPSSTATUS_UNKNOWN) { 204 if (config.status & UPSSTATUS_UNKNOWN) {
185 xasprintf (&ups_status, "%s%s", ups_status, _(", Unknown")); 205 xasprintf(&ups_status, "%s%s", ups_status, _(", Unknown"));
186 } 206 }
187 } 207 }
188 xasprintf (&message, "%sStatus=%s ", message, ups_status); 208 xasprintf(&message, "%sStatus=%s ", message, ups_status);
189 } 209 }
190 210
211 int res;
212 char temp_buffer[MAX_INPUT_BUFFER];
213
191 /* get the ups utility voltage if possible */ 214 /* get the ups utility voltage if possible */
192 res=get_ups_variable ("input.voltage", temp_buffer); 215 res = get_ups_variable("input.voltage", temp_buffer, config);
193 if (res == NOSUCHVAR) supported_options &= ~UPS_UTILITY; 216 if (res == NOSUCHVAR) {
194 else if (res != OK) 217 supported_options &= ~UPS_UTILITY;
218 } else if (res != OK) {
195 return STATE_CRITICAL; 219 return STATE_CRITICAL;
196 else { 220 } else {
197 supported_options |= UPS_UTILITY; 221 supported_options |= UPS_UTILITY;
198 222
199 ups_utility_voltage = atof (temp_buffer); 223 double ups_utility_voltage = 0.0;
200 xasprintf (&message, "%sUtility=%3.1fV ", message, ups_utility_voltage); 224 ups_utility_voltage = atof(temp_buffer);
225 xasprintf(&message, "%sUtility=%3.1fV ", message, ups_utility_voltage);
226
227 double ups_utility_deviation = 0.0;
201 228
202 if (ups_utility_voltage > 120.0) 229 if (ups_utility_voltage > 120.0) {
203 ups_utility_deviation = 120.0 - ups_utility_voltage; 230 ups_utility_deviation = 120.0 - ups_utility_voltage;
204 else 231 } else {
205 ups_utility_deviation = ups_utility_voltage - 120.0; 232 ups_utility_deviation = ups_utility_voltage - 120.0;
233 }
206 234
207 if (check_variable == UPS_UTILITY) { 235 if (config.check_variable == UPS_UTILITY) {
208 if (check_crit==TRUE && ups_utility_deviation>=critical_value) { 236 if (config.check_crit &&
237 ups_utility_deviation >= config.critical_value) {
209 result = STATE_CRITICAL; 238 result = STATE_CRITICAL;
239 } else if (config.check_warn &&
240 ups_utility_deviation >= config.warning_value) {
241 result = max_state(result, STATE_WARNING);
210 } 242 }
211 else if (check_warn==TRUE && ups_utility_deviation>=warning_value) { 243 xasprintf(&data, "%s",
212 result = max_state (result, STATE_WARNING); 244 perfdata("voltage", (long)(1000 * ups_utility_voltage),
213 } 245 "mV", config.check_warn,
214 xasprintf (&data, "%s", 246 (long)(1000 * config.warning_value),
215 perfdata ("voltage", (long)(1000*ups_utility_voltage), "mV", 247 config.check_crit,
216 check_warn, (long)(1000*warning_value), 248 (long)(1000 * config.critical_value), true, 0,
217 check_crit, (long)(1000*critical_value), 249 false, 0));
218 TRUE, 0, FALSE, 0));
219 } else { 250 } else {
220 xasprintf (&data, "%s", 251 xasprintf(&data, "%s",
221 perfdata ("voltage", (long)(1000*ups_utility_voltage), "mV", 252 perfdata("voltage", (long)(1000 * ups_utility_voltage),
222 FALSE, 0, FALSE, 0, TRUE, 0, FALSE, 0)); 253 "mV", false, 0, false, 0, true, 0, false, 0));
223 } 254 }
224 } 255 }
225 256
226 /* get the ups battery percent if possible */ 257 /* get the ups battery percent if possible */
227 res=get_ups_variable ("battery.charge", temp_buffer); 258 res = get_ups_variable("battery.charge", temp_buffer, config);
228 if (res == NOSUCHVAR) supported_options &= ~UPS_BATTPCT; 259 if (res == NOSUCHVAR) {
229 else if ( res != OK) 260 supported_options &= ~UPS_BATTPCT;
261 } else if (res != OK) {
230 return STATE_CRITICAL; 262 return STATE_CRITICAL;
231 else { 263 } else {
232 supported_options |= UPS_BATTPCT; 264 supported_options |= UPS_BATTPCT;
233 ups_battery_percent = atof (temp_buffer);
234 xasprintf (&message, "%sBatt=%3.1f%% ", message, ups_battery_percent);
235 265
236 if (check_variable == UPS_BATTPCT) { 266 double ups_battery_percent = 0.0;
237 if (check_crit==TRUE && ups_battery_percent <= critical_value) { 267 ups_battery_percent = atof(temp_buffer);
268 xasprintf(&message, "%sBatt=%3.1f%% ", message, ups_battery_percent);
269
270 if (config.check_variable == UPS_BATTPCT) {
271 if (config.check_crit &&
272 ups_battery_percent <= config.critical_value) {
238 result = STATE_CRITICAL; 273 result = STATE_CRITICAL;
274 } else if (config.check_warn &&
275 ups_battery_percent <= config.warning_value) {
276 result = max_state(result, STATE_WARNING);
239 } 277 }
240 else if (check_warn==TRUE && ups_battery_percent<=warning_value) { 278 xasprintf(&data, "%s %s", data,
241 result = max_state (result, STATE_WARNING); 279 perfdata("battery", (long)ups_battery_percent, "%",
242 } 280 config.check_warn, (long)(config.warning_value),
243 xasprintf (&data, "%s %s", data, 281 config.check_crit, (long)(config.critical_value),
244 perfdata ("battery", (long)ups_battery_percent, "%", 282 true, 0, true, 100));
245 check_warn, (long)(warning_value),
246 check_crit, (long)(critical_value),
247 TRUE, 0, TRUE, 100));
248 } else { 283 } else {
249 xasprintf (&data, "%s %s", data, 284 xasprintf(&data, "%s %s", data,
250 perfdata ("battery", (long)ups_battery_percent, "%", 285 perfdata("battery", (long)ups_battery_percent, "%", false,
251 FALSE, 0, FALSE, 0, TRUE, 0, TRUE, 100)); 286 0, false, 0, true, 0, true, 100));
252 } 287 }
253 } 288 }
254 289
255 /* get the ups load percent if possible */ 290 /* get the ups load percent if possible */
256 res=get_ups_variable ("ups.load", temp_buffer); 291 res = get_ups_variable("ups.load", temp_buffer, config);
257 if ( res == NOSUCHVAR ) supported_options &= ~UPS_LOADPCT; 292 if (res == NOSUCHVAR) {
258 else if ( res != OK) 293 supported_options &= ~UPS_LOADPCT;
294 } else if (res != OK) {
259 return STATE_CRITICAL; 295 return STATE_CRITICAL;
260 else { 296 } else {
261 supported_options |= UPS_LOADPCT; 297 supported_options |= UPS_LOADPCT;
262 ups_load_percent = atof (temp_buffer);
263 xasprintf (&message, "%sLoad=%3.1f%% ", message, ups_load_percent);
264 298
265 if (check_variable == UPS_LOADPCT) { 299 double ups_load_percent = 0.0;
266 if (check_crit==TRUE && ups_load_percent>=critical_value) { 300 ups_load_percent = atof(temp_buffer);
301 xasprintf(&message, "%sLoad=%3.1f%% ", message, ups_load_percent);
302
303 if (config.check_variable == UPS_LOADPCT) {
304 if (config.check_crit &&
305 ups_load_percent >= config.critical_value) {
267 result = STATE_CRITICAL; 306 result = STATE_CRITICAL;
307 } else if (config.check_warn &&
308 ups_load_percent >= config.warning_value) {
309 result = max_state(result, STATE_WARNING);
268 } 310 }
269 else if (check_warn==TRUE && ups_load_percent>=warning_value) { 311 xasprintf(&data, "%s %s", data,
270 result = max_state (result, STATE_WARNING); 312 perfdata("load", (long)ups_load_percent, "%",
271 } 313 config.check_warn, (long)(config.warning_value),
272 xasprintf (&data, "%s %s", data, 314 config.check_crit, (long)(config.critical_value),
273 perfdata ("load", (long)ups_load_percent, "%", 315 true, 0, true, 100));
274 check_warn, (long)(warning_value),
275 check_crit, (long)(critical_value),
276 TRUE, 0, TRUE, 100));
277 } else { 316 } else {
278 xasprintf (&data, "%s %s", data, 317 xasprintf(&data, "%s %s", data,
279 perfdata ("load", (long)ups_load_percent, "%", 318 perfdata("load", (long)ups_load_percent, "%", false, 0,
280 FALSE, 0, FALSE, 0, TRUE, 0, TRUE, 100)); 319 false, 0, true, 0, true, 100));
281 } 320 }
282 } 321 }
283 322
284 /* get the ups temperature if possible */ 323 /* get the ups temperature if possible */
285 res=get_ups_variable ("ups.temperature", temp_buffer); 324 res = get_ups_variable("ups.temperature", temp_buffer, config);
286 if ( res == NOSUCHVAR ) supported_options &= ~UPS_TEMP; 325 if (res == NOSUCHVAR) {
287 else if ( res != OK) 326 supported_options &= ~UPS_TEMP;
327 } else if (res != OK) {
288 return STATE_CRITICAL; 328 return STATE_CRITICAL;
289 else { 329 } else {
290 supported_options |= UPS_TEMP; 330 supported_options |= UPS_TEMP;
291 if (temp_output_c) { 331
292 tunits="degC"; 332 double ups_temperature = 0.0;
293 ups_temperature = atof (temp_buffer); 333 char *tunits;
294 xasprintf (&message, "%sTemp=%3.1fC", message, ups_temperature); 334
295 } 335 if (config.temp_output_c) {
296 else { 336 tunits = "degC";
297 tunits="degF"; 337 ups_temperature = atof(temp_buffer);
298 ups_temperature = (atof (temp_buffer) * 1.8) + 32; 338 xasprintf(&message, "%sTemp=%3.1fC", message, ups_temperature);
299 xasprintf (&message, "%sTemp=%3.1fF", message, ups_temperature); 339 } else {
340 tunits = "degF";
341 ups_temperature = (atof(temp_buffer) * 1.8) + 32;
342 xasprintf(&message, "%sTemp=%3.1fF", message, ups_temperature);
300 } 343 }
301 344
302 if (check_variable == UPS_TEMP) { 345 if (config.check_variable == UPS_TEMP) {
303 if (check_crit==TRUE && ups_temperature>=critical_value) { 346 if (config.check_crit && ups_temperature >= config.critical_value) {
304 result = STATE_CRITICAL; 347 result = STATE_CRITICAL;
348 } else if (config.check_warn &&
349 ups_temperature >= config.warning_value) {
350 result = max_state(result, STATE_WARNING);
305 } 351 }
306 else if (check_warn == TRUE && ups_temperature>=warning_value) { 352 xasprintf(&data, "%s %s", data,
307 result = max_state (result, STATE_WARNING); 353 perfdata("temp", (long)ups_temperature, tunits,
354 config.check_warn, (long)(config.warning_value),
355 config.check_crit, (long)(config.critical_value),
356 true, 0, false, 0));
357 } else {
358 xasprintf(&data, "%s %s", data,
359 perfdata("temp", (long)ups_temperature, tunits, false, 0,
360 false, 0, true, 0, false, 0));
361 }
362 }
363
364 /* get the ups real power if possible */
365 res = get_ups_variable("ups.realpower", temp_buffer, config);
366 if (res == NOSUCHVAR) {
367 supported_options &= ~UPS_REALPOWER;
368 } else if (res != OK) {
369 return STATE_CRITICAL;
370 } else {
371 supported_options |= UPS_REALPOWER;
372 double ups_realpower = 0.0;
373 ups_realpower = atof(temp_buffer);
374 xasprintf(&message, "%sReal power=%3.1fW ", message, ups_realpower);
375
376 if (config.check_variable == UPS_REALPOWER) {
377 if (config.check_crit && ups_realpower >= config.critical_value) {
378 result = STATE_CRITICAL;
379 } else if (config.check_warn &&
380 ups_realpower >= config.warning_value) {
381 result = max_state(result, STATE_WARNING);
308 } 382 }
309 xasprintf (&data, "%s %s", data, 383 xasprintf(&data, "%s %s", data,
310 perfdata ("temp", (long)ups_temperature, tunits, 384 perfdata("realpower", (long)ups_realpower, "W",
311 check_warn, (long)(warning_value), 385 config.check_warn, (long)(config.warning_value),
312 check_crit, (long)(critical_value), 386 config.check_crit, (long)(config.critical_value),
313 TRUE, 0, FALSE, 0)); 387 true, 0, false, 0));
314 } else { 388 } else {
315 xasprintf (&data, "%s %s", data, 389 xasprintf(&data, "%s %s", data,
316 perfdata ("temp", (long)ups_temperature, tunits, 390 perfdata("realpower", (long)ups_realpower, "W", false, 0,
317 FALSE, 0, FALSE, 0, TRUE, 0, FALSE, 0)); 391 false, 0, true, 0, false, 0));
318 } 392 }
319 } 393 }
320 394
321 /* if the UPS does not support any options we are looking for, report an error */ 395 /* if the UPS does not support any options we are looking for, report an
396 * error */
322 if (supported_options == UPS_NONE) { 397 if (supported_options == UPS_NONE) {
323 result = STATE_CRITICAL; 398 result = STATE_CRITICAL;
324 xasprintf (&message, _("UPS does not support any available options\n")); 399 xasprintf(&message, _("UPS does not support any available options\n"));
325 } 400 }
326 401
327 /* reset timeout */ 402 /* reset timeout */
328 alarm (0); 403 alarm(0);
329 404
330 printf ("UPS %s - %s|%s\n", state_text(result), message, data); 405 printf("UPS %s - %s|%s\n", state_text(result), message, data);
331 return result; 406 return result;
332} 407}
333 408
334
335
336/* determines what options are supported by the UPS */ 409/* determines what options are supported by the UPS */
337int 410int determine_status(ups_config *config, int *supported_options) {
338determine_status (void)
339{
340 char recv_buffer[MAX_INPUT_BUFFER]; 411 char recv_buffer[MAX_INPUT_BUFFER];
341 char temp_buffer[MAX_INPUT_BUFFER];
342 char *ptr;
343 int res;
344 412
345 res=get_ups_variable ("ups.status", recv_buffer); 413 int res = get_ups_variable("ups.status", recv_buffer, *config);
346 if (res == NOSUCHVAR) return OK; 414 if (res == NOSUCHVAR) {
415 return OK;
416 }
417
347 if (res != STATE_OK) { 418 if (res != STATE_OK) {
348 printf ("%s\n", _("Invalid response received from host")); 419 printf("%s\n", _("Invalid response received from host"));
349 return ERROR; 420 return ERROR;
350 } 421 }
351 422
352 supported_options |= UPS_STATUS; 423 *supported_options |= UPS_STATUS;
353 424
354 strcpy (temp_buffer, recv_buffer); 425 char temp_buffer[MAX_INPUT_BUFFER];
355 for (ptr = (char *) strtok (temp_buffer, " "); ptr != NULL; 426
356 ptr = (char *) strtok (NULL, " ")) { 427 strcpy(temp_buffer, recv_buffer);
357 if (!strcmp (ptr, "OFF")) 428 for (char *ptr = (char *)strtok(temp_buffer, " "); ptr != NULL;
358 status |= UPSSTATUS_OFF; 429 ptr = (char *)strtok(NULL, " ")) {
359 else if (!strcmp (ptr, "OL")) 430 if (!strcmp(ptr, "OFF")) {
360 status |= UPSSTATUS_OL; 431 config->status |= UPSSTATUS_OFF;
361 else if (!strcmp (ptr, "OB")) 432 } else if (!strcmp(ptr, "OL")) {
362 status |= UPSSTATUS_OB; 433 config->status |= UPSSTATUS_OL;
363 else if (!strcmp (ptr, "LB")) 434 } else if (!strcmp(ptr, "OB")) {
364 status |= UPSSTATUS_LB; 435 config->status |= UPSSTATUS_OB;
365 else if (!strcmp (ptr, "CAL")) 436 } else if (!strcmp(ptr, "LB")) {
366 status |= UPSSTATUS_CAL; 437 config->status |= UPSSTATUS_LB;
367 else if (!strcmp (ptr, "RB")) 438 } else if (!strcmp(ptr, "CAL")) {
368 status |= UPSSTATUS_RB; 439 config->status |= UPSSTATUS_CAL;
369 else if (!strcmp (ptr, "BYPASS")) 440 } else if (!strcmp(ptr, "RB")) {
370 status |= UPSSTATUS_BYPASS; 441 config->status |= UPSSTATUS_RB;
371 else if (!strcmp (ptr, "OVER")) 442 } else if (!strcmp(ptr, "BYPASS")) {
372 status |= UPSSTATUS_OVER; 443 config->status |= UPSSTATUS_BYPASS;
373 else if (!strcmp (ptr, "TRIM")) 444 } else if (!strcmp(ptr, "OVER")) {
374 status |= UPSSTATUS_TRIM; 445 config->status |= UPSSTATUS_OVER;
375 else if (!strcmp (ptr, "BOOST")) 446 } else if (!strcmp(ptr, "TRIM")) {
376 status |= UPSSTATUS_BOOST; 447 config->status |= UPSSTATUS_TRIM;
377 else if (!strcmp (ptr, "CHRG")) 448 } else if (!strcmp(ptr, "BOOST")) {
378 status |= UPSSTATUS_CHRG; 449 config->status |= UPSSTATUS_BOOST;
379 else if (!strcmp (ptr, "DISCHRG")) 450 } else if (!strcmp(ptr, "CHRG")) {
380 status |= UPSSTATUS_DISCHRG; 451 config->status |= UPSSTATUS_CHRG;
381 else 452 } else if (!strcmp(ptr, "DISCHRG")) {
382 status |= UPSSTATUS_UNKNOWN; 453 config->status |= UPSSTATUS_DISCHRG;
454 } else if (!strcmp(ptr, "ALARM")) {
455 config->status |= UPSSTATUS_ALARM;
456 } else {
457 config->status |= UPSSTATUS_UNKNOWN;
458 }
383 } 459 }
384 460
385 return OK; 461 return OK;
386} 462}
387 463
388
389/* gets a variable value for a specific UPS */ 464/* gets a variable value for a specific UPS */
390int 465int get_ups_variable(const char *varname, char *buf, const ups_config config) {
391get_ups_variable (const char *varname, char *buf)
392{
393 /* char command[MAX_INPUT_BUFFER]; */
394 char temp_buffer[MAX_INPUT_BUFFER];
395 char send_buffer[MAX_INPUT_BUFFER]; 466 char send_buffer[MAX_INPUT_BUFFER];
396 char *ptr;
397 char *logout = "OK Goodbye\n";
398 int logout_len = strlen(logout);
399 int len;
400
401 *buf=0;
402 467
403 /* create the command string to send to the UPS daemon */ 468 /* create the command string to send to the UPS daemon */
404 /* Add LOGOUT to avoid read failure logs */ 469 /* Add LOGOUT to avoid read failure logs */
405 if (snprintf (send_buffer, sizeof(send_buffer), "GET VAR %s %s\nLOGOUT\n", ups_name, varname) >= sizeof(send_buffer)) { 470 int res = snprintf(send_buffer, sizeof(send_buffer),
471 "GET VAR %s %s\nLOGOUT\n", config.ups_name, varname);
472 if ((res > 0) && ((size_t)res >= sizeof(send_buffer))) {
406 printf("%s\n", _("UPS name to long for buffer")); 473 printf("%s\n", _("UPS name to long for buffer"));
407 return ERROR; 474 return ERROR;
408 } 475 }
409 476
477 char temp_buffer[MAX_INPUT_BUFFER];
478
410 /* send the command to the daemon and get a response back */ 479 /* send the command to the daemon and get a response back */
411 if (process_tcp_request 480 if (process_tcp_request(config.server_address, config.server_port,
412 (server_address, server_port, send_buffer, temp_buffer, 481 send_buffer, temp_buffer,
413 sizeof (temp_buffer)) != STATE_OK) { 482 sizeof(temp_buffer)) != STATE_OK) {
414 printf ("%s\n", _("Invalid response received from host")); 483 printf("%s\n", _("Invalid response received from host"));
415 return ERROR; 484 return ERROR;
416 } 485 }
417 486
418 ptr = temp_buffer; 487 char *ptr = temp_buffer;
419 len = strlen(ptr); 488 int len = strlen(ptr);
420 if (len > logout_len && strcmp (ptr + len - logout_len, logout) == 0) len -= logout_len; 489 const char *logout = "OK Goodbye\n";
421 if (len > 0 && ptr[len-1] == '\n') ptr[len-1]=0; 490 const int logout_len = strlen(logout);
422 if (strcmp (ptr, "ERR UNKNOWN-UPS") == 0) { 491
423 printf (_("CRITICAL - no such UPS '%s' on that host\n"), ups_name); 492 if (len > logout_len && strcmp(ptr + len - logout_len, logout) == 0) {
493 len -= logout_len;
494 }
495 if (len > 0 && ptr[len - 1] == '\n') {
496 ptr[len - 1] = 0;
497 }
498 if (strcmp(ptr, "ERR UNKNOWN-UPS") == 0) {
499 printf(_("CRITICAL - no such UPS '%s' on that host\n"),
500 config.ups_name);
424 return ERROR; 501 return ERROR;
425 } 502 }
426 503
427 if (strcmp (ptr, "ERR VAR-NOT-SUPPORTED") == 0) { 504 if (strcmp(ptr, "ERR VAR-NOT-SUPPORTED") == 0) {
428 /*printf ("Error: Variable '%s' is not supported\n", varname);*/ 505 /*printf ("Error: Variable '%s' is not supported\n", varname);*/
429 return NOSUCHVAR; 506 return NOSUCHVAR;
430 } 507 }
431 508
432 if (strcmp (ptr, "ERR DATA-STALE") == 0) { 509 if (strcmp(ptr, "ERR DATA-STALE") == 0) {
433 printf ("%s\n", _("CRITICAL - UPS data is stale")); 510 printf("%s\n", _("CRITICAL - UPS data is stale"));
434 return ERROR; 511 return ERROR;
435 } 512 }
436 513
437 if (strncmp (ptr, "ERR", 3) == 0) { 514 if (strncmp(ptr, "ERR", 3) == 0) {
438 printf (_("Unknown error: %s\n"), ptr); 515 printf(_("Unknown error: %s\n"), ptr);
439 return ERROR; 516 return ERROR;
440 } 517 }
441 518
442 ptr = temp_buffer + strlen (varname) + strlen (ups_name) + 6; 519 ptr = temp_buffer + strlen(varname) + strlen(config.ups_name) + 6;
443 len = strlen(ptr); 520 len = strlen(ptr);
444 if (len < 2 || ptr[0] != '"' || ptr[len-1] != '"') { 521 if (len < 2 || ptr[0] != '"' || ptr[len - 1] != '"') {
445 printf ("%s\n", _("Error: unable to parse variable")); 522 printf("%s\n", _("Error: unable to parse variable"));
446 return ERROR; 523 return ERROR;
447 } 524 }
448 strncpy (buf, ptr+1, len - 2); 525
526 *buf = 0;
527 strncpy(buf, ptr + 1, len - 2);
449 buf[len - 2] = 0; 528 buf[len - 2] = 0;
450 529
451 return OK; 530 return OK;
452} 531}
453 532
454
455/* Command line: CHECK_UPS -H <host_address> -u ups [-p port] [-v variable] 533/* Command line: CHECK_UPS -H <host_address> -u ups [-p port] [-v variable]
456 [-wv warn_value] [-cv crit_value] [-to to_sec] */ 534 [-wv warn_value] [-cv crit_value] [-to to_sec] */
457 535
458
459/* process command-line arguments */ 536/* process command-line arguments */
460int 537int process_arguments(int argc, char **argv, ups_config *config) {
461process_arguments (int argc, char **argv) 538
462{ 539 static struct option longopts[] = {{"hostname", required_argument, 0, 'H'},
463 int c; 540 {"ups", required_argument, 0, 'u'},
464 541 {"port", required_argument, 0, 'p'},
465 int option = 0; 542 {"critical", required_argument, 0, 'c'},
466 static struct option longopts[] = { 543 {"warning", required_argument, 0, 'w'},
467 {"hostname", required_argument, 0, 'H'}, 544 {"timeout", required_argument, 0, 't'},
468 {"ups", required_argument, 0, 'u'}, 545 {"temperature", no_argument, 0, 'T'},
469 {"port", required_argument, 0, 'p'}, 546 {"variable", required_argument, 0, 'v'},
470 {"critical", required_argument, 0, 'c'}, 547 {"version", no_argument, 0, 'V'},
471 {"warning", required_argument, 0, 'w'}, 548 {"help", no_argument, 0, 'h'},
472 {"timeout", required_argument, 0, 't'}, 549 {0, 0, 0, 0}};
473 {"temperature", no_argument, 0, 'T'}, 550
474 {"variable", required_argument, 0, 'v'}, 551 if (argc < 2) {
475 {"version", no_argument, 0, 'V'},
476 {"help", no_argument, 0, 'h'},
477 {0, 0, 0, 0}
478 };
479
480 if (argc < 2)
481 return ERROR; 552 return ERROR;
553 }
482 554
555 int c;
483 for (c = 1; c < argc; c++) { 556 for (c = 1; c < argc; c++) {
484 if (strcmp ("-to", argv[c]) == 0) 557 if (strcmp("-to", argv[c]) == 0) {
485 strcpy (argv[c], "-t"); 558 strcpy(argv[c], "-t");
486 else if (strcmp ("-wt", argv[c]) == 0) 559 } else if (strcmp("-wt", argv[c]) == 0) {
487 strcpy (argv[c], "-w"); 560 strcpy(argv[c], "-w");
488 else if (strcmp ("-ct", argv[c]) == 0) 561 } else if (strcmp("-ct", argv[c]) == 0) {
489 strcpy (argv[c], "-c"); 562 strcpy(argv[c], "-c");
563 }
490 } 564 }
491 565
566 int option = 0;
492 while (1) { 567 while (1) {
493 c = getopt_long (argc, argv, "hVTH:u:p:v:c:w:t:", longopts, 568 c = getopt_long(argc, argv, "hVTH:u:p:v:c:w:t:", longopts, &option);
494 &option);
495 569
496 if (c == -1 || c == EOF) 570 if (c == -1 || c == EOF) {
497 break; 571 break;
572 }
498 573
499 switch (c) { 574 switch (c) {
500 case '?': /* help */ 575 case '?': /* help */
501 usage5 (); 576 usage5();
502 case 'H': /* hostname */ 577 case 'H': /* hostname */
503 if (is_host (optarg)) { 578 if (is_host(optarg)) {
504 server_address = optarg; 579 config->server_address = optarg;
505 } 580 } else {
506 else { 581 usage2(_("Invalid hostname/address"), optarg);
507 usage2 (_("Invalid hostname/address"), optarg);
508 } 582 }
509 break; 583 break;
510 case 'T': /* FIXME: to be improved (ie "-T C" for Celsius or "-T F" for Fahrenheit) */ 584 case 'T': /* FIXME: to be improved (ie "-T C" for Celsius or "-T F" for
511 temp_output_c = 1; 585 Fahrenheit) */
586 config->temp_output_c = true;
512 break; 587 break;
513 case 'u': /* ups name */ 588 case 'u': /* ups name */
514 ups_name = optarg; 589 config->ups_name = optarg;
515 break; 590 break;
516 case 'p': /* port */ 591 case 'p': /* port */
517 if (is_intpos (optarg)) { 592 if (is_intpos(optarg)) {
518 server_port = atoi (optarg); 593 config->server_port = atoi(optarg);
519 } 594 } else {
520 else { 595 usage2(_("Port must be a positive integer"), optarg);
521 usage2 (_("Port must be a positive integer"), optarg);
522 } 596 }
523 break; 597 break;
524 case 'c': /* critical time threshold */ 598 case 'c': /* critical time threshold */
525 if (is_intnonneg (optarg)) { 599 if (is_intnonneg(optarg)) {
526 critical_value = atoi (optarg); 600 config->critical_value = atoi(optarg);
527 check_crit = TRUE; 601 config->check_crit = true;
528 } 602 } else {
529 else { 603 usage2(_("Critical time must be a positive integer"), optarg);
530 usage2 (_("Critical time must be a positive integer"), optarg);
531 } 604 }
532 break; 605 break;
533 case 'w': /* warning time threshold */ 606 case 'w': /* warning time threshold */
534 if (is_intnonneg (optarg)) { 607 if (is_intnonneg(optarg)) {
535 warning_value = atoi (optarg); 608 config->warning_value = atoi(optarg);
536 check_warn = TRUE; 609 config->check_warn = true;
537 } 610 } else {
538 else { 611 usage2(_("Warning time must be a positive integer"), optarg);
539 usage2 (_("Warning time must be a positive integer"), optarg);
540 } 612 }
541 break; 613 break;
542 case 'v': /* variable */ 614 case 'v': /* variable */
543 if (!strcmp (optarg, "LINE")) 615 if (!strcmp(optarg, "LINE")) {
544 check_variable = UPS_UTILITY; 616 config->check_variable = UPS_UTILITY;
545 else if (!strcmp (optarg, "TEMP")) 617 } else if (!strcmp(optarg, "TEMP")) {
546 check_variable = UPS_TEMP; 618 config->check_variable = UPS_TEMP;
547 else if (!strcmp (optarg, "BATTPCT")) 619 } else if (!strcmp(optarg, "BATTPCT")) {
548 check_variable = UPS_BATTPCT; 620 config->check_variable = UPS_BATTPCT;
549 else if (!strcmp (optarg, "LOADPCT")) 621 } else if (!strcmp(optarg, "LOADPCT")) {
550 check_variable = UPS_LOADPCT; 622 config->check_variable = UPS_LOADPCT;
551 else 623 } else if (!strcmp(optarg, "REALPOWER")) {
552 usage2 (_("Unrecognized UPS variable"), optarg); 624 config->check_variable = UPS_REALPOWER;
553 break; 625 } else {
554 case 't': /* timeout */ 626 usage2(_("Unrecognized UPS variable"), optarg);
555 if (is_intnonneg (optarg)) {
556 socket_timeout = atoi (optarg);
557 } 627 }
558 else { 628 break;
559 usage4 (_("Timeout interval must be a positive integer")); 629 case 't': /* timeout */
630 if (is_intnonneg(optarg)) {
631 socket_timeout = atoi(optarg);
632 } else {
633 usage4(_("Timeout interval must be a positive integer"));
560 } 634 }
561 break; 635 break;
562 case 'V': /* version */ 636 case 'V': /* version */
563 print_revision (progname, NP_VERSION); 637 print_revision(progname, NP_VERSION);
564 exit (STATE_UNKNOWN); 638 exit(STATE_UNKNOWN);
565 case 'h': /* help */ 639 case 'h': /* help */
566 print_help (); 640 print_help();
567 exit (STATE_UNKNOWN); 641 exit(STATE_UNKNOWN);
568 } 642 }
569 } 643 }
570 644
571 645 if (config->server_address == NULL && argc > optind) {
572 if (server_address == NULL && argc > optind) { 646 if (is_host(argv[optind])) {
573 if (is_host (argv[optind])) 647 config->server_address = argv[optind++];
574 server_address = argv[optind++]; 648 } else {
575 else 649 usage2(_("Invalid hostname/address"), optarg);
576 usage2 (_("Invalid hostname/address"), optarg); 650 }
577 } 651 }
578 652
579 if (server_address == NULL) 653 if (config->server_address == NULL) {
580 server_address = strdup("127.0.0.1"); 654 config->server_address = strdup("127.0.0.1");
655 }
581 656
582 return validate_arguments(); 657 return validate_arguments(*config);
583} 658}
584 659
585 660int validate_arguments(ups_config config) {
586int 661 if (!config.ups_name) {
587validate_arguments (void) 662 printf("%s\n", _("Error : no UPS indicated"));
588{
589 if (! ups_name) {
590 printf ("%s\n", _("Error : no UPS indicated"));
591 return ERROR; 663 return ERROR;
592 } 664 }
593 return OK; 665 return OK;
594} 666}
595 667
668void print_help(void) {
669 print_revision(progname, NP_VERSION);
596 670
597void 671 printf("Copyright (c) 2000 Tom Shields\n");
598print_help (void) 672 printf("Copyright (c) 2004 Alain Richard <alain.richard@equation.fr>\n");
599{ 673 printf("Copyright (c) 2004 Arnaud Quette <arnaud.quette@mgeups.com>\n");
600 char *myport; 674 printf(COPYRIGHT, copyright, email);
601 xasprintf (&myport, "%d", PORT);
602
603 print_revision (progname, NP_VERSION);
604
605 printf ("Copyright (c) 2000 Tom Shields\n");
606 printf ("Copyright (c) 2004 Alain Richard <alain.richard@equation.fr>\n");
607 printf ("Copyright (c) 2004 Arnaud Quette <arnaud.quette@mgeups.com>\n");
608 printf (COPYRIGHT, copyright, email);
609
610 printf ("%s\n", _("This plugin tests the UPS service on the specified host. Network UPS Tools"));
611 printf ("%s\n", _("from www.networkupstools.org must be running for this plugin to work."));
612
613 printf ("\n\n");
614
615 print_usage ();
616 675
617 printf (UT_HELP_VRSN); 676 printf("%s\n", _("This plugin tests the UPS service on the specified host. "
618 printf (UT_EXTRA_OPTS); 677 "Network UPS Tools"));
678 printf("%s\n", _("from www.networkupstools.org must be running for this "
679 "plugin to work."));
619 680
620 printf (UT_HOST_PORT, 'p', myport); 681 printf("\n\n");
621 682
622 printf (" %s\n", "-u, --ups=STRING"); 683 print_usage();
623 printf (" %s\n", _("Name of UPS"));
624 printf (" %s\n", "-T, --temperature");
625 printf (" %s\n", _("Output of temperatures in Celsius"));
626 printf (" %s\n", "-v, --variable=STRING");
627 printf (" %s %s\n", _("Valid values for STRING are"), "LINE, TEMP, BATTPCT or LOADPCT");
628 684
629 printf (UT_WARN_CRIT); 685 printf(UT_HELP_VRSN);
686 printf(UT_EXTRA_OPTS);
630 687
631 printf (UT_CONN_TIMEOUT, DEFAULT_SOCKET_TIMEOUT); 688 char *myport;
632 689 xasprintf(&myport, "%d", PORT);
633/* TODO: -v clashing with -v/-variable. Commenting out help text since verbose 690 printf(UT_HOST_PORT, 'p', myport);
634 is unused up to now */ 691
635/* printf (UT_VERBOSE); */ 692 printf(" %s\n", "-u, --ups=STRING");
636 693 printf(" %s\n", _("Name of UPS"));
637 printf ("\n"); 694 printf(" %s\n", "-T, --temperature");
638 printf ("%s\n", _("This plugin attempts to determine the status of a UPS (Uninterruptible Power")); 695 printf(" %s\n", _("Output of temperatures in Celsius"));
639 printf ("%s\n", _("Supply) on a local or remote host. If the UPS is online or calibrating, the")); 696 printf(" %s\n", "-v, --variable=STRING");
640 printf ("%s\n", _("plugin will return an OK state. If the battery is on it will return a WARNING")); 697 printf(" %s %s\n", _("Valid values for STRING are"),
641 printf ("%s\n", _("state. If the UPS is off or has a low battery the plugin will return a CRITICAL")); 698 "LINE, TEMP, BATTPCT, LOADPCT or REALPOWER");
642 printf ("%s\n", _("state.")); 699
643 700 printf(UT_WARN_CRIT);
644 printf ("\n"); 701
645 printf ("%s\n", _("Notes:")); 702 printf(UT_CONN_TIMEOUT, DEFAULT_SOCKET_TIMEOUT);
646 printf (" %s\n", _("You may also specify a variable to check (such as temperature, utility voltage,")); 703
647 printf (" %s\n", _("battery load, etc.) as well as warning and critical thresholds for the value")); 704 /* TODO: -v clashing with -v/-variable. Commenting out help text since
648 printf (" %s\n", _("of that variable. If the remote host has multiple UPS that are being monitored")); 705 verbose is unused up to now */
649 printf (" %s\n", _("you will have to use the --ups option to specify which UPS to check.")); 706 /* printf (UT_VERBOSE); */
650 printf ("\n"); 707
651 printf (" %s\n", _("This plugin requires that the UPSD daemon distributed with Russell Kroll's")); 708 printf("\n");
652 printf (" %s\n", _("Network UPS Tools be installed on the remote host. If you do not have the")); 709 printf("%s\n", _("This plugin attempts to determine the status of a UPS "
653 printf (" %s\n", _("package installed on your system, you can download it from")); 710 "(Uninterruptible Power"));
654 printf (" %s\n", _("http://www.networkupstools.org")); 711 printf("%s\n", _("Supply) on a local or remote host. If the UPS is online "
655 712 "or calibrating, the"));
656 printf (UT_SUPPORT); 713 printf("%s\n", _("plugin will return an OK state. If the battery is on it "
714 "will return a WARNING"));
715 printf("%s\n", _("state. If the UPS is off or has a low battery the plugin "
716 "will return a CRITICAL"));
717 printf("%s\n", _("state."));
718
719 printf("\n");
720 printf("%s\n", _("Notes:"));
721 printf(" %s\n", _("You may also specify a variable to check (such as "
722 "temperature, utility voltage,"));
723 printf(" %s\n", _("battery load, etc.) as well as warning and critical "
724 "thresholds for the value"));
725 printf(" %s\n", _("of that variable. If the remote host has multiple UPS "
726 "that are being monitored"));
727 printf(" %s\n", _("you will have to use the --ups option to specify which "
728 "UPS to check."));
729 printf("\n");
730 printf(" %s\n", _("This plugin requires that the UPSD daemon distributed "
731 "with Russell Kroll's"));
732 printf(" %s\n", _("Network UPS Tools be installed on the remote host. If "
733 "you do not have the"));
734 printf(" %s\n",
735 _("package installed on your system, you can download it from"));
736 printf(" %s\n", _("http://www.networkupstools.org"));
737
738 printf(UT_SUPPORT);
657} 739}
658 740
659 741void print_usage(void) {
660void 742 printf("%s\n", _("Usage:"));
661print_usage (void) 743 printf("%s -H host -u ups [-p port] [-v variable] [-w warn_value] [-c "
662{ 744 "crit_value] [-to to_sec] [-T]\n",
663 printf ("%s\n", _("Usage:")); 745 progname);
664 printf ("%s -H host -u ups [-p port] [-v variable] [-w warn_value] [-c crit_value] [-to to_sec] [-T]\n", progname);
665} 746}
diff --git a/plugins/check_users.c b/plugins/check_users.c
index 2a9ee986..89b95369 100644
--- a/plugins/check_users.c
+++ b/plugins/check_users.c
@@ -179,7 +179,7 @@ main (int argc, char **argv)
179 printf (_("USERS %s - %d users currently logged in |%s\n"), 179 printf (_("USERS %s - %d users currently logged in |%s\n"),
180 state_text(result), users, 180 state_text(result), users,
181 sperfdata_int("users", users, "", warning_range, 181 sperfdata_int("users", users, "", warning_range,
182 critical_range, TRUE, 0, FALSE, 0)); 182 critical_range, true, 0, false, 0));
183 } 183 }
184 184
185 return result; 185 return result;
@@ -202,7 +202,7 @@ process_arguments (int argc, char **argv)
202 if (argc < 2) 202 if (argc < 2)
203 usage ("\n"); 203 usage ("\n");
204 204
205 while (1) { 205 while (true) {
206 c = getopt_long (argc, argv, "+hVvc:w:", longopts, &option); 206 c = getopt_long (argc, argv, "+hVvc:w:", longopts, &option);
207 207
208 if (c == -1 || c == EOF || c == 1) 208 if (c == -1 || c == EOF || c == 1)
@@ -227,18 +227,23 @@ process_arguments (int argc, char **argv)
227 } 227 }
228 228
229 c = optind; 229 c = optind;
230
230 if (warning_range == NULL && argc > c) 231 if (warning_range == NULL && argc > c)
231 warning_range = argv[c++]; 232 warning_range = argv[c++];
233
232 if (critical_range == NULL && argc > c) 234 if (critical_range == NULL && argc > c)
233 critical_range = argv[c++]; 235 critical_range = argv[c++];
234 236
235 /* this will abort in case of invalid ranges */ 237 /* this will abort in case of invalid ranges */
236 set_thresholds (&thlds, warning_range, critical_range); 238 set_thresholds (&thlds, warning_range, critical_range);
237 239
238 if (thlds->warning->end < 0) 240 if (!thlds->warning) {
239 usage4 (_("Warning threshold must be a positive integer")); 241 usage4 (_("Warning threshold must be a valid range expression"));
240 if (thlds->critical->end < 0) 242 }
241 usage4 (_("Critical threshold must be a positive integer")); 243
244 if (!thlds->critical) {
245 usage4 (_("Critical threshold must be a valid range expression"));
246 }
242 247
243 return OK; 248 return OK;
244} 249}
@@ -261,10 +266,10 @@ print_help (void)
261 printf (UT_HELP_VRSN); 266 printf (UT_HELP_VRSN);
262 printf (UT_EXTRA_OPTS); 267 printf (UT_EXTRA_OPTS);
263 268
264 printf (" %s\n", "-w, --warning=INTEGER"); 269 printf (" %s\n", "-w, --warning=RANGE_EXPRESSION");
265 printf (" %s\n", _("Set WARNING status if more than INTEGER users are logged in")); 270 printf (" %s\n", _("Set WARNING status if number of logged in users violates RANGE_EXPRESSION"));
266 printf (" %s\n", "-c, --critical=INTEGER"); 271 printf (" %s\n", "-c, --critical=RANGE_EXPRESSION");
267 printf (" %s\n", _("Set CRITICAL status if more than INTEGER users are logged in")); 272 printf (" %s\n", _("Set CRITICAL status if number of logged in users violates RANGE_EXPRESSION"));
268 273
269 printf (UT_SUPPORT); 274 printf (UT_SUPPORT);
270} 275}
diff --git a/plugins/common.h b/plugins/common.h
index 0f08e2f6..833479ce 100644
--- a/plugins/common.h
+++ b/plugins/common.h
@@ -184,14 +184,6 @@ enum {
184 ERROR = -1 184 ERROR = -1
185}; 185};
186 186
187/* AIX seems to have this defined somewhere else */
188#ifndef FALSE
189enum {
190 FALSE,
191 TRUE
192};
193#endif
194
195enum { 187enum {
196 STATE_OK, 188 STATE_OK,
197 STATE_WARNING, 189 STATE_WARNING,
@@ -225,18 +217,4 @@ enum {
225# define __attribute__(x) /* do nothing */ 217# define __attribute__(x) /* do nothing */
226#endif 218#endif
227 219
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_ */ 220#endif /* _COMMON_H_ */
diff --git a/plugins/negate.c b/plugins/negate.c
index 50f62d33..c5fe7e13 100644
--- a/plugins/negate.c
+++ b/plugins/negate.c
@@ -47,7 +47,7 @@ static const char **process_arguments (int, char **);
47void validate_arguments (char **); 47void validate_arguments (char **);
48void print_help (void); 48void print_help (void);
49void print_usage (void); 49void print_usage (void);
50int subst_text = FALSE; 50bool subst_text = false;
51 51
52static int state[4] = { 52static int state[4] = {
53 STATE_OK, 53 STATE_OK,
@@ -63,7 +63,6 @@ main (int argc, char **argv)
63 char *sub; 63 char *sub;
64 char **command_line; 64 char **command_line;
65 output chld_out, chld_err; 65 output chld_out, chld_err;
66 int i;
67 66
68 setlocale (LC_ALL, ""); 67 setlocale (LC_ALL, "");
69 bindtextdomain (PACKAGE, LOCALEDIR); 68 bindtextdomain (PACKAGE, LOCALEDIR);
@@ -86,7 +85,7 @@ main (int argc, char **argv)
86 result = cmd_run_array (command_line, &chld_out, &chld_err, 0); 85 result = cmd_run_array (command_line, &chld_out, &chld_err, 0);
87 } 86 }
88 if (chld_err.lines > 0) { 87 if (chld_err.lines > 0) {
89 for (i = 0; i < chld_err.lines; i++) { 88 for (size_t i = 0; i < chld_err.lines; i++) {
90 fprintf (stderr, "%s\n", chld_err.line[i]); 89 fprintf (stderr, "%s\n", chld_err.line[i]);
91 } 90 }
92 } 91 }
@@ -95,7 +94,7 @@ main (int argc, char **argv)
95 if (chld_out.lines == 0) 94 if (chld_out.lines == 0)
96 die (max_state_alt (result, STATE_UNKNOWN), _("No data returned from command\n")); 95 die (max_state_alt (result, STATE_UNKNOWN), _("No data returned from command\n"));
97 96
98 for (i = 0; i < chld_out.lines; i++) { 97 for (size_t i = 0; i < chld_out.lines; i++) {
99 if (subst_text && result >= 0 && result <= 4 && result != state[result]) { 98 if (subst_text && result >= 0 && result <= 4 && result != state[result]) {
100 /* Loop over each match found */ 99 /* Loop over each match found */
101 while ((sub = strstr (chld_out.line[i], state_text (result)))) { 100 while ((sub = strstr (chld_out.line[i], state_text (result)))) {
@@ -122,7 +121,7 @@ static const char **
122process_arguments (int argc, char **argv) 121process_arguments (int argc, char **argv)
123{ 122{
124 int c; 123 int c;
125 int permute = TRUE; 124 bool permute = true;
126 125
127 int option = 0; 126 int option = 0;
128 static struct option longopts[] = { 127 static struct option longopts[] = {
@@ -168,26 +167,26 @@ process_arguments (int argc, char **argv)
168 case 'o': /* replacement for OK */ 167 case 'o': /* replacement for OK */
169 if ((state[STATE_OK] = mp_translate_state(optarg)) == ERROR) 168 if ((state[STATE_OK] = mp_translate_state(optarg)) == ERROR)
170 usage4 (_("Ok must be a valid state name (OK, WARNING, CRITICAL, UNKNOWN) or integer (0-3).")); 169 usage4 (_("Ok must be a valid state name (OK, WARNING, CRITICAL, UNKNOWN) or integer (0-3)."));
171 permute = FALSE; 170 permute = false;
172 break; 171 break;
173 172
174 case 'w': /* replacement for WARNING */ 173 case 'w': /* replacement for WARNING */
175 if ((state[STATE_WARNING] = mp_translate_state(optarg)) == ERROR) 174 if ((state[STATE_WARNING] = mp_translate_state(optarg)) == ERROR)
176 usage4 (_("Warning must be a valid state name (OK, WARNING, CRITICAL, UNKNOWN) or integer (0-3).")); 175 usage4 (_("Warning must be a valid state name (OK, WARNING, CRITICAL, UNKNOWN) or integer (0-3)."));
177 permute = FALSE; 176 permute = false;
178 break; 177 break;
179 case 'c': /* replacement for CRITICAL */ 178 case 'c': /* replacement for CRITICAL */
180 if ((state[STATE_CRITICAL] = mp_translate_state(optarg)) == ERROR) 179 if ((state[STATE_CRITICAL] = mp_translate_state(optarg)) == ERROR)
181 usage4 (_("Critical must be a valid state name (OK, WARNING, CRITICAL, UNKNOWN) or integer (0-3).")); 180 usage4 (_("Critical must be a valid state name (OK, WARNING, CRITICAL, UNKNOWN) or integer (0-3)."));
182 permute = FALSE; 181 permute = false;
183 break; 182 break;
184 case 'u': /* replacement for UNKNOWN */ 183 case 'u': /* replacement for UNKNOWN */
185 if ((state[STATE_UNKNOWN] = mp_translate_state(optarg)) == ERROR) 184 if ((state[STATE_UNKNOWN] = mp_translate_state(optarg)) == ERROR)
186 usage4 (_("Unknown must be a valid state name (OK, WARNING, CRITICAL, UNKNOWN) or integer (0-3).")); 185 usage4 (_("Unknown must be a valid state name (OK, WARNING, CRITICAL, UNKNOWN) or integer (0-3)."));
187 permute = FALSE; 186 permute = false;
188 break; 187 break;
189 case 's': /* Substitute status text */ 188 case 's': /* Substitute status text */
190 subst_text = TRUE; 189 subst_text = true;
191 break; 190 break;
192 } 191 }
193 } 192 }
@@ -221,8 +220,10 @@ print_help (void)
221 220
222 printf (COPYRIGHT, copyright, email); 221 printf (COPYRIGHT, copyright, email);
223 222
224 printf ("%s\n", _("Negates the status of a plugin (returns OK for CRITICAL and vice-versa).")); 223 printf ("%s\n", _("Negates only the return code of a plugin (returns OK for CRITICAL and vice-versa) by default."));
225 printf ("%s\n", _("Additional switches can be used to control which state becomes what.")); 224 printf ("%s\n", _("Additional switches can be used to control:\n"));
225 printf ("\t - which state becomes what\n");
226 printf ("\t - changing the plugin output text to match the return code");
226 227
227 printf ("\n\n"); 228 printf ("\n\n");
228 229
diff --git a/plugins/netutils.c b/plugins/netutils.c
index 1bb4f076..c6af248e 100644
--- a/plugins/netutils.c
+++ b/plugins/netutils.c
@@ -34,7 +34,7 @@ unsigned int socket_timeout = DEFAULT_SOCKET_TIMEOUT;
34unsigned int socket_timeout_state = STATE_CRITICAL; 34unsigned int socket_timeout_state = STATE_CRITICAL;
35 35
36int econn_refuse_state = STATE_CRITICAL; 36int econn_refuse_state = STATE_CRITICAL;
37int was_refused = FALSE; 37bool was_refused = false;
38#if USE_IPV6 38#if USE_IPV6
39int address_family = AF_UNSPEC; 39int address_family = AF_UNSPEC;
40#else 40#else
@@ -215,14 +215,14 @@ np_net_connect (const char *host_name, int port, int *sd, int proto)
215 result = connect (*sd, r->ai_addr, r->ai_addrlen); 215 result = connect (*sd, r->ai_addr, r->ai_addrlen);
216 216
217 if (result == 0) { 217 if (result == 0) {
218 was_refused = FALSE; 218 was_refused = false;
219 break; 219 break;
220 } 220 }
221 221
222 if (result < 0) { 222 if (result < 0) {
223 switch (errno) { 223 switch (errno) {
224 case ECONNREFUSED: 224 case ECONNREFUSED:
225 was_refused = TRUE; 225 was_refused = true;
226 break; 226 break;
227 } 227 }
228 } 228 }
@@ -246,7 +246,7 @@ np_net_connect (const char *host_name, int port, int *sd, int proto)
246 } 246 }
247 result = connect(*sd, (struct sockaddr *)&su, sizeof(su)); 247 result = connect(*sd, (struct sockaddr *)&su, sizeof(su));
248 if (result < 0 && errno == ECONNREFUSED) 248 if (result < 0 && errno == ECONNREFUSED)
249 was_refused = TRUE; 249 was_refused = true;
250 } 250 }
251 251
252 if (result == 0) 252 if (result == 0)
@@ -326,13 +326,11 @@ send_request (int sd, int proto, const char *send_buffer, char *recv_buffer, int
326} 326}
327 327
328 328
329int 329bool is_host (const char *address) {
330is_host (const char *address)
331{
332 if (is_addr (address) || is_hostname (address)) 330 if (is_addr (address) || is_hostname (address))
333 return (TRUE); 331 return (true);
334 332
335 return (FALSE); 333 return (false);
336} 334}
337 335
338void 336void
@@ -342,20 +340,18 @@ host_or_die(const char *str)
342 usage_va(_("Invalid hostname/address - %s"), str); 340 usage_va(_("Invalid hostname/address - %s"), str);
343} 341}
344 342
345int 343bool is_addr (const char *address) {
346is_addr (const char *address)
347{
348#ifdef USE_IPV6 344#ifdef USE_IPV6
349 if (address_family == AF_INET && is_inet_addr (address)) 345 if (address_family == AF_INET && is_inet_addr (address))
350 return TRUE; 346 return true;
351 else if (address_family == AF_INET6 && is_inet6_addr (address)) 347 else if (address_family == AF_INET6 && is_inet6_addr (address))
352 return TRUE; 348 return true;
353#else 349#else
354 if (is_inet_addr (address)) 350 if (is_inet_addr (address))
355 return (TRUE); 351 return (true);
356#endif 352#endif
357 353
358 return (FALSE); 354 return (false);
359} 355}
360 356
361int 357int
@@ -370,10 +366,10 @@ dns_lookup (const char *in, struct sockaddr_storage *ss, int family)
370 366
371 retval = getaddrinfo (in, NULL, &hints, &res); 367 retval = getaddrinfo (in, NULL, &hints, &res);
372 if (retval != 0) 368 if (retval != 0)
373 return FALSE; 369 return false;
374 370
375 if (ss != NULL) 371 if (ss != NULL)
376 memcpy (ss, res->ai_addr, res->ai_addrlen); 372 memcpy (ss, res->ai_addr, res->ai_addrlen);
377 freeaddrinfo (res); 373 freeaddrinfo (res);
378 return TRUE; 374 return true;
379} 375}
diff --git a/plugins/netutils.h b/plugins/netutils.h
index d7ee0ddd..a95057e0 100644
--- a/plugins/netutils.h
+++ b/plugins/netutils.h
@@ -73,8 +73,8 @@ int send_request (int sd, int proto, const char *send_buffer, char *recv_buffer,
73 73
74 74
75/* "is_*" wrapper macros and functions */ 75/* "is_*" wrapper macros and functions */
76int is_host (const char *); 76bool is_host (const char *);
77int is_addr (const char *); 77bool is_addr (const char *);
78int dns_lookup (const char *, struct sockaddr_storage *, int); 78int dns_lookup (const char *, struct sockaddr_storage *, int);
79void host_or_die(const char *str); 79void host_or_die(const char *str);
80#define resolve_host_or_addr(addr, family) dns_lookup(addr, NULL, family) 80#define resolve_host_or_addr(addr, family) dns_lookup(addr, NULL, family)
@@ -89,10 +89,10 @@ void host_or_die(const char *str);
89extern unsigned int socket_timeout; 89extern unsigned int socket_timeout;
90extern unsigned int socket_timeout_state; 90extern unsigned int socket_timeout_state;
91extern int econn_refuse_state; 91extern int econn_refuse_state;
92extern int was_refused; 92extern bool was_refused;
93extern int address_family; 93extern int address_family;
94 94
95RETSIGTYPE socket_timeout_alarm_handler (int) __attribute__((noreturn)); 95void socket_timeout_alarm_handler (int) __attribute__((noreturn));
96 96
97/* SSL-Related functionality */ 97/* SSL-Related functionality */
98#ifdef HAVE_SSL 98#ifdef HAVE_SSL
diff --git a/plugins/popen.c b/plugins/popen.c
index 723817d5..54e63bc5 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;
@@ -49,9 +50,9 @@ extern FILE *child_process;
49FILE *spopen (const char *); 50FILE *spopen (const char *);
50int spclose (FILE *); 51int spclose (FILE *);
51#ifdef REDHAT_SPOPEN_ERROR 52#ifdef REDHAT_SPOPEN_ERROR
52RETSIGTYPE popen_sigchld_handler (int); 53void popen_sigchld_handler (int);
53#endif 54#endif
54RETSIGTYPE popen_timeout_alarm_handler (int); 55void popen_timeout_alarm_handler (int);
55 56
56#include <stdarg.h> /* ANSI C header file */ 57#include <stdarg.h> /* ANSI C header file */
57#include <fcntl.h> 58#include <fcntl.h>
@@ -104,7 +105,7 @@ spopen (const char *cmdstring)
104#endif 105#endif
105 106
106 env[0] = strdup("LC_ALL=C"); 107 env[0] = strdup("LC_ALL=C");
107 env[1] = '\0'; 108 env[1] = NULL;
108 109
109 /* if no command was passed, return with no error */ 110 /* if no command was passed, return with no error */
110 if (cmdstring == NULL) 111 if (cmdstring == NULL)
@@ -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 = mp_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)
@@ -266,7 +266,7 @@ spclose (FILE * fp)
266} 266}
267 267
268#ifdef REDHAT_SPOPEN_ERROR 268#ifdef REDHAT_SPOPEN_ERROR
269RETSIGTYPE 269void
270popen_sigchld_handler (int signo) 270popen_sigchld_handler (int signo)
271{ 271{
272 if (signo == SIGCHLD) 272 if (signo == SIGCHLD)
@@ -274,7 +274,7 @@ popen_sigchld_handler (int signo)
274} 274}
275#endif 275#endif
276 276
277RETSIGTYPE 277void
278popen_timeout_alarm_handler (int signo) 278popen_timeout_alarm_handler (int signo)
279{ 279{
280 int fh; 280 int fh;
diff --git a/plugins/popen.h b/plugins/popen.h
index a5dd8fa7..1ea69632 100644
--- a/plugins/popen.h
+++ b/plugins/popen.h
@@ -5,7 +5,7 @@
5 5
6FILE *spopen (const char *); 6FILE *spopen (const char *);
7int spclose (FILE *); 7int spclose (FILE *);
8RETSIGTYPE popen_timeout_alarm_handler (int); 8void popen_timeout_alarm_handler (int);
9 9
10pid_t *childpid=NULL; 10pid_t *childpid=NULL;
11int *child_stderr_array=NULL; 11int *child_stderr_array=NULL;
diff --git a/plugins/runcmd.c b/plugins/runcmd.c
index 102191e4..ed49bb99 100644
--- a/plugins/runcmd.c
+++ b/plugins/runcmd.c
@@ -60,6 +60,8 @@
60# define SIG_ERR ((Sigfunc *)-1) 60# define SIG_ERR ((Sigfunc *)-1)
61#endif 61#endif
62 62
63#include "../lib/maxfd.h"
64
63/* This variable must be global, since there's no way the caller 65/* This variable must be global, since there's no way the caller
64 * can forcibly slay a dead or ungainly running program otherwise. 66 * can forcibly slay a dead or ungainly running program otherwise.
65 * Multithreading apps and plugins can initialize it (via NP_RUNCMD_INIT) 67 * Multithreading apps and plugins can initialize it (via NP_RUNCMD_INIT)
@@ -88,8 +90,7 @@ extern void die (int, const char *, ...)
88 * through this api and thus achieve async-safeness throughout the api */ 90 * through this api and thus achieve async-safeness throughout the api */
89void np_runcmd_init(void) 91void np_runcmd_init(void)
90{ 92{
91 if(maxfd == 0) 93 long maxfd = mp_open_max();
92 maxfd = open_max();
93 if(!np_pids) np_pids = calloc(maxfd, sizeof(pid_t)); 94 if(!np_pids) np_pids = calloc(maxfd, sizeof(pid_t));
94} 95}
95 96
@@ -114,7 +115,7 @@ np_runcmd_open(const char *cmdstring, int *pfd, int *pfderr)
114 if(!np_pids) NP_RUNCMD_INIT; 115 if(!np_pids) NP_RUNCMD_INIT;
115 116
116 env[0] = strdup("LC_ALL=C"); 117 env[0] = strdup("LC_ALL=C");
117 env[1] = '\0'; 118 env[1] = NULL;
118 119
119 /* make copy of command string so strtok() doesn't silently modify it */ 120 /* make copy of command string so strtok() doesn't silently modify it */
120 /* (the calling program may want to access it later) */ 121 /* (the calling program may want to access it later) */
@@ -192,6 +193,7 @@ np_runcmd_open(const char *cmdstring, int *pfd, int *pfderr)
192 /* close all descriptors in np_pids[] 193 /* close all descriptors in np_pids[]
193 * This is executed in a separate address space (pure child), 194 * This is executed in a separate address space (pure child),
194 * so we don't have to worry about async safety */ 195 * so we don't have to worry about async safety */
196 long maxfd = mp_open_max();
195 for (i = 0; i < maxfd; i++) 197 for (i = 0; i < maxfd; i++)
196 if(np_pids[i] > 0) 198 if(np_pids[i] > 0)
197 close (i); 199 close (i);
@@ -219,6 +221,7 @@ np_runcmd_close(int fd)
219 pid_t pid; 221 pid_t pid;
220 222
221 /* make sure this fd was opened by popen() */ 223 /* make sure this fd was opened by popen() */
224 long maxfd = mp_open_max();
222 if(fd < 0 || fd > maxfd || !np_pids || (pid = np_pids[fd]) == 0) 225 if(fd < 0 || fd > maxfd || !np_pids || (pid = np_pids[fd]) == 0)
223 return -1; 226 return -1;
224 227
@@ -237,12 +240,12 @@ np_runcmd_close(int fd)
237void 240void
238runcmd_timeout_alarm_handler (int signo) 241runcmd_timeout_alarm_handler (int signo)
239{ 242{
240 size_t i;
241 243
242 if (signo == SIGALRM) 244 if (signo == SIGALRM)
243 puts(_("CRITICAL - Plugin timed out while executing system call")); 245 puts(_("CRITICAL - Plugin timed out while executing system call"));
244 246
245 if(np_pids) for(i = 0; i < maxfd; i++) { 247 long maxfd = mp_open_max();
248 if(np_pids) for(long int i = 0; i < maxfd; i++) {
246 if(np_pids[i] != 0) kill(np_pids[i], SIGKILL); 249 if(np_pids[i] != 0) kill(np_pids[i], SIGKILL);
247 } 250 }
248 251
diff --git a/plugins/sslutils.c b/plugins/sslutils.c
index 666a0120..6bc0ba81 100644
--- a/plugins/sslutils.c
+++ b/plugins/sslutils.c
@@ -31,9 +31,8 @@
31#include "netutils.h" 31#include "netutils.h"
32 32
33#ifdef HAVE_SSL 33#ifdef HAVE_SSL
34static SSL_CTX *c=NULL; 34static SSL_CTX *ctx=NULL;
35static SSL *s=NULL; 35static SSL *s=NULL;
36static int initialized=0;
37 36
38int np_net_ssl_init(int sd) { 37int np_net_ssl_init(int sd) {
39 return np_net_ssl_init_with_hostname(sd, NULL); 38 return np_net_ssl_init_with_hostname(sd, NULL);
@@ -48,24 +47,24 @@ int np_net_ssl_init_with_hostname_and_version(int sd, char *host_name, int versi
48} 47}
49 48
50int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int version, char *cert, char *privkey) { 49int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int version, char *cert, char *privkey) {
51 const SSL_METHOD *method = NULL;
52 long options = 0; 50 long options = 0;
53 51
52 if ((ctx = SSL_CTX_new(TLS_client_method())) == NULL) {
53 printf("%s\n", _("CRITICAL - Cannot create SSL context."));
54 return STATE_CRITICAL;
55 }
56
54 switch (version) { 57 switch (version) {
55 case MP_SSLv2: /* SSLv2 protocol */ 58 case MP_SSLv2: /* SSLv2 protocol */
56#if defined(USE_GNUTLS) || defined(OPENSSL_NO_SSL2)
57 printf("%s\n", _("UNKNOWN - SSL protocol version 2 is not supported by your SSL library.")); 59 printf("%s\n", _("UNKNOWN - SSL protocol version 2 is not supported by your SSL library."));
58 return STATE_UNKNOWN; 60 return STATE_UNKNOWN;
59#else
60 method = SSLv2_client_method();
61 break;
62#endif
63 case MP_SSLv3: /* SSLv3 protocol */ 61 case MP_SSLv3: /* SSLv3 protocol */
64#if defined(OPENSSL_NO_SSL3) 62#if defined(OPENSSL_NO_SSL3)
65 printf("%s\n", _("UNKNOWN - SSL protocol version 3 is not supported by your SSL library.")); 63 printf("%s\n", _("UNKNOWN - SSL protocol version 3 is not supported by your SSL library."));
66 return STATE_UNKNOWN; 64 return STATE_UNKNOWN;
67#else 65#else
68 method = SSLv3_client_method(); 66 SSL_CTX_set_min_proto_version(ctx, SSL3_VERSION);
67 SSL_CTX_set_max_proto_version(ctx, SSL3_VERSION);
69 break; 68 break;
70#endif 69#endif
71 case MP_TLSv1: /* TLSv1 protocol */ 70 case MP_TLSv1: /* TLSv1 protocol */
@@ -73,7 +72,8 @@ int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int
73 printf("%s\n", _("UNKNOWN - TLS protocol version 1 is not supported by your SSL library.")); 72 printf("%s\n", _("UNKNOWN - TLS protocol version 1 is not supported by your SSL library."));
74 return STATE_UNKNOWN; 73 return STATE_UNKNOWN;
75#else 74#else
76 method = TLSv1_client_method(); 75 SSL_CTX_set_min_proto_version(ctx, TLS1_VERSION);
76 SSL_CTX_set_max_proto_version(ctx, TLS1_VERSION);
77 break; 77 break;
78#endif 78#endif
79 case MP_TLSv1_1: /* TLSv1.1 protocol */ 79 case MP_TLSv1_1: /* TLSv1.1 protocol */
@@ -81,7 +81,8 @@ int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int
81 printf("%s\n", _("UNKNOWN - TLS protocol version 1.1 is not supported by your SSL library.")); 81 printf("%s\n", _("UNKNOWN - TLS protocol version 1.1 is not supported by your SSL library."));
82 return STATE_UNKNOWN; 82 return STATE_UNKNOWN;
83#else 83#else
84 method = TLSv1_1_client_method(); 84 SSL_CTX_set_min_proto_version(ctx, TLS1_1_VERSION);
85 SSL_CTX_set_max_proto_version(ctx, TLS1_1_VERSION);
85 break; 86 break;
86#endif 87#endif
87 case MP_TLSv1_2: /* TLSv1.2 protocol */ 88 case MP_TLSv1_2: /* TLSv1.2 protocol */
@@ -89,7 +90,8 @@ int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int
89 printf("%s\n", _("UNKNOWN - TLS protocol version 1.2 is not supported by your SSL library.")); 90 printf("%s\n", _("UNKNOWN - TLS protocol version 1.2 is not supported by your SSL library."));
90 return STATE_UNKNOWN; 91 return STATE_UNKNOWN;
91#else 92#else
92 method = TLSv1_2_client_method(); 93 SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION);
94 SSL_CTX_set_max_proto_version(ctx, TLS1_2_VERSION);
93 break; 95 break;
94#endif 96#endif
95 case MP_TLSv1_2_OR_NEWER: 97 case MP_TLSv1_2_OR_NEWER:
@@ -97,56 +99,43 @@ int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int
97 printf("%s\n", _("UNKNOWN - Disabling TLSv1.1 is not supported by your SSL library.")); 99 printf("%s\n", _("UNKNOWN - Disabling TLSv1.1 is not supported by your SSL library."));
98 return STATE_UNKNOWN; 100 return STATE_UNKNOWN;
99#else 101#else
100 options |= SSL_OP_NO_TLSv1_1; 102 SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION);
103 break;
101#endif 104#endif
102 /* FALLTHROUGH */
103 case MP_TLSv1_1_OR_NEWER: 105 case MP_TLSv1_1_OR_NEWER:
104#if !defined(SSL_OP_NO_TLSv1) 106#if !defined(SSL_OP_NO_TLSv1)
105 printf("%s\n", _("UNKNOWN - Disabling TLSv1 is not supported by your SSL library.")); 107 printf("%s\n", _("UNKNOWN - Disabling TLSv1 is not supported by your SSL library."));
106 return STATE_UNKNOWN; 108 return STATE_UNKNOWN;
107#else 109#else
108 options |= SSL_OP_NO_TLSv1; 110 SSL_CTX_set_min_proto_version(ctx, TLS1_1_VERSION);
111 break;
109#endif 112#endif
110 /* FALLTHROUGH */
111 case MP_TLSv1_OR_NEWER: 113 case MP_TLSv1_OR_NEWER:
112#if defined(SSL_OP_NO_SSLv3) 114#if defined(SSL_OP_NO_SSLv3)
113 options |= SSL_OP_NO_SSLv3; 115 SSL_CTX_set_min_proto_version(ctx, TLS1_VERSION);
116 break;
114#endif 117#endif
115 /* FALLTHROUGH */
116 case MP_SSLv3_OR_NEWER: 118 case MP_SSLv3_OR_NEWER:
117#if defined(SSL_OP_NO_SSLv2) 119#if defined(SSL_OP_NO_SSLv2)
118 options |= SSL_OP_NO_SSLv2; 120 SSL_CTX_set_min_proto_version(ctx, SSL3_VERSION);
121 break;
119#endif 122#endif
120 case MP_SSLv2_OR_NEWER:
121 /* FALLTHROUGH */
122 default: /* Default to auto negotiation */
123 method = SSLv23_client_method();
124 }
125 if (!initialized) {
126 /* Initialize SSL context */
127 SSLeay_add_ssl_algorithms();
128 SSL_load_error_strings();
129 OpenSSL_add_all_algorithms();
130 initialized = 1;
131 }
132 if ((c = SSL_CTX_new(method)) == NULL) {
133 printf("%s\n", _("CRITICAL - Cannot create SSL context."));
134 return STATE_CRITICAL;
135 } 123 }
124
136 if (cert && privkey) { 125 if (cert && privkey) {
137#ifdef USE_OPENSSL 126#ifdef USE_OPENSSL
138 if (!SSL_CTX_use_certificate_chain_file(c, cert)) { 127 if (!SSL_CTX_use_certificate_chain_file(ctx, cert)) {
139#elif USE_GNUTLS 128#elif USE_GNUTLS
140 if (!SSL_CTX_use_certificate_file(c, cert, SSL_FILETYPE_PEM)) { 129 if (!SSL_CTX_use_certificate_file(ctx, cert, SSL_FILETYPE_PEM)) {
141#else 130#else
142#error Unported for unknown SSL library 131#error Unported for unknown SSL library
143#endif 132#endif
144 printf ("%s\n", _("CRITICAL - Unable to open certificate chain file!\n")); 133 printf ("%s\n", _("CRITICAL - Unable to open certificate chain file!\n"));
145 return STATE_CRITICAL; 134 return STATE_CRITICAL;
146 } 135 }
147 SSL_CTX_use_PrivateKey_file(c, privkey, SSL_FILETYPE_PEM); 136 SSL_CTX_use_PrivateKey_file(ctx, privkey, SSL_FILETYPE_PEM);
148#ifdef USE_OPENSSL 137#ifdef USE_OPENSSL
149 if (!SSL_CTX_check_private_key(c)) { 138 if (!SSL_CTX_check_private_key(ctx)) {
150 printf ("%s\n", _("CRITICAL - Private key does not seem to match certificate!\n")); 139 printf ("%s\n", _("CRITICAL - Private key does not seem to match certificate!\n"));
151 return STATE_CRITICAL; 140 return STATE_CRITICAL;
152 } 141 }
@@ -155,9 +144,9 @@ int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int
155#ifdef SSL_OP_NO_TICKET 144#ifdef SSL_OP_NO_TICKET
156 options |= SSL_OP_NO_TICKET; 145 options |= SSL_OP_NO_TICKET;
157#endif 146#endif
158 SSL_CTX_set_options(c, options); 147 SSL_CTX_set_options(ctx, options);
159 SSL_CTX_set_mode(c, SSL_MODE_AUTO_RETRY); 148 SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
160 if ((s = SSL_new(c)) != NULL) { 149 if ((s = SSL_new(ctx)) != NULL) {
161#ifdef SSL_set_tlsext_host_name 150#ifdef SSL_set_tlsext_host_name
162 if (host_name != NULL) 151 if (host_name != NULL)
163 SSL_set_tlsext_host_name(s, host_name); 152 SSL_set_tlsext_host_name(s, host_name);
@@ -184,9 +173,9 @@ void np_net_ssl_cleanup() {
184#endif 173#endif
185 SSL_shutdown(s); 174 SSL_shutdown(s);
186 SSL_free(s); 175 SSL_free(s);
187 if (c) { 176 if (ctx) {
188 SSL_CTX_free(c); 177 SSL_CTX_free(ctx);
189 c=NULL; 178 ctx=NULL;
190 } 179 }
191 s=NULL; 180 s=NULL;
192 } 181 }
diff --git a/plugins/t/check_curl.t b/plugins/t/check_curl.t
index eae98cc1..7a930a4e 100644
--- a/plugins/t/check_curl.t
+++ b/plugins/t/check_curl.t
@@ -205,9 +205,9 @@ SKIP: {
205 like ( $res->output, '/time_connect=[\d\.]+/', 'Extended Performance Data Output OK' ); 205 like ( $res->output, '/time_connect=[\d\.]+/', 'Extended Performance Data Output OK' );
206 like ( $res->output, '/time_ssl=[\d\.]+/', 'Extended Performance Data SSL Output OK' ); 206 like ( $res->output, '/time_ssl=[\d\.]+/', 'Extended Performance Data SSL Output OK' );
207 207
208 $res = NPTest->testCmd( "./$plugin -H www.mozilla.com -u /firefox -f curl" ); 208 $res = NPTest->testCmd( "./$plugin -H monitoring-plugins.org -u /download.html -f follow" );
209 is( $res->return_code, 0, "Redirection based on location is okay"); 209 is( $res->return_code, 0, "Redirection based on location is okay");
210 210
211 $res = NPTest->testCmd( "./$plugin -H www.mozilla.com --extended-perfdata" ); 211 $res = NPTest->testCmd( "./$plugin -H monitoring-plugins.org --extended-perfdata" );
212 like ( $res->output, '/time_connect=[\d\.]+/', 'Extended Performance Data Output OK' ); 212 like ( $res->output, '/time_connect=[\d\.]+/', 'Extended Performance Data Output OK' );
213} 213}
diff --git a/plugins/t/check_disk.t b/plugins/t/check_disk.t
index ca035ce7..9eb77ce4 100644
--- a/plugins/t/check_disk.t
+++ b/plugins/t/check_disk.t
@@ -23,11 +23,11 @@ my $mountpoint2_valid = getTestParameter( "NP_MOUNTPOINT2_VALID", "Path to anoth
23if ($mountpoint_valid eq "" or $mountpoint2_valid eq "") { 23if ($mountpoint_valid eq "" or $mountpoint2_valid eq "") {
24 plan skip_all => "Need 2 mountpoints to test"; 24 plan skip_all => "Need 2 mountpoints to test";
25} else { 25} else {
26 plan tests => 88; 26 plan tests => 94;
27} 27}
28 28
29$result = NPTest->testCmd( 29$result = NPTest->testCmd(
30 "./check_disk -w 1% -c 1% -p $mountpoint_valid -w 1% -c 1% -p $mountpoint2_valid" 30 "./check_disk -w 1% -c 1% -p $mountpoint_valid -w 1% -c 1% -p $mountpoint2_valid"
31 ); 31 );
32cmp_ok( $result->return_code, "==", 0, "Checking two mountpoints (must have at least 1% free in space and inodes)"); 32cmp_ok( $result->return_code, "==", 0, "Checking two mountpoints (must have at least 1% free in space and inodes)");
33my $c = 0; 33my $c = 0;
@@ -44,7 +44,7 @@ my @perf_data = sort(split(/ /, $result->perf_output));
44# Calculate avg_free free on mountpoint1 and mountpoint2 44# Calculate avg_free free on mountpoint1 and mountpoint2
45# because if you check in the middle, you should get different errors 45# because if you check in the middle, you should get different errors
46$_ = $result->output; 46$_ = $result->output;
47my ($free_on_mp1, $free_on_mp2) = (m/\((\d+)%.*\((\d+)%/); 47my ($free_on_mp1, $free_on_mp2) = (m/\((\d+\.\d+)%.*\((\d+\.\d+)%/);
48die "Cannot parse output: $_" unless ($free_on_mp1 && $free_on_mp2); 48die "Cannot parse output: $_" unless ($free_on_mp1 && $free_on_mp2);
49my $avg_free = ceil(($free_on_mp1+$free_on_mp2)/2); 49my $avg_free = ceil(($free_on_mp1+$free_on_mp2)/2);
50my ($more_free, $less_free); 50my ($more_free, $less_free);
@@ -103,8 +103,8 @@ is ($crit_percth_data, int((1-10/100)*$total_percth_data), "Wrong critical in pe
103 103
104 104
105# Check when order of mount points are reversed, that perf data remains same 105# Check when order of mount points are reversed, that perf data remains same
106$result = NPTest->testCmd( 106$result = NPTest->testCmd(
107 "./check_disk -w 1% -c 1% -p $mountpoint2_valid -w 1% -c 1% -p $mountpoint_valid" 107 "./check_disk -w 1% -c 1% -p $mountpoint2_valid -w 1% -c 1% -p $mountpoint_valid"
108 ); 108 );
109@_ = sort(split(/ /, $result->perf_output)); 109@_ = sort(split(/ /, $result->perf_output));
110is_deeply( \@perf_data, \@_, "perf data for both filesystems same when reversed"); 110is_deeply( \@perf_data, \@_, "perf data for both filesystems same when reversed");
@@ -119,8 +119,12 @@ like ( $result->only_output, qr/$more_free/, "Have disk name in text");
119 119
120$result = NPTest->testCmd( "./check_disk -w 1 -c 1 -p $more_free -p $less_free" ); 120$result = NPTest->testCmd( "./check_disk -w 1 -c 1 -p $more_free -p $less_free" );
121cmp_ok( $result->return_code, '==', 0, "At least 1 MB available on $more_free and $less_free"); 121cmp_ok( $result->return_code, '==', 0, "At least 1 MB available on $more_free and $less_free");
122
122$_ = $result->output; 123$_ = $result->output;
124
123my ($free_mb_on_mp1, $free_mb_on_mp2) = (m/(\d+)MiB .* (\d+)MiB /g); 125my ($free_mb_on_mp1, $free_mb_on_mp2) = (m/(\d+)MiB .* (\d+)MiB /g);
126die "Cannot parse output: $_" unless ($free_mb_on_mp1 && $free_mb_on_mp2);
127
124my $free_mb_on_all = $free_mb_on_mp1 + $free_mb_on_mp2; 128my $free_mb_on_all = $free_mb_on_mp1 + $free_mb_on_mp2;
125 129
126 130
@@ -134,8 +138,8 @@ cmp_ok( $result->return_code, '==', 0, "Old syntax okay" );
134$result = NPTest->testCmd( "./check_disk -w 1% -c 1% -p $more_free" ); 138$result = NPTest->testCmd( "./check_disk -w 1% -c 1% -p $more_free" );
135cmp_ok( $result->return_code, "==", 0, "At least 1% free" ); 139cmp_ok( $result->return_code, "==", 0, "At least 1% free" );
136 140
137$result = NPTest->testCmd( 141$result = NPTest->testCmd(
138 "./check_disk -w 1% -c 1% -p $more_free -w 100% -c 100% -p $less_free" 142 "./check_disk -w 1% -c 1% -p $more_free -w 100% -c 100% -p $less_free"
139 ); 143 );
140cmp_ok( $result->return_code, "==", 2, "Get critical on less_free mountpoint $less_free" ); 144cmp_ok( $result->return_code, "==", 2, "Get critical on less_free mountpoint $less_free" );
141like( $result->output, $failureOutput, "Right output" ); 145like( $result->output, $failureOutput, "Right output" );
@@ -151,14 +155,14 @@ $result = NPTest->testCmd(
151 ); 155 );
152cmp_ok( $result->return_code, '==', 0, "Get ok on more_free mountpoint, when checking avg_free"); 156cmp_ok( $result->return_code, '==', 0, "Get ok on more_free mountpoint, when checking avg_free");
153 157
154$result = NPTest->testCmd( 158$result = NPTest->testCmd(
155 "./check_disk -w $avg_free% -c 0% -p $less_free -w $avg_free% -c $avg_free% -p $more_free" 159 "./check_disk -w $avg_free% -c 0% -p $less_free -w $avg_free% -c $avg_free% -p $more_free"
156 ); 160 );
157cmp_ok( $result->return_code, "==", 1, "Combining above two tests, get warning"); 161cmp_ok( $result->return_code, "==", 1, "Combining above two tests, get warning");
158my $all_disks = $result->output; 162my $all_disks = $result->output;
159 163
160$result = NPTest->testCmd( 164$result = NPTest->testCmd(
161 "./check_disk -e -w $avg_free% -c 0% -p $less_free -w $avg_free% -c $avg_free% -p $more_free" 165 "./check_disk -e -w $avg_free% -c 0% -p $less_free -w $avg_free% -c $avg_free% -p $more_free"
162 ); 166 );
163isnt( $result->output, $all_disks, "-e gives different output"); 167isnt( $result->output, $all_disks, "-e gives different output");
164 168
@@ -240,7 +244,7 @@ TODO: {
240 cmp_ok( $result->return_code, '==', 3, "Invalid command line options" ); 244 cmp_ok( $result->return_code, '==', 3, "Invalid command line options" );
241} 245}
242 246
243$result = NPTest->testCmd( 247$result = NPTest->testCmd(
244 "./check_disk -p $mountpoint_valid -w 10% -c 15%" 248 "./check_disk -p $mountpoint_valid -w 10% -c 15%"
245 ); 249 );
246cmp_ok( $result->return_code, "==", 3, "Invalid options: -p must come after thresholds" ); 250cmp_ok( $result->return_code, "==", 3, "Invalid options: -p must come after thresholds" );
@@ -311,8 +315,8 @@ $result = NPTest->testCmd( "./check_disk -w 0% -c 0% -C -w 0% -c 0% -p $mountpoi
311like( $result->output, '/;.*;\|/', "-C selects partitions if -p is not given"); 315like( $result->output, '/;.*;\|/', "-C selects partitions if -p is not given");
312 316
313# grouping: exit crit if the sum of free megs on mp1+mp2 is less than warn/crit 317# grouping: exit crit if the sum of free megs on mp1+mp2 is less than warn/crit
314$result = NPTest->testCmd( "./check_disk -w ". ($free_mb_on_all + 1) ." -c ". ($free_mb_on_all + 1) ."-g group -p $mountpoint_valid -p $mountpoint2_valid" ); 318$result = NPTest->testCmd( "./check_disk -w ". ($free_mb_on_all + 1) ." -c ". ($free_mb_on_all + 1) ." -g group -p $mountpoint_valid -p $mountpoint2_valid" );
315cmp_ok( $result->return_code, '==', 2, "grouping: exit crit if the sum of free megs on mp1+mp2 is less than warn/crit"); 319cmp_ok( $result->return_code, '==', 2, "grouping: exit crit if the sum of free megs on mp1+mp2 is less than warn/crit\nInstead received: " . $result->output);
316 320
317# grouping: exit warning if the sum of free megs on mp1+mp2 is between -w and -c 321# grouping: exit warning if the sum of free megs on mp1+mp2 is between -w and -c
318$result = NPTest->testCmd( "./check_disk -w ". ($free_mb_on_all + 1) ." -c ". ($free_mb_on_all - 1) ." -g group -p $mountpoint_valid -p $mountpoint2_valid" ); 322$result = NPTest->testCmd( "./check_disk -w ". ($free_mb_on_all + 1) ." -c ". ($free_mb_on_all - 1) ." -g group -p $mountpoint_valid -p $mountpoint2_valid" );
@@ -322,7 +326,7 @@ cmp_ok( $result->return_code, '==', 1, "grouping: exit warning if the sum of fre
322$result = NPTest->testCmd( "./check_disk -w ". ($free_mb_on_all - 1) ." -c ". ($free_mb_on_all - 1) ." -g group -p $mountpoint_valid -p $mountpoint2_valid" ); 326$result = NPTest->testCmd( "./check_disk -w ". ($free_mb_on_all - 1) ." -c ". ($free_mb_on_all - 1) ." -g group -p $mountpoint_valid -p $mountpoint2_valid" );
323cmp_ok( $result->return_code, '==', 0, "grouping: exit ok if the sum of free megs on mp1+mp2 is more than warn/crit"); 327cmp_ok( $result->return_code, '==', 0, "grouping: exit ok if the sum of free megs on mp1+mp2 is more than warn/crit");
324 328
325# grouping: exit unknown if group name is given after -p 329# grouping: exit unknown if group name is given after -p
326$result = NPTest->testCmd( "./check_disk -w ". ($free_mb_on_all - 1) ." -c ". ($free_mb_on_all - 1) ." -p $mountpoint_valid -g group -p $mountpoint2_valid" ); 330$result = NPTest->testCmd( "./check_disk -w ". ($free_mb_on_all - 1) ." -c ". ($free_mb_on_all - 1) ." -p $mountpoint_valid -g group -p $mountpoint2_valid" );
327cmp_ok( $result->return_code, '==', 3, "Invalid options: -p must come after groupname"); 331cmp_ok( $result->return_code, '==', 3, "Invalid options: -p must come after groupname");
328 332
@@ -355,17 +359,17 @@ like( $result->output, qr/$mountpoint2_valid/,"ignore: output data does have $mo
355# ignore-missing: exit okay, when fs is not accessible 359# ignore-missing: exit okay, when fs is not accessible
356$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p /bob"); 360$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p /bob");
357cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for not existing filesystem /bob"); 361cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for not existing filesystem /bob");
358like( $result->output, '/^DISK OK - No disks were found for provided parameters; - ignored paths: /bob;.*$/', 'Output OK'); 362like( $result->output, '/^DISK OK - No disks were found for provided parameters - ignored paths: /bob;.*$/', 'Output OK');
359 363
360# ignore-missing: exit okay, when regex does not match 364# ignore-missing: exit okay, when regex does not match
361$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r /bob"); 365$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r /bob");
362cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching"); 366cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching");
363like( $result->output, '/^DISK OK - No disks were found for provided parameters;.*$/', 'Output OK'); 367like( $result->output, '/^DISK OK - No disks were found for provided parameters.*$/', 'Output OK');
364 368
365# ignore-missing: exit okay, when fs with exact match (-E) is not found 369# ignore-missing: exit okay, when fs with exact match (-E) is not found
366$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -E -p /etc"); 370$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -E -p /etc");
367cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay when exact match does not find fs"); 371cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay when exact match does not find fs");
368like( $result->output, '/^DISK OK - No disks were found for provided parameters; - ignored paths: /etc;.*$/', 'Output OK'); 372like( $result->output, '/^DISK OK - No disks were found for provided parameters - ignored paths: /etc;.*$/', 'Output OK');
369 373
370# ignore-missing: exit okay, when checking one existing fs and one non-existing fs (regex) 374# ignore-missing: exit okay, when checking one existing fs and one non-existing fs (regex)
371$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r '/bob' -r '^/\$'"); 375$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r '/bob' -r '^/\$'");
@@ -375,4 +379,19 @@ like( $result->output, '/^DISK OK - free space: \/ .*$/', 'Output OK');
375# ignore-missing: exit okay, when checking one existing fs and one non-existing fs (path) 379# ignore-missing: exit okay, when checking one existing fs and one non-existing fs (path)
376$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p '/bob' -p '/'"); 380$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p '/bob' -p '/'");
377cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching"); 381cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching");
378like( $result->output, '/^DISK OK - free space: / .*; - ignored paths: /bob;.*$/', 'Output OK'); \ No newline at end of file 382like( $result->output, '/^DISK OK - free space: / .*; - ignored paths: /bob;.*$/', 'Output OK');
383
384# ignore-missing: exit okay, when checking one non-existing fs (path) and one ignored
385$result = NPTest->testCmd( "./check_disk -n -w 0% -c 0% -r /dummy -i /dummy2");
386cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching");
387like( $result->output, '/^DISK OK - No disks were found for provided parameters\|$/', 'Output OK');
388
389# ignore-missing: exit okay, when regex match does not find anything
390$result = NPTest->testCmd( "./check_disk -n -e -l -w 10% -c 5% -W 10% -K 5% -r /dummy");
391cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching");
392like( $result->output, '/^DISK OK\|$/', 'Output OK');
393
394# ignore-missing: exit okay, when regex match does not find anything
395$result = NPTest->testCmd( "./check_disk -n -l -w 10% -c 5% -W 10% -K 5% -r /dummy");
396cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching");
397like( $result->output, '/^DISK OK - No disks were found for provided parameters\|$/', 'Output OK');
diff --git a/plugins/t/check_http.t b/plugins/t/check_http.t
index 1f2fbdfd..6ab4a5b6 100644
--- a/plugins/t/check_http.t
+++ b/plugins/t/check_http.t
@@ -166,10 +166,10 @@ SKIP: {
166 like ( $res->output, '/time_connect=[\d\.]+/', 'Extended Performance Data Output OK' ); 166 like ( $res->output, '/time_connect=[\d\.]+/', 'Extended Performance Data Output OK' );
167 like ( $res->output, '/time_ssl=[\d\.]+/', 'Extended Performance Data SSL Output OK' ); 167 like ( $res->output, '/time_ssl=[\d\.]+/', 'Extended Performance Data SSL Output OK' );
168 168
169 $res = NPTest->testCmd( "./$plugin -H www.mozilla.com -u /firefox -f follow" ); 169 $res = NPTest->testCmd( "./$plugin -H monitoring-plugins.org -u /download.html -f follow" );
170 is( $res->return_code, 0, "Redirection based on location is okay"); 170 is( $res->return_code, 0, "Redirection based on location is okay");
171 171
172 $res = NPTest->testCmd( "./$plugin -H www.mozilla.com --extended-perfdata" ); 172 $res = NPTest->testCmd( "./$plugin -H monitoring-plugins.org --extended-perfdata" );
173 like ( $res->output, '/time_connect=[\d\.]+/', 'Extended Performance Data Output OK' ); 173 like ( $res->output, '/time_connect=[\d\.]+/', 'Extended Performance Data Output OK' );
174} 174}
175 175
diff --git a/plugins/t/check_imap.t b/plugins/t/check_imap.t
index 7c74e564..cf2f81c8 100644
--- a/plugins/t/check_imap.t
+++ b/plugins/t/check_imap.t
@@ -25,7 +25,7 @@ $t = NPTest->testCmd( "./check_imap $host_tcp_imap -p 143 -wt 9 -ct 9 -to 10 -e
25cmp_ok( $t->return_code, '==', 0, "Check old parameter options" ); 25cmp_ok( $t->return_code, '==', 0, "Check old parameter options" );
26 26
27$t = NPTest->testCmd( "./check_imap $host_nonresponsive" ); 27$t = NPTest->testCmd( "./check_imap $host_nonresponsive" );
28cmp_ok( $t->return_code, '==', 2, "Get error with non reponsive host" ); 28cmp_ok( $t->return_code, '==', 2, "Get error with non responsive host" );
29 29
30$t = NPTest->testCmd( "./check_imap $hostname_invalid" ); 30$t = NPTest->testCmd( "./check_imap $hostname_invalid" );
31cmp_ok( $t->return_code, '==', 2, "Invalid hostname" ); 31cmp_ok( $t->return_code, '==', 2, "Invalid hostname" );
diff --git a/plugins/t/check_ssh.t b/plugins/t/check_ssh.t
index a5cd23ce..907d33a8 100644
--- a/plugins/t/check_ssh.t
+++ b/plugins/t/check_ssh.t
@@ -8,34 +8,116 @@ use strict;
8use Test::More; 8use Test::More;
9use NPTest; 9use NPTest;
10 10
11my $res;
12
11# Required parameters 13# Required parameters
12my $ssh_host = getTestParameter("NP_SSH_HOST", "A host providing SSH service", "localhost"); 14my $ssh_host = getTestParameter("NP_SSH_HOST",
13my $host_nonresponsive = getTestParameter("NP_HOST_NONRESPONSIVE", "The hostname of system not responsive to network requests", "10.0.0.1" ); 15 "A host providing SSH service",
14my $hostname_invalid = getTestParameter("NP_HOSTNAME_INVALID", "An invalid (not known to DNS) hostname", "nosuchhost" ); 16 "localhost");
17
18my $host_nonresponsive = getTestParameter("NP_HOST_NONRESPONSIVE",
19 "The hostname of system not responsive to network requests",
20 "10.0.0.1" );
21
22my $hostname_invalid = getTestParameter("NP_HOSTNAME_INVALID",
23 "An invalid (not known to DNS) hostname",
24 "nosuchhost" );
25
26
27plan tests => 14 + 6;
28
29SKIP: {
30 skip "SSH_HOST must be defined", 6 unless $ssh_host;
31 my $result = NPTest->testCmd(
32 "./check_ssh -H $ssh_host"
33 );
34 cmp_ok($result->return_code, '==', 0, "Exit with return code 0 (OK)");
35 like($result->output, '/^SSH OK - /', "Status text if command returned none (OK)");
36
37
38 $result = NPTest->testCmd(
39 "./check_ssh -H $host_nonresponsive -t 2"
40 );
41 cmp_ok($result->return_code, '==', 2, "Exit with return code 0 (OK)");
42 like($result->output, '/^CRITICAL - Socket timeout after 2 seconds/', "Status text if command returned none (OK)");
43
44
45
46 $result = NPTest->testCmd(
47 "./check_ssh -H $hostname_invalid -t 2"
48 );
49 cmp_ok($result->return_code, '==', 3, "Exit with return code 0 (OK)");
50 like($result->output, '/^check_ssh: Invalid hostname/', "Status text if command returned none (OK)");
51
15 52
53}
54SKIP: {
16 55
17plan skip_all => "SSH_HOST must be defined" unless $ssh_host; 56 skip "No netcat available", 14 unless (system("which nc > /dev/null") == 0);
18plan tests => 6;
19 57
58 # netcat on linux (on debian) will just keep the socket open if not advised otherwise
59 # therefore we add -q to close it after two seconds after receiving the EOF from input
60 my $nc_flags = "-l 5003 -N";
61 #A valid protocol version control string has the form
62 # SSH-protoversion-softwareversion SP comments CR LF
63 #
64 # where `comments` is optional, protoversion is the SSH protocol version and
65 # softwareversion is an arbitrary string representing the server software version
66 open(NC, "echo 'SSH-2.0-nagiosplug.ssh.0.1' | nc ${nc_flags}|");
67 sleep 0.1;
68 $res = NPTest->testCmd( "./check_ssh -H localhost -p 5003" );
69 cmp_ok( $res->return_code, '==', 0, "Got SSH protocol version control string");
70 like( $res->output, '/^SSH OK - nagiosplug.ssh.0.1 \(protocol 2.0\)/', "Output OK");
71 close NC;
20 72
21my $result = NPTest->testCmd( 73 open(NC, "echo 'SSH-2.0-3.2.9.1' | nc ${nc_flags}|");
22 "./check_ssh -H $ssh_host" 74 sleep 0.1;
23 ); 75 $res = NPTest->testCmd( "./check_ssh -H localhost -p 5003" );
24cmp_ok($result->return_code, '==', 0, "Exit with return code 0 (OK)"); 76 cmp_ok( $res->return_code, "==", 0, "Got SSH protocol version control string with non-alpha softwareversion string");
25like($result->output, '/^SSH OK - /', "Status text if command returned none (OK)"); 77 like( $res->output, '/^SSH OK - 3.2.9.1 \(protocol 2.0\)/', "Output OK for non-alpha softwareversion string");
78 close NC;
26 79
80 open(NC, "echo 'SSH-2.0-nagiosplug.ssh.0.1 this is a comment' | nc ${nc_flags} |");
81 sleep 0.1;
82 $res = NPTest->testCmd( "./check_ssh -H localhost -p 5003 -r nagiosplug.ssh.0.1" );
83 cmp_ok( $res->return_code, '==', 0, "Got SSH protocol version control string, and parsed comment appropriately");
84 like( $res->output, '/^SSH OK - nagiosplug.ssh.0.1 \(protocol 2.0\)/', "Output OK");
85 close NC;
27 86
28$result = NPTest->testCmd( 87 open(NC, "echo 'SSH-' | nc ${nc_flags}|");
29 "./check_ssh -H $host_nonresponsive -t 2" 88 sleep 0.1;
30 ); 89 $res = NPTest->testCmd( "./check_ssh -H localhost -p 5003" );
31cmp_ok($result->return_code, '==', 2, "Exit with return code 0 (OK)"); 90 cmp_ok( $res->return_code, '==', 2, "Got invalid SSH protocol version control string");
32like($result->output, '/^CRITICAL - Socket timeout after 2 seconds/', "Status text if command returned none (OK)"); 91 like( $res->output, '/^SSH CRITICAL/', "Output OK");
92 close NC;
33 93
94 open(NC, "echo '' | nc ${nc_flags}|");
95 sleep 0.1;
96 $res = NPTest->testCmd( "./check_ssh -H localhost -p 5003" );
97 cmp_ok( $res->return_code, '==', 2, "No version control string received");
98 like( $res->output, '/^SSH CRITICAL - No version control string received/', "Output OK");
99 close NC;
34 100
101 open(NC, "echo 'Not a version control string' | nc ${nc_flags}|");
102 sleep 0.1;
103 $res = NPTest->testCmd( "./check_ssh -H localhost -p 5003" );
104 cmp_ok( $res->return_code, '==', 2, "No version control string received");
105 like( $res->output, '/^SSH CRITICAL - No version control string received/', "Output OK");
106 close NC;
35 107
36$result = NPTest->testCmd(
37 "./check_ssh -H $hostname_invalid -t 2"
38 );
39cmp_ok($result->return_code, '==', 3, "Exit with return code 0 (OK)");
40like($result->output, '/^check_ssh: Invalid hostname/', "Status text if command returned none (OK)");
41 108
109 #RFC 4253 permits servers to send any number of data lines prior to sending the protocol version control string
110 open(NC, "{ echo 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'; sleep 0.5;
111 echo 'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB'; sleep 0.5;
112 echo 'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC'; sleep 0.2;
113 echo 'DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD'; sleep 0.3;
114 printf 'EEEEEEEEEEEEEEEEEE'; sleep 0.2;
115 printf 'EEEEEEEEEEEEEEEEEE\n'; sleep 0.2;
116 echo 'Some\nPrepended\nData\nLines\n'; sleep 0.2;
117 echo 'SSH-2.0-nagiosplug.ssh.0.2';} | nc ${nc_flags}|");
118 sleep 0.1;
119 $res = NPTest->testCmd( "./check_ssh -H localhost -p 5003" );
120 cmp_ok( $res->return_code, '==', 0, "Got delayed SSH protocol version control string");
121 like( $res->output, '/^SSH OK - nagiosplug.ssh.0.2 \(protocol 2.0\)/', "Output OK");
122 close NC;
123}
diff --git a/plugins/t/check_swap.t b/plugins/t/check_swap.t
index de9e0f05..18780386 100644
--- a/plugins/t/check_swap.t
+++ b/plugins/t/check_swap.t
@@ -5,7 +5,7 @@
5# 5#
6 6
7use strict; 7use strict;
8use Test::More tests => 8; 8use Test::More tests => 14;
9use NPTest; 9use NPTest;
10 10
11my $successOutput = '/^SWAP OK - [0-9]+\% free \([0-9]+MB out of [0-9]+MB\)/'; 11my $successOutput = '/^SWAP OK - [0-9]+\% free \([0-9]+MB out of [0-9]+MB\)/';
@@ -14,6 +14,10 @@ my $warnOutput = '/^SWAP WARNING - [0-9]+\% free \([0-9]+MB out of [0-9]+MB\)
14 14
15my $result; 15my $result;
16 16
17$result = NPTest->testCmd( "./check_swap" ); # Always OK
18cmp_ok( $result->return_code, "==", 0, "Always OK" );
19like( $result->output, $successOutput, "Right output" );
20
17$result = NPTest->testCmd( "./check_swap -w 1048576 -c 1048576" ); # 1 MB free 21$result = NPTest->testCmd( "./check_swap -w 1048576 -c 1048576" ); # 1 MB free
18cmp_ok( $result->return_code, "==", 0, "At least 1MB free" ); 22cmp_ok( $result->return_code, "==", 0, "At least 1MB free" );
19like( $result->output, $successOutput, "Right output" ); 23like( $result->output, $successOutput, "Right output" );
@@ -29,3 +33,11 @@ like( $result->output, $failureOutput, "Right output" );
29$result = NPTest->testCmd( "./check_swap -w 100% -c 1%" ); # 100% (always warn) 33$result = NPTest->testCmd( "./check_swap -w 100% -c 1%" ); # 100% (always warn)
30cmp_ok( $result->return_code, "==", 1, 'Get warning because not 100% free' ); 34cmp_ok( $result->return_code, "==", 1, 'Get warning because not 100% free' );
31like( $result->output, $warnOutput, "Right output" ); 35like( $result->output, $warnOutput, "Right output" );
36
37$result = NPTest->testCmd( "./check_swap -w 100%" ); # 100% (single threshold, always warn)
38cmp_ok( $result->return_code, "==", 1, 'Get warning because not 100% free' );
39like( $result->output, $warnOutput, "Right output" );
40
41$result = NPTest->testCmd( "./check_swap -c 100%" ); # 100% (single threshold, always critical)
42cmp_ok( $result->return_code, "==", 2, 'Get critical because not 100% free' );
43like( $result->output, $failureOutput, "Right output" );
diff --git a/plugins/t/check_users.t b/plugins/t/check_users.t
index 088f3b52..21c3e53d 100644
--- a/plugins/t/check_users.t
+++ b/plugins/t/check_users.t
@@ -2,7 +2,7 @@
2# 2#
3# Logged in Users Tests via check_users 3# Logged in Users Tests via check_users
4# 4#
5# Trick: This ckeck requires at least 1 user logged in. These commands should 5# Trick: This check requires at least 1 user logged in. These commands should
6# leave a session open forever in the background: 6# leave a session open forever in the background:
7# 7#
8# $ ssh -tt localhost </dev/null >/dev/null 2>/dev/null & 8# $ ssh -tt localhost </dev/null >/dev/null 2>/dev/null &
@@ -13,10 +13,11 @@ use Test;
13use NPTest; 13use NPTest;
14 14
15use vars qw($tests); 15use vars qw($tests);
16BEGIN {$tests = 8; plan tests => $tests} 16BEGIN {$tests = 12; plan tests => $tests}
17 17
18my $successOutput = '/^USERS OK - [0-9]+ users currently logged in/'; 18my $successOutput = '/^USERS OK - [0-9]+ users currently logged in/';
19my $failureOutput = '/^USERS CRITICAL - [0-9]+ users currently logged in/'; 19my $failureOutput = '/^USERS CRITICAL - [0-9]+ users currently logged in/';
20my $wrongOptionOutput = '/Usage:/';
20 21
21my $t; 22my $t;
22 23
@@ -24,6 +25,8 @@ $t += checkCmd( "./check_users 1000 1000", 0, $successOutput );
24$t += checkCmd( "./check_users 0 0", 2, $failureOutput ); 25$t += checkCmd( "./check_users 0 0", 2, $failureOutput );
25$t += checkCmd( "./check_users -w 0:1000 -c 0:1000", 0, $successOutput ); 26$t += checkCmd( "./check_users -w 0:1000 -c 0:1000", 0, $successOutput );
26$t += checkCmd( "./check_users -w 0:0 -c 0:0", 2, $failureOutput ); 27$t += checkCmd( "./check_users -w 0:0 -c 0:0", 2, $failureOutput );
28$t += checkCmd( "./check_users -w 0:1000", 3, $wrongOptionOutput);
29$t += checkCmd( "./check_users", 3, $wrongOptionOutput);
27 30
28exit(0) if defined($Test::Harness::VERSION); 31exit(0) if defined($Test::Harness::VERSION);
29exit($tests - $t); 32exit($tests - $t);
diff --git a/plugins/tests/check_curl.t b/plugins/tests/check_curl.t
index 72f2b7c2..eaa9f518 100755
--- a/plugins/tests/check_curl.t
+++ b/plugins/tests/check_curl.t
@@ -9,7 +9,7 @@
9# Country Name (2 letter code) [AU]:DE 9# Country Name (2 letter code) [AU]:DE
10# State or Province Name (full name) [Some-State]:Bavaria 10# State or Province Name (full name) [Some-State]:Bavaria
11# Locality Name (eg, city) []:Munich 11# Locality Name (eg, city) []:Munich
12# Organization Name (eg, company) [Internet Widgits Pty Ltd]:Monitoring Plugins 12# Organization Name (eg, company) [Internet Widgets Pty Ltd]:Monitoring Plugins
13# Organizational Unit Name (eg, section) []: 13# Organizational Unit Name (eg, section) []:
14# Common Name (e.g. server FQDN or YOUR name) []:Monitoring Plugins 14# Common Name (e.g. server FQDN or YOUR name) []:Monitoring Plugins
15# Email Address []:devel@monitoring-plugins.org 15# Email Address []:devel@monitoring-plugins.org
@@ -21,7 +21,7 @@ use FindBin qw($Bin);
21 21
22$ENV{'LC_TIME'} = "C"; 22$ENV{'LC_TIME'} = "C";
23 23
24my $common_tests = 73; 24my $common_tests = 75;
25my $ssl_only_tests = 8; 25my $ssl_only_tests = 8;
26# Check that all dependent modules are available 26# Check that all dependent modules are available
27eval "use HTTP::Daemon 6.01;"; 27eval "use HTTP::Daemon 6.01;";
@@ -178,6 +178,11 @@ sub run_server {
178 $c->send_basic_header; 178 $c->send_basic_header;
179 $c->send_crlf; 179 $c->send_crlf;
180 $c->send_response(HTTP::Response->new( 200, 'OK', undef, 'redirected' )); 180 $c->send_response(HTTP::Response->new( 200, 'OK', undef, 'redirected' ));
181 } elsif ($r->url->path eq "/redirect_rel") {
182 $c->send_basic_header(302);
183 $c->send_header("Location", "/redirect2" );
184 $c->send_crlf;
185 $c->send_response('moved to /redirect2');
181 } elsif ($r->url->path eq "/redir_timeout") { 186 } elsif ($r->url->path eq "/redir_timeout") {
182 $c->send_redirect( "/timeout" ); 187 $c->send_redirect( "/timeout" );
183 } elsif ($r->url->path eq "/timeout") { 188 } elsif ($r->url->path eq "/timeout") {
@@ -471,9 +476,12 @@ sub run_common_tests {
471 is( $result->return_code, 0, $cmd); 476 is( $result->return_code, 0, $cmd);
472 like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output ); 477 like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
473 478
474 # These tests may block 479 $cmd = "$command -f follow -u /redirect_rel -s redirected";
475 print "ALRM\n"; 480 $result = NPTest->testCmd( $cmd );
481 is( $result->return_code, 0, $cmd);
482 like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
476 483
484 # These tests may block
477 # stickyport - on full urlS port is set back to 80 otherwise 485 # stickyport - on full urlS port is set back to 80 otherwise
478 $cmd = "$command -f stickyport -u /redir_external -t 5 -s redirected"; 486 $cmd = "$command -f stickyport -u /redir_external -t 5 -s redirected";
479 eval { 487 eval {
diff --git a/plugins/tests/check_http.t b/plugins/tests/check_http.t
index 6078b274..6eaf85b2 100755
--- a/plugins/tests/check_http.t
+++ b/plugins/tests/check_http.t
@@ -13,7 +13,7 @@ use IO::Socket::INET;
13 13
14$ENV{'LC_TIME'} = "C"; 14$ENV{'LC_TIME'} = "C";
15 15
16my $common_tests = 71; 16my $common_tests = 73;
17my $virtual_port_tests = 8; 17my $virtual_port_tests = 8;
18my $ssl_only_tests = 12; 18my $ssl_only_tests = 12;
19my $chunked_encoding_special_tests = 1; 19my $chunked_encoding_special_tests = 1;
@@ -199,6 +199,11 @@ sub run_server {
199 $c->send_basic_header; 199 $c->send_basic_header;
200 $c->send_crlf; 200 $c->send_crlf;
201 $c->send_response(HTTP::Response->new( 200, 'OK', undef, 'redirected' )); 201 $c->send_response(HTTP::Response->new( 200, 'OK', undef, 'redirected' ));
202 } elsif ($r->url->path eq "/redirect_rel") {
203 $c->send_basic_header(302);
204 $c->send_header("Location", "/redirect2" );
205 $c->send_crlf;
206 $c->send_response('moved to /redirect2');
202 } elsif ($r->url->path eq "/redir_timeout") { 207 } elsif ($r->url->path eq "/redir_timeout") {
203 $c->send_redirect( "/timeout" ); 208 $c->send_redirect( "/timeout" );
204 } elsif ($r->url->path eq "/timeout") { 209 } elsif ($r->url->path eq "/timeout") {
@@ -515,6 +520,11 @@ sub run_common_tests {
515 is( $result->return_code, 0, $cmd); 520 is( $result->return_code, 0, $cmd);
516 like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output ); 521 like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
517 522
523 $cmd = "$command -f follow -u /redirect_rel -s redirected";
524 $result = NPTest->testCmd( $cmd );
525 is( $result->return_code, 0, $cmd);
526 like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
527
518 # These tests may block 528 # These tests may block
519 print "ALRM\n"; 529 print "ALRM\n";
520 530
diff --git a/plugins/utils.c b/plugins/utils.c
index b4214c61..77d6a6f9 100644
--- a/plugins/utils.c
+++ b/plugins/utils.c
@@ -23,13 +23,15 @@
23*****************************************************************************/ 23*****************************************************************************/
24 24
25#include "common.h" 25#include "common.h"
26#include "utils.h" 26#include "./utils.h"
27#include "utils_base.h" 27#include "utils_base.h"
28#include <stdarg.h> 28#include <stdarg.h>
29#include <limits.h> 29#include <limits.h>
30#include <string.h> 30#include <string.h>
31#include <errno.h> 31#include <errno.h>
32 32
33#include <stdbool.h>
34
33#include <arpa/inet.h> 35#include <arpa/inet.h>
34 36
35extern void print_usage (void); 37extern void print_usage (void);
@@ -147,98 +149,107 @@ print_revision (const char *command_name, const char *revision)
147 command_name, revision, PACKAGE, VERSION); 149 command_name, revision, PACKAGE, VERSION);
148} 150}
149 151
150int 152bool is_numeric (char *number) {
151is_numeric (char *number)
152{
153 char tmp[1]; 153 char tmp[1];
154 float x; 154 float x;
155 155
156 if (!number) 156 if (!number)
157 return FALSE; 157 return false;
158 else if (sscanf (number, "%f%c", &x, tmp) == 1) 158 else if (sscanf (number, "%f%c", &x, tmp) == 1)
159 return TRUE; 159 return true;
160 else 160 else
161 return FALSE; 161 return false;
162} 162}
163 163
164int 164bool is_positive (char *number) {
165is_positive (char *number)
166{
167 if (is_numeric (number) && atof (number) > 0.0) 165 if (is_numeric (number) && atof (number) > 0.0)
168 return TRUE; 166 return true;
169 else 167 else
170 return FALSE; 168 return false;
171} 169}
172 170
173int 171bool is_negative (char *number) {
174is_negative (char *number)
175{
176 if (is_numeric (number) && atof (number) < 0.0) 172 if (is_numeric (number) && atof (number) < 0.0)
177 return TRUE; 173 return true;
178 else 174 else
179 return FALSE; 175 return false;
180} 176}
181 177
182int 178bool is_nonnegative (char *number) {
183is_nonnegative (char *number)
184{
185 if (is_numeric (number) && atof (number) >= 0.0) 179 if (is_numeric (number) && atof (number) >= 0.0)
186 return TRUE; 180 return true;
187 else 181 else
188 return FALSE; 182 return false;
189} 183}
190 184
191int 185bool is_percentage (char *number) {
192is_percentage (char *number)
193{
194 int x; 186 int x;
195 if (is_numeric (number) && (x = atof (number)) >= 0 && x <= 100) 187 if (is_numeric (number) && (x = atof (number)) >= 0 && x <= 100)
196 return TRUE; 188 return true;
197 else 189 else
198 return FALSE; 190 return false;
199} 191}
200 192
201int 193bool is_percentage_expression (const char str[]) {
202is_integer (char *number) 194 if (!str) {
203{ 195 return false;
196 }
197
198 size_t len = strlen(str);
199
200 if (str[len-1] != '%') {
201 return false;
202 }
203
204 char *foo = calloc(sizeof(char), len + 1);
205
206 if (!foo) {
207 die (STATE_UNKNOWN, _("calloc failed \n"));
208 }
209
210 strcpy(foo, str);
211 foo[len-1] = '\0';
212
213 bool result = is_numeric(foo);
214
215 free(foo);
216
217 return result;
218}
219
220bool is_integer (char *number) {
204 long int n; 221 long int n;
205 222
206 if (!number || (strspn (number, "-0123456789 ") != strlen (number))) 223 if (!number || (strspn (number, "-0123456789 ") != strlen (number)))
207 return FALSE; 224 return false;
208 225
209 n = strtol (number, NULL, 10); 226 n = strtol (number, NULL, 10);
210 227
211 if (errno != ERANGE && n >= INT_MIN && n <= INT_MAX) 228 if (errno != ERANGE && n >= INT_MIN && n <= INT_MAX)
212 return TRUE; 229 return true;
213 else 230 else
214 return FALSE; 231 return false;
215} 232}
216 233
217int 234bool is_intpos (char *number) {
218is_intpos (char *number)
219{
220 if (is_integer (number) && atoi (number) > 0) 235 if (is_integer (number) && atoi (number) > 0)
221 return TRUE; 236 return true;
222 else 237 else
223 return FALSE; 238 return false;
224} 239}
225 240
226int 241bool is_intneg (char *number) {
227is_intneg (char *number)
228{
229 if (is_integer (number) && atoi (number) < 0) 242 if (is_integer (number) && atoi (number) < 0)
230 return TRUE; 243 return true;
231 else 244 else
232 return FALSE; 245 return false;
233} 246}
234 247
235int 248bool is_intnonneg (char *number) {
236is_intnonneg (char *number)
237{
238 if (is_integer (number) && atoi (number) >= 0) 249 if (is_integer (number) && atoi (number) >= 0)
239 return TRUE; 250 return true;
240 else 251 else
241 return FALSE; 252 return false;
242} 253}
243 254
244/* 255/*
@@ -246,19 +257,27 @@ is_intnonneg (char *number)
246 * On success the number will be written to the _target_ address, if _target_ is not set 257 * On success the number will be written to the _target_ address, if _target_ is not set
247 * to NULL. 258 * to NULL.
248 */ 259 */
249int is_int64(char *number, int64_t *target) { 260bool is_int64(char *number, int64_t *target) {
250 errno = 0; 261 errno = 0;
251 uint64_t tmp = strtoll(number, NULL, 10); 262 char *endptr = { 0 };
263
264 int64_t tmp = strtoll(number, &endptr, 10);
252 if (errno != 0) { 265 if (errno != 0) {
266 return false;
267 }
268
269 if (*endptr == '\0') {
253 return 0; 270 return 0;
254 } 271 }
272
255 if (tmp < INT64_MIN || tmp > INT64_MAX) { 273 if (tmp < INT64_MIN || tmp > INT64_MAX) {
256 return 0; 274 return false;
257 } 275 }
276
258 if (target != NULL) { 277 if (target != NULL) {
259 *target = tmp; 278 *target = tmp;
260 } 279 }
261 return 1; 280 return true;
262} 281}
263 282
264/* 283/*
@@ -266,40 +285,45 @@ int is_int64(char *number, int64_t *target) {
266 * On success the number will be written to the _target_ address, if _target_ is not set 285 * On success the number will be written to the _target_ address, if _target_ is not set
267 * to NULL. 286 * to NULL.
268 */ 287 */
269int is_uint64(char *number, uint64_t *target) { 288bool is_uint64(char *number, uint64_t *target) {
270 errno = 0; 289 errno = 0;
271 uint64_t tmp = strtoll(number, NULL, 10); 290 char *endptr = { 0 };
291 unsigned long long tmp = strtoull(number, &endptr, 10);
292
272 if (errno != 0) { 293 if (errno != 0) {
273 return 0; 294 return false;
274 } 295 }
275 if (tmp < 0 || tmp > UINT64_MAX) { 296
276 return 0; 297 if (*endptr != '\0') {
298 return false;
299 }
300
301 if (tmp > UINT64_MAX) {
302 return false;
277 } 303 }
304
278 if (target != NULL) { 305 if (target != NULL) {
279 *target = tmp; 306 *target = (uint64_t)tmp;
280 } 307 }
281 return 1; 308
309 return true;
282} 310}
283 311
284int 312bool is_intpercent (char *number) {
285is_intpercent (char *number)
286{
287 int i; 313 int i;
288 if (is_integer (number) && (i = atoi (number)) >= 0 && i <= 100) 314 if (is_integer (number) && (i = atoi (number)) >= 0 && i <= 100)
289 return TRUE; 315 return true;
290 else 316 else
291 return FALSE; 317 return false;
292} 318}
293 319
294int 320bool is_option (char *str) {
295is_option (char *str)
296{
297 if (!str) 321 if (!str)
298 return FALSE; 322 return false;
299 else if (strspn (str, "-") == 1 || strspn (str, "-") == 2) 323 else if (strspn (str, "-") == 1 || strspn (str, "-") == 2)
300 return TRUE; 324 return true;
301 else 325 else
302 return FALSE; 326 return false;
303} 327}
304 328
305#ifdef NEED_GETTIMEOFDAY 329#ifdef NEED_GETTIMEOFDAY
@@ -804,19 +828,3 @@ char *sperfdata_int (const char *label,
804 828
805 return data; 829 return data;
806} 830}
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 c76b3216..f939e337 100644
--- a/plugins/utils.h
+++ b/plugins/utils.h
@@ -16,6 +16,8 @@ suite of plugins. */
16/* now some functions etc are being defined in ../lib/utils_base.c */ 16/* now some functions etc are being defined in ../lib/utils_base.c */
17#include "utils_base.h" 17#include "utils_base.h"
18 18
19#include <stdbool.h>
20
19 21
20#ifdef NP_EXTRA_OPTS 22#ifdef NP_EXTRA_OPTS
21/* Include extra-opts functions if compiled in */ 23/* Include extra-opts functions if compiled in */
@@ -34,21 +36,22 @@ extern time_t start_time, end_time;
34 36
35/* Test input types */ 37/* Test input types */
36 38
37int is_integer (char *); 39bool is_integer (char *);
38int is_intpos (char *); 40bool is_intpos (char *);
39int is_intneg (char *); 41bool is_intneg (char *);
40int is_intnonneg (char *); 42bool is_intnonneg (char *);
41int is_intpercent (char *); 43bool is_intpercent (char *);
42int is_uint64(char *number, uint64_t *target); 44bool is_uint64(char *number, uint64_t *target);
43int is_int64(char *number, int64_t *target); 45bool is_int64(char *number, int64_t *target);
44 46
45int is_numeric (char *); 47bool is_numeric (char *);
46int is_positive (char *); 48bool is_positive (char *);
47int is_negative (char *); 49bool is_negative (char *);
48int is_nonnegative (char *); 50bool is_nonnegative (char *);
49int is_percentage (char *); 51bool is_percentage (char *);
52bool is_percentage_expression (const char[]);
50 53
51int is_option (char *); 54bool is_option (char *);
52 55
53/* Generalized timer that will do milliseconds if available */ 56/* Generalized timer that will do milliseconds if available */
54#ifndef HAVE_STRUCT_TIMEVAL 57#ifndef HAVE_STRUCT_TIMEVAL
@@ -106,8 +109,6 @@ char *sperfdata (const char *, double, const char *, char *, char *,
106char *sperfdata_int (const char *, int, const char *, char *, char *, 109char *sperfdata_int (const char *, int, const char *, char *, char *,
107 int, int, int, int); 110 int, int, int, int);
108 111
109int open_max (void);
110
111/* The idea here is that, although not every plugin will use all of these, 112/* 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 113 most will or should. Therefore, for consistency, these very common
113 options should have only these meanings throughout the overall suite */ 114 options should have only these meanings throughout the overall suite */