summaryrefslogtreecommitdiffstats
path: root/src/Hooks/CCpp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Hooks/CCpp.cpp')
-rw-r--r--src/Hooks/CCpp.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/Hooks/CCpp.cpp b/src/Hooks/CCpp.cpp
index 84d023d..1d895c2 100644
--- a/src/Hooks/CCpp.cpp
+++ b/src/Hooks/CCpp.cpp
@@ -26,6 +26,7 @@
#include <limits.h>
#include <stdio.h>
#include <sys/types.h>
+#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <syslog.h>
@@ -35,6 +36,8 @@
#define FILENAME_CMDLINE "cmdline"
#define FILENAME_COREDUMP "coredump"
+#define VAR_RUN_PID_FILE VAR_RUN"/abrt.pid"
+
static void write_success_log(const char* pid)
{
openlog("abrt", 0, LOG_DAEMON);
@@ -93,6 +96,34 @@ char* get_cmdline(const char* pid)
return strdup(cmdline);
}
+#define PID_MAX 16
+
+int daemon_is_ok()
+{
+ char pid[PID_MAX];
+ char path[PATH_MAX];
+ struct stat buff;
+ FILE* fp;
+ if ((fp = fopen(VAR_RUN_PID_FILE, "r")) == NULL)
+ {
+ return 0;
+ }
+ fgets(pid, sizeof(pid), fp);
+ if (strrchr(pid, '\n') != NULL)
+ {
+ char* newline = strrchr(pid, '\n');
+ *newline = '\0';
+ }
+ snprintf(path, sizeof(path), "/proc/%s/stat", pid);
+ if (stat(path, &buff) == -1)
+ {
+ return 0;
+ }
+ fclose(fp);
+
+ return 1;
+}
+
int main(int argc, char** argv)
{
const char* program_name = argv[0];
@@ -115,6 +146,10 @@ int main(int argc, char** argv)
{
return 0;
}
+ if (!daemon_is_ok())
+ {
+ return 0;
+ }
try
{
@@ -170,6 +205,12 @@ int main(int argc, char** argv)
dd.Close();
write_success_log(pid);
}
+ catch (CABRTException& e)
+ {
+ fprintf(stderr, "%s: %s\n", program_name, e.what().c_str());
+ write_faliure_log(e.what().c_str());
+ return -2;
+ }
catch (std::exception& e)
{
fprintf(stderr, "%s: %s\n", program_name, e.what());