summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-10-29 00:37:10 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2009-10-29 00:37:10 +0100
commitf369ec1fa4e2886ce01aeea51044d15f0407fed3 (patch)
tree5445e7adae55895bcf839cbad3a10c510692053c /lib
parent7a2a2fa7e8d613c69d0fda6c220d97936f56c4fd (diff)
downloadabrt-f369ec1fa4e2886ce01aeea51044d15f0407fed3.tar.gz
abrt-f369ec1fa4e2886ce01aeea51044d15f0407fed3.tar.xz
abrt-f369ec1fa4e2886ce01aeea51044d15f0407fed3.zip
Kerneloops: remove two classes, vector_string_t works as good
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/Plugins/Kerneloops.h3
-rw-r--r--lib/Plugins/KerneloopsScanner.cpp26
-rw-r--r--lib/Plugins/KerneloopsScanner.h2
-rw-r--r--lib/Plugins/KerneloopsSysLog.cpp45
-rw-r--r--lib/Plugins/KerneloopsSysLog.h24
5 files changed, 26 insertions, 74 deletions
diff --git a/lib/Plugins/Kerneloops.h b/lib/Plugins/Kerneloops.h
index 13fb0098..edd00d8b 100644
--- a/lib/Plugins/Kerneloops.h
+++ b/lib/Plugins/Kerneloops.h
@@ -29,11 +29,8 @@
#include "Plugin.h"
#include "Analyzer.h"
-
#include <string>
-#include "KerneloopsSysLog.h"
-
class CAnalyzerKerneloops : public CAnalyzer
{
public:
diff --git a/lib/Plugins/KerneloopsScanner.cpp b/lib/Plugins/KerneloopsScanner.cpp
index 317aeabb..14eb72a8 100644
--- a/lib/Plugins/KerneloopsScanner.cpp
+++ b/lib/Plugins/KerneloopsScanner.cpp
@@ -78,24 +78,29 @@ void CKerneloopsScanner::SaveOopsToDebugDump()
{
update_client(_("Creating kernel oops crash reports..."));
+ int countdown = 16; /* do not report hundreds of oopses */
time_t t = time(NULL);
- std::list<COops> oopsList = m_pSysLog.GetOopsList();
- m_pSysLog.ClearOopsList();
+ vector_string_t oopsList = m_pOopsList;
+ m_pOopsList.clear();
- while (!oopsList.empty()) {
+ while (!oopsList.empty() && --countdown != 0) {
char path[sizeof(DEBUG_DUMPS_DIR"/kerneloops-%lu-%lu") + 2 * sizeof(long)*3];
sprintf(path, DEBUG_DUMPS_DIR"/kerneloops-%lu-%lu",
(long)t, (long)oopsList.size());
- COops oops = oopsList.back();
+
+ std::string oops = oopsList.back();
+ const char *first_line = oops.c_str();
+ char *second_line = (char*)strchr(first_line, '\n'); /* never NULL */
+ *second_line++ = '\0';
try
{
CDebugDump debugDump;
debugDump.Create(path, 0);
debugDump.SaveText(FILENAME_ANALYZER, "Kerneloops");
debugDump.SaveText(FILENAME_EXECUTABLE, "kernel");
- debugDump.SaveText(FILENAME_KERNEL, oops.m_sVersion);
+ debugDump.SaveText(FILENAME_KERNEL, first_line);
debugDump.SaveText(FILENAME_PACKAGE, "not_applicable");
- debugDump.SaveText(FILENAME_KERNELOOPS, oops.m_sData);
+ debugDump.SaveText(FILENAME_KERNELOOPS, second_line);
}
catch (CABRTException& e)
{
@@ -116,7 +121,8 @@ int CKerneloopsScanner::ScanDmesg()
buffer = (char*)xzalloc(pagesz + 1);
syscall(__NR_syslog, 3, buffer, pagesz);
- cnt_FoundOopses = m_pSysLog.ExtractOops(buffer, strlen(buffer));
+ m_pOopsList.clear();
+ cnt_FoundOopses = extract_oopses(m_pOopsList, buffer, strlen(buffer));
free(buffer);
return cnt_FoundOopses;
@@ -160,8 +166,10 @@ int CKerneloopsScanner::ScanSysLogFile(const char *filename)
close(fd);
cnt_FoundOopses = 0;
- if (sz > 0)
- cnt_FoundOopses = m_pSysLog.ExtractOops(buffer, sz);
+ if (sz > 0) {
+ m_pOopsList.clear();
+ cnt_FoundOopses = extract_oopses(m_pOopsList, buffer, sz);
+ }
free(buffer);
return cnt_FoundOopses;
diff --git a/lib/Plugins/KerneloopsScanner.h b/lib/Plugins/KerneloopsScanner.h
index 512fb9c8..caa5f72d 100644
--- a/lib/Plugins/KerneloopsScanner.h
+++ b/lib/Plugins/KerneloopsScanner.h
@@ -35,7 +35,7 @@ class CKerneloopsScanner : public CAction
{
private:
std::string m_sSysLogFile;
- CSysLog m_pSysLog;
+ vector_string_t m_pOopsList;
public:
/* For "dumpoops" tool */
diff --git a/lib/Plugins/KerneloopsSysLog.cpp b/lib/Plugins/KerneloopsSysLog.cpp
index 886073b3..d6f257ec 100644
--- a/lib/Plugins/KerneloopsSysLog.cpp
+++ b/lib/Plugins/KerneloopsSysLog.cpp
@@ -26,45 +26,13 @@
#include "abrtlib.h"
#include "KerneloopsSysLog.h"
-
-#include <list>
#include <assert.h>
-/*
- * This limits the number of oopses we'll submit per session;
- * it's important that this is bounded to avoid feedback loops
- * for the scenario where submitting an oopses causes a warning/oops
- */
-#define MAX_OOPS 16
-
-CSysLog::CSysLog() :
- m_nFoundOopses(0)
-{}
-
-void CSysLog::QueueOops(char *data, char *version)
-{
- if (m_nFoundOopses > MAX_OOPS)
- return;
-
- COops m_NewOops;
- m_NewOops.m_sData = data;
- m_NewOops.m_sVersion = version;
-
- m_OopsQueue.push_back(m_NewOops);
- m_nFoundOopses++;
-}
-
-void CSysLog::ClearOopsList()
+static void queue_oops(vector_string_t &vec, const char *data, const char *version)
{
- m_OopsQueue.clear();
+ vec.push_back(ssprintf("%s\n%s", version, data));
}
-const std::list<COops>& CSysLog::GetOopsList()
-{
- return m_OopsQueue;
-}
-
-
/*
* extract_version tries to find the kernel version in given data
*/
@@ -104,7 +72,7 @@ struct line_info {
char level;
};
#define REALLOC_CHUNK 1000
-int CSysLog::ExtractOops(char *buffer, size_t buflen)
+int extract_oopses(vector_string_t &oopses, char *buffer, size_t buflen)
{
char *c;
enum { maybe, no, yes } syslog_format = maybe;
@@ -216,10 +184,9 @@ next_line:
int i;
char prevlevel = 0;
int oopsstart = -1;
- int oopsend;
+ int oopsend = linecount;
int inbacktrace = 0;
int oopsesfound = 0;
- oopsend = linecount;
i = 0;
while (i < linecount) {
@@ -370,7 +337,7 @@ next_line:
}
/* too short oopses are invalid */
if (strlen(oops) > 100) {
- QueueOops(oops, version);
+ queue_oops(oopses, oops, version);
oopsesfound++;
}
oopsstart = -1;
@@ -420,7 +387,7 @@ next_line:
}
/* too short oopses are invalid */
if (strlen(oops) > 100) {
- QueueOops(oops, version);
+ queue_oops(oopses, oops, version);
oopsesfound++;
}
oopsstart = -1;
diff --git a/lib/Plugins/KerneloopsSysLog.h b/lib/Plugins/KerneloopsSysLog.h
index 8d0626b7..a67b33d4 100644
--- a/lib/Plugins/KerneloopsSysLog.h
+++ b/lib/Plugins/KerneloopsSysLog.h
@@ -27,28 +27,8 @@
#ifndef __INCLUDE_GUARD_KERNELOOPSSYSLOG_H_
#define __INCLUDE_GUARD_KERNELOOPSSYSLOG_H_
-#include <string>
-#include <list>
+#include "abrt_types.h"
-class COops
-{
- public:
- std::string m_sData;
- std::string m_sVersion;
-};
-
-class CSysLog
-{
- private:
- void QueueOops(char *data, char *version);
- std::list<COops> m_OopsQueue;
- int m_nFoundOopses;
-
- public:
- CSysLog();
- const std::list<COops>& GetOopsList();
- void ClearOopsList();
- int ExtractOops(char *buffer, size_t buflen);
-};
+int extract_oopses(vector_string_t &oopses, char *buffer, size_t buflen);
#endif