summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/Plugins/KerneloopsScanner.cpp15
-rw-r--r--lib/Plugins/KerneloopsScanner.h2
-rw-r--r--src/Hooks/dumpoops.cpp4
3 files changed, 16 insertions, 5 deletions
diff --git a/lib/Plugins/KerneloopsScanner.cpp b/lib/Plugins/KerneloopsScanner.cpp
index fdcc3e5..b3fe1ec 100644
--- a/lib/Plugins/KerneloopsScanner.cpp
+++ b/lib/Plugins/KerneloopsScanner.cpp
@@ -50,7 +50,7 @@ static int scan_dmesg(vector_string_t& oopsList)
/* "dumpoops" tool uses these two functions too */
extern "C" {
-int scan_syslog_file(vector_string_t& oopsList, const char *filename)
+int scan_syslog_file(vector_string_t& oopsList, const char *filename, time_t *last_changed_p)
{
VERB1 log("Scanning syslog file '%s'", filename);
@@ -59,7 +59,6 @@ int scan_syslog_file(vector_string_t& oopsList, const char *filename)
int fd;
int cnt_FoundOopses;
ssize_t sz;
-
fd = open(filename, O_RDONLY);
if (fd < 0)
return 0;
@@ -69,6 +68,15 @@ int scan_syslog_file(vector_string_t& oopsList, const char *filename)
return 0;
}
+ if (last_changed_p != NULL) {
+ if (*last_changed_p == statb.st_mtime) {
+ VERB1 log("Syslog file '%s' hasn't changed since last scan, skipping", filename);
+ close(fd);
+ return 0;
+ }
+ *last_changed_p = statb.st_mtime;
+ }
+
/*
* In theory we have a race here, since someone could spew
* to /var/log/messages before we read it in... we try to
@@ -137,6 +145,7 @@ void save_oops_to_debug_dump(const vector_string_t& oopsList)
CKerneloopsScanner::CKerneloopsScanner()
{
int cnt_FoundOopses;
+ m_syslog_last_change = 0;
/* Scan dmesg, on first call only */
vector_string_t oopsList;
@@ -155,7 +164,7 @@ void CKerneloopsScanner::Run(const char *pActionDir, const char *pArgs, int forc
}
vector_string_t oopsList;
- int cnt_FoundOopses = scan_syslog_file(oopsList, syslog_file);
+ int cnt_FoundOopses = scan_syslog_file(oopsList, syslog_file, &m_syslog_last_change);
if (cnt_FoundOopses > 0) {
save_oops_to_debug_dump(oopsList);
/*
diff --git a/lib/Plugins/KerneloopsScanner.h b/lib/Plugins/KerneloopsScanner.h
index da856e0..2bff134 100644
--- a/lib/Plugins/KerneloopsScanner.h
+++ b/lib/Plugins/KerneloopsScanner.h
@@ -33,6 +33,8 @@
class CKerneloopsScanner : public CAction
{
+ private:
+ time_t m_syslog_last_change;
public:
CKerneloopsScanner();
virtual void Run(const char *pActionDir, const char *pArgs, int force);
diff --git a/src/Hooks/dumpoops.cpp b/src/Hooks/dumpoops.cpp
index ae92619..99ecf00 100644
--- a/src/Hooks/dumpoops.cpp
+++ b/src/Hooks/dumpoops.cpp
@@ -75,7 +75,7 @@ int main(int argc, char **argv)
/* Load KerneloopsScanner plugin */
// const plugin_info_t *plugin_info;
CPlugin* (*plugin_newf)(void);
- int (*scan_syslog_file)(vector_string_t& oopsList, const char *filename);
+ int (*scan_syslog_file)(vector_string_t& oopsList, const char *filename, time_t *last_changed_p);
void (*save_oops_to_debug_dump)(const vector_string_t& oopsList);
void *handle;
@@ -96,7 +96,7 @@ int main(int argc, char **argv)
/* Use it: parse and dump the oops */
vector_string_t oopsList;
- int cnt = scan_syslog_file(oopsList, argv[0]);
+ int cnt = scan_syslog_file(oopsList, argv[0], NULL);
log("found oopses: %d", cnt);
if (cnt > 0) {