Module: check_mk
Branch: master
Commit: 2fcf191c353492095f8f718074107a7e96a00b26
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=2fcf191c353492…
Author: Andreas Boesl <ab(a)mathias-kettner.de>
Date: Wed Oct 17 18:22:11 2012 +0200
livecheck:
FIX: fixed problem with long plugin output
FIX: added /0 termination to strings
FIX: changed check_type to be always active (0)
---
ChangeLog | 5 +++++
livestatus/src/livecheck.c | 37 +++++++++++++++++++++++++++++++------
2 files changed, 36 insertions(+), 6 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 710c8ea..d63b008 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -91,6 +91,11 @@
Livestatus
* FIX: comments_with_info in service table was always empty
+
+ Livecheck
+ * FIX: fixed problem with long plugin output
+ * FIX: added /0 termination to strings
+ * FIX: changed check_type to be always active (0)
Checks & Agents:
* FIX: Linux mk_logwatch: iregex Parameter was never used
diff --git a/livestatus/src/livecheck.c b/livestatus/src/livecheck.c
index 958fbf3..ff3f369 100644
--- a/livestatus/src/livecheck.c
+++ b/livestatus/src/livecheck.c
@@ -150,7 +150,17 @@ int main(int argc, char **argv)
if (timeout)
alarm(timeout);
- int bytes_read = read(fd[0], output, sizeof(output));
+
+ int bytes_read = 0;
+ char *ptr_output = output;
+ const char *ptr_end = output + sizeof(output) - 1;
+ while ((bytes_read = read(fd[0], ptr_output, ptr_end - ptr_output)) != 0)
{
+ ptr_output += bytes_read;
+ if (ptr_output == ptr_end)
+ break;
+ }
+ *ptr_output = 0;
+
close(fd[0]);
int ret;
waitpid(pid, &ret, 0);
@@ -170,7 +180,7 @@ int main(int argc, char **argv)
}
else {
return_code = WEXITSTATUS(ret);
- if (0 == bytes_read || output[0] == '\n')
+ if (*output == 0 || *output == '\n')
snprintf(output, sizeof(output), "(No output returned from
plugin)\n");
}
}
@@ -195,16 +205,31 @@ int main(int argc, char **argv)
"start_time=%d.%03u\n"
"finish_time=%d.%03u\n"
"return_code=%d\n"
- "output=%s\n",
+ "output=",
getpid(),
- is_host_check ? 0 : 1,
+ 0,
latency,
(int)start.time,
start.millitm,
(int)end.time,
end.millitm,
- return_code,
- output);
+ return_code);
+
+ char *ptr_output = output;
+ char *ptr_walk = output;
+ while (*ptr_walk != 0) {
+ if (*ptr_walk == '\n') {
+ *ptr_walk = 0;
+ fputs(ptr_output, checkfile);
+ fputs("\\n", checkfile);
+ ptr_output = ptr_walk + 1;
+ if (*ptr_output == 0)
+ break;
+ }
+ ptr_walk++;
+ }
+ fputs("\n", checkfile);
+
fchown(fd, real_uid, real_gid);
fclose(checkfile);
strcat(template, ".ok");