diff options
author | Holger Weiss <holger@zedat.fu-berlin.de> | 2013-09-12 21:37:20 +0200 |
---|---|---|
committer | Holger Weiss <holger@zedat.fu-berlin.de> | 2013-09-12 21:37:20 +0200 |
commit | e8044713d41f5ef1d9ce814df4a079d8f92306b0 (patch) | |
tree | e4b6f3d068c850774b9cda16f7c5830b9fc15774 /plugins/check_tcp.c | |
parent | 662997251d4fc43f4155784f9e7df827f193305e (diff) | |
download | monitoring-plugins-e8044713d41f5ef1d9ce814df4a079d8f92306b0.tar.gz |
check_tcp: Properly deal will partial recv(3)s
The np_expect_match() function now returns one of three possible states
instead of just TRUE or FALSE:
- NP_MATCH_SUCCESS
- NP_MATCH_FAILURE
- NP_MATCH_RETRY
The NP_MATCH_RETRY state indicates that matching might succeed if
np_expect_match() is called with a longer input string. This allows
check_tcp to decide whether it makes sense to wait for additional data
from the server.
Diffstat (limited to 'plugins/check_tcp.c')
-rw-r--r-- | plugins/check_tcp.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/plugins/check_tcp.c b/plugins/check_tcp.c index e8d7ec68..517b6b5d 100644 --- a/plugins/check_tcp.c +++ b/plugins/check_tcp.c @@ -3,7 +3,7 @@ * Nagios check_tcp plugin * * License: GPL -* Copyright (c) 1999-2008 Nagios Plugins Development Team +* Copyright (c) 1999-2013 Nagios Plugins Development Team * * Description: * @@ -277,25 +277,30 @@ main (int argc, char **argv) status = realloc(status, len + i + 1); memcpy(&status[len], buffer, i); len += i; + status[len] = '\0'; /* stop reading if user-forced */ if (maxbytes && len >= maxbytes) break; + + if ((match = np_expect_match(status, + server_expect, + server_expect_count, + match_flags)) != NP_MATCH_RETRY) + break; } /* no data when expected, so return critical */ if (len == 0) die (STATE_CRITICAL, _("No data received from host\n")); - /* force null-termination and strip whitespace from end of output */ - status[len--] = '\0'; /* print raw output if we're debugging */ if(flags & FLAG_VERBOSE) printf("received %d bytes from host\n#-raw-recv-------#\n%s\n#-raw-recv-------#\n", (int)len + 1, status); - while(isspace(status[len])) status[len--] = '\0'; - - match = np_expect_match(status, server_expect, server_expect_count, match_flags); + /* strip whitespace from end of output */ + while(--len > 0 && isspace(status[len])) + status[len] = '\0'; } if (server_quit != NULL) { @@ -315,7 +320,7 @@ main (int argc, char **argv) result = STATE_WARNING; /* did we get the response we hoped? */ - if(match == FALSE && result != STATE_CRITICAL) + if(match != NP_MATCH_SUCCESS && result != STATE_CRITICAL) result = expect_mismatch_state; /* reset the alarm */ @@ -326,10 +331,10 @@ main (int argc, char **argv) * the response we were looking for. if-else */ printf("%s %s - ", SERVICE, state_text(result)); - if(match == FALSE && len && !(flags & FLAG_HIDE_OUTPUT)) + if(match != NP_MATCH_SUCCESS && len && !(flags & FLAG_HIDE_OUTPUT)) printf("Unexpected response from host/socket: %s", status); else { - if(match == FALSE) + if(match != NP_MATCH_SUCCESS) printf("Unexpected response from host/socket on "); else printf("%.3f second response time on ", elapsed_time); @@ -339,13 +344,13 @@ main (int argc, char **argv) printf("socket %s", server_address); } - if (match != FALSE && !(flags & FLAG_HIDE_OUTPUT) && len) + if (match == NP_MATCH_SUCCESS && !(flags & FLAG_HIDE_OUTPUT) && len) printf (" [%s]", status); /* perf-data doesn't apply when server doesn't talk properly, * so print all zeroes on warn and crit. Use fperfdata since * localisation settings can make different outputs */ - if(match == FALSE) + if(match != NP_MATCH_SUCCESS) printf ("|%s", fperfdata ("time", elapsed_time, "s", (flags & FLAG_TIME_WARN ? TRUE : FALSE), 0, |