From 085a6ceeb7d3e018ef1db0429f1883070030af1b Mon Sep 17 00:00:00 2001 From: Zdenek Prikryl Date: Wed, 17 Jun 2009 16:23:36 +0200 Subject: hook writes new dump only if the daemin is running --- src/Hooks/CCpp.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'src/Hooks/CCpp.cpp') 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 #include #include +#include #include #include #include @@ -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()); -- cgit