From 9bbdff4c7e766743a74e204f464f75936656fae7 Mon Sep 17 00:00:00 2001 From: Nikola Pajkovsky Date: Wed, 20 Jul 2011 14:45:42 +0200 Subject: [PATCH] rhbz#671354 - [RFE] Configurable core dump location Signed-off-by: Nikola Pajkovsky (cherry picked from commit 6c1e469bb663bde9501ed62dbec68fbff65aadbf) Conflicts: src/cli/Makefile.am src/cli/list.c src/hooks/abrt-hook-ccpp.c src/lib/Makefile.am src/lib/abrt_conf.c diff --git a/configure.ac b/configure.ac index d53bcd1..21cc302 100644 --- a/configure.ac +++ b/configure.ac @@ -100,14 +100,8 @@ PLUGINS_LIB_DIR='${libdir}/${PACKAGE_NAME}' ENABLE_SOCKET_OR_DBUS='-DENABLE_DBUS=1' LIBEXEC_DIR='${libexecdir}' -DEBUG_DUMPS_DIR='${localstatedir}/spool/${PACKAGE_NAME}' DEBUG_INFO_DIR='${localstatedir}/cache/${PACKAGE_NAME}-di' -AC_ARG_WITH(debugdumpsdir, - [AS_HELP_STRING([--with-debugdumpdir=DIR], - [Directory where debugdumps are created])], - [DEBUG_DUMPS_DIR="$withval"]) - AC_ARG_WITH(debuginfosdir, [AS_HELP_STRING([--with-debuginfodir=DIR], [Directory where debuginfo is stored])], @@ -120,7 +114,6 @@ AC_SUBST(REPORT_PLUGINS_CONF_DIR) AC_SUBST(EVENTS_CONF_DIR) AC_SUBST(EVENTS_DIR) AC_SUBST(PLUGINS_LIB_DIR) -AC_SUBST(DEBUG_DUMPS_DIR) AC_SUBST(DEBUG_INFO_DIR) AC_SUBST(LIBEXEC_DIR) diff --git a/src/applet/Makefile.am b/src/applet/Makefile.am index db5266d..247bee2 100644 --- a/src/applet/Makefile.am +++ b/src/applet/Makefile.am @@ -9,7 +9,6 @@ abrt_applet_CPPFLAGS = \ -DBIN_DIR=\"$(bindir)\" \ -DVAR_RUN=\"$(VAR_RUN)\" \ -DCONF_DIR=\"$(CONF_DIR)\" \ - -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ -DICON_DIR=\"${datadir}/abrt/icons/hicolor/48x48/status\" \ diff --git a/src/daemon/Makefile.am b/src/daemon/Makefile.am index 9f4db01..70a1641 100644 --- a/src/daemon/Makefile.am +++ b/src/daemon/Makefile.am @@ -23,7 +23,6 @@ abrtd_CPPFLAGS = \ -DBIN_DIR=\"$(bindir)\" \ -DVAR_RUN=\"$(VAR_RUN)\" \ -DCONF_DIR=\"$(CONF_DIR)\" \ - -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \ -DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ @@ -47,7 +46,6 @@ abrt_server_CPPFLAGS = \ -DBIN_DIR=\"$(bindir)\" \ -DVAR_RUN=\"$(VAR_RUN)\" \ -DCONF_DIR=\"$(CONF_DIR)\" \ - -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \ -DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ @@ -69,7 +67,6 @@ abrt_action_save_package_data_CPPFLAGS = \ -DVAR_RUN=\"$(VAR_RUN)\" \ -DCONF_DIR=\"$(CONF_DIR)\" \ -DLOCALSTATEDIR='"$(localstatedir)"' \ - -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \ -DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ diff --git a/src/daemon/abrt-server.c b/src/daemon/abrt-server.c index 8153ad6..78e4ebd 100644 --- a/src/daemon/abrt-server.c +++ b/src/daemon/abrt-server.c @@ -100,7 +100,8 @@ static int create_debug_dump() This directory is renamed to final directory name after all files have been stored into it. */ - char *path = xasprintf(DEBUG_DUMPS_DIR"/%s-%s-%u.new", + char *path = xasprintf("%s/%s-%s-%u.new", + g_settings_dump_location, dir_basename, iso_date_string(NULL), pid); @@ -150,8 +151,8 @@ static int create_debug_dump() */ unsigned maxsize = g_settings_nMaxCrashReportsSize + g_settings_nMaxCrashReportsSize / 4; maxsize |= 63; - check_free_space(maxsize); - trim_debug_dumps(DEBUG_DUMPS_DIR, maxsize * (double)(1024*1024), path); + check_free_space(maxsize, g_settings_dump_location); + trim_debug_dumps(g_settings_dump_location, maxsize * (double)(1024*1024), path); } free(path); @@ -162,15 +163,19 @@ static int create_debug_dump() /* Remove dump dir */ static int delete_path(const char *dump_dir_name) { - /* If doesn't start with "DEBUG_DUMPS_DIR/"... */ - if (strncmp(dump_dir_name, DEBUG_DUMPS_DIR"/", strlen(DEBUG_DUMPS_DIR"/")) != 0 + /* If doesn't start with "g_settings_dump_location/"... */ + char *dump_location = xasprintf("%s/", g_settings_dump_location); + log("%s", dump_location); + if (strncmp(dump_dir_name, dump_location, strlen(dump_location)) != 0 /* or contains "/." anywhere (-> might contain ".." component) */ - || strstr(dump_dir_name + strlen(DEBUG_DUMPS_DIR), "/.") + || strstr(dump_dir_name + strlen(g_settings_dump_location), "/.") ) { /* Then refuse to operate on it (someone is attacking us??) */ error_msg("Bad dump directory name '%s', not deleting", dump_dir_name); + free(dump_location); return 400; /* Bad Request */ } + free(dump_location); struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd) @@ -491,10 +496,14 @@ int main(int argc, char **argv) client_uid = cr.uid; } + load_abrt_conf(); + int r = perform_http_xact(); if (r == 0) r = 200; + free_abrt_conf_data(); + printf("HTTP/1.1 %u \r\n\r\n", r); return (r >= 400); /* Error if 400+ */ diff --git a/src/daemon/abrt.conf b/src/daemon/abrt.conf index cb0dbbb..58a7019 100644 --- a/src/daemon/abrt.conf +++ b/src/daemon/abrt.conf @@ -27,3 +27,8 @@ BlackListedPaths = /usr/share/doc/*,*/example* # Max size for crash storage [MiB] or 0 for unlimited # MaxCrashReportsSize = 1000 + +# Specify where you want to store coredumps and all files which are needed for +# reporting. (default:/var/spool/abrt) +# +#DumpLocation = /var/spool/abrt diff --git a/src/daemon/abrtd.c b/src/daemon/abrtd.c index 8a22ab8..3da3130 100644 --- a/src/daemon/abrtd.c +++ b/src/daemon/abrtd.c @@ -290,7 +290,7 @@ static int is_crash_a_dup(const char *dump_dir_name, void *param) /* Scan crash dumps looking for a dup */ //TODO: explain why this is safe wrt concurrent runs - DIR *dir = opendir(DEBUG_DUMPS_DIR); + DIR *dir = opendir(g_settings_dump_location); if (dir != NULL) { struct dirent *dent; @@ -301,7 +301,7 @@ static int is_crash_a_dup(const char *dump_dir_name, void *param) int different; char *uid, *uuid; - char *dump_dir_name2 = concat_path_file(DEBUG_DUMPS_DIR, dent->d_name); + char *dump_dir_name2 = concat_path_file(g_settings_dump_location, dent->d_name); if (strcmp(dump_dir_name, dump_dir_name2) == 0) goto next; /* we are never a dup of ourself */ @@ -518,7 +518,8 @@ static gboolean handle_inotify_cb(GIOChannel *gio, GIOCondition condition, gpoin if (fork() == 0) { xchdir(dir); - execlp("abrt-handle-upload", "abrt-handle-upload", DEBUG_DUMPS_DIR, dir, name, (char*)NULL); + execlp("abrt-handle-upload", "abrt-handle-upload", + g_settings_dump_location, dir, name, (char*)NULL); error_msg_and_die("Can't execute '%s'", "abrt-handle-upload"); } } @@ -543,13 +544,14 @@ static gboolean handle_inotify_cb(GIOChannel *gio, GIOCondition condition, gpoin { char *worst_dir = NULL; while (g_settings_nMaxCrashReportsSize > 0 - && get_dirsize_find_largest_dir(DEBUG_DUMPS_DIR, &worst_dir, name) / (1024*1024) >= g_settings_nMaxCrashReportsSize + && get_dirsize_find_largest_dir(g_settings_dump_location, &worst_dir, name) / (1024*1024) >= g_settings_nMaxCrashReportsSize && worst_dir ) { - log("Size of '%s' >= %u MB, deleting '%s'", DEBUG_DUMPS_DIR, g_settings_nMaxCrashReportsSize, worst_dir); + log("Size of '%s' >= %u MB, deleting '%s'", + g_settings_dump_location, g_settings_nMaxCrashReportsSize, worst_dir); send_dbus_sig_QuotaExceeded(_("The size of the report exceeded the quota. Please check system's MaxCrashReportsSize value in abrt.conf.")); /* deletes both directory and DB record */ - char *d = concat_path_file(DEBUG_DUMPS_DIR, worst_dir); + char *d = concat_path_file(g_settings_dump_location, worst_dir); free(worst_dir); worst_dir = NULL; delete_dump_dir(d); @@ -559,7 +561,7 @@ static gboolean handle_inotify_cb(GIOChannel *gio, GIOCondition condition, gpoin char *fullname = NULL; problem_data_t *problem_data = NULL; - fullname = concat_path_file(DEBUG_DUMPS_DIR, name); + fullname = concat_path_file(g_settings_dump_location, name); mw_result_t res = LoadDebugDump(fullname, &problem_data); const char *first = problem_data ? get_problem_item_content_or_NULL(problem_data, CD_DUMPDIR) : NULL; switch (res) @@ -693,7 +695,7 @@ static void sanitize_dump_dir_rights() * us with thousands of bogus or malicious dumps */ /* 07000 bits are setuid, setgit, and sticky, and they must be unset */ /* 00777 bits are usual "rwxrwxrwx" access rights */ - ensure_writable_dir(DEBUG_DUMPS_DIR, 0755, "abrt"); + ensure_writable_dir(g_settings_dump_location, 0755, "abrt"); /* debuginfo cache */ ensure_writable_dir(DEBUG_INFO_DIR, 0775, "abrt"); /* temp dir */ @@ -823,10 +825,10 @@ int main(int argc, char** argv) perror_msg_and_die("inotify_init failed"); close_on_exec_on(inotify_fd); - /* Watching DEBUG_DUMPS_DIR for new files... */ - if (inotify_add_watch(inotify_fd, DEBUG_DUMPS_DIR, IN_CREATE | IN_MOVED_TO) < 0) + /* Watching 'g_settings_dump_location' for new files... */ + if (inotify_add_watch(inotify_fd, g_settings_dump_location, IN_CREATE | IN_MOVED_TO) < 0) { - perror_msg("inotify_add_watch failed on '%s'", DEBUG_DUMPS_DIR); + perror_msg("inotify_add_watch failed on '%s'", g_settings_dump_location); goto init_error; } if (g_settings_sWatchCrashdumpArchiveDir) diff --git a/src/gui-gtk/Makefile.am b/src/gui-gtk/Makefile.am index 5025082..a2bb755 100644 --- a/src/gui-gtk/Makefile.am +++ b/src/gui-gtk/Makefile.am @@ -9,7 +9,6 @@ abrt_gui_CFLAGS = \ -DBIN_DIR=\"$(bindir)\" \ -DVAR_RUN=\"$(VAR_RUN)\" \ -DCONF_DIR=\"$(CONF_DIR)\" \ - -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ -DICON_DIR=\"${datadir}/abrt/icons/hicolor/48x48/status\" \ @@ -25,7 +24,8 @@ abrt_gui_LDADD = \ -lglib-2.0 \ -lgthread-2.0 \ $(GTK_LIBS) \ - $(LIBREPORT_GTK_LIBS) + $(LIBREPORT_GTK_LIBS) \ + ../lib/libabrt.la # $(LIBNOTIFY_LIBS) #test_report_SOURCES = \ diff --git a/src/gui-gtk/main.c b/src/gui-gtk/main.c index e465d7b..2e45090 100644 --- a/src/gui-gtk/main.c +++ b/src/gui-gtk/main.c @@ -721,7 +721,6 @@ int main(int argc, char **argv) "\b [-vp] [DIR]...\n" "\n" "Shows list of ABRT dump directories in specified DIR(s)\n" - "(default DIRs: "DEBUG_DUMPS_DIR" $HOME/.abrt/spool)" ); enum { OPT_v = 1 << 0, @@ -739,8 +738,9 @@ int main(int argc, char **argv) GtkWidget *main_window = create_main_window(); + load_abrt_conf(); const char *default_dirs[] = { - "/var/spool/abrt", + g_settings_dump_location, NULL, NULL, }; @@ -777,5 +777,6 @@ int main(int argc, char **argv) /* Enter main loop */ gtk_main(); + free_abrt_conf_data(); return 0; } diff --git a/src/hooks/Makefile.am b/src/hooks/Makefile.am index 95cd363..f202776 100644 --- a/src/hooks/Makefile.am +++ b/src/hooks/Makefile.am @@ -14,7 +14,6 @@ abrt_hook_ccpp_SOURCES = \ abrt_hook_ccpp_CPPFLAGS = \ -I$(srcdir)/../include \ -I$(srcdir)/../lib \ - -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \ -DCONF_DIR=\"$(CONF_DIR)\" \ -DVAR_RUN=\"$(VAR_RUN)\" \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ diff --git a/src/hooks/abrt-hook-ccpp.c b/src/hooks/abrt-hook-ccpp.c index da3b337..5d837c3 100644 --- a/src/hooks/abrt-hook-ccpp.c +++ b/src/hooks/abrt-hook-ccpp.c @@ -309,13 +309,11 @@ int main(int argc, char** argv) { struct stat sb; - if (argc < 9) /* no argv[8]? */ + if (argc < 8) { - /* percent specifier: %s %c %p %u %g %t %e %h */ - /* argv: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] */ - // [OLD_PATTERN] is deprecated, so removing it from help: - //error_msg_and_die("Usage: %s DUMPDIR SIGNO CORE_SIZE_LIMIT PID UID GID TIME BINARY_NAME [HOSTNAME [OLD_PATTERN]]", argv[0]); - error_msg_and_die("Usage: %s DUMPDIR SIGNO CORE_SIZE_LIMIT PID UID GID TIME BINARY_NAME [HOSTNAME]", argv[0]); + /* percent specifier: %s %c %p %u %g %t %e %h */ + /* argv: [0] [1] [2] [3] [4] [5] [6] [7] [8]*/ + error_msg_and_die("Usage: %s SIGNO CORE_SIZE_LIMIT PID UID GID TIME BINARY_NAME [HOSTNAME]", argv[0]); } /* Not needed on 2.6.30. @@ -337,20 +335,23 @@ int main(int argc, char** argv) logmode = LOGMODE_SYSLOG; errno = 0; - const char* dddir = argv[1]; - const char* signal_str = argv[2]; + /* Parse abrt.conf */ + load_abrt_conf(); + + const char* signal_str = argv[1]; int signal_no = xatoi_positive(signal_str); - off_t ulimit_c = strtoull(argv[3], NULL, 10); + off_t ulimit_c = strtoull(argv[2], NULL, 10); if (ulimit_c < 0) /* unlimited? */ { /* set to max possible >0 value */ ulimit_c = ~((off_t)1 << (sizeof(off_t)*8-1)); } - pid_t pid = xatoi_positive(argv[4]); - uid_t uid = xatoi_positive(argv[5]); + pid_t pid = xatoi_positive(argv[3]); + uid_t uid = xatoi_positive(argv[4]); if (errno || pid <= 0) { - perror_msg_and_die("pid '%s' or limit '%s' is bogus", argv[4], argv[3]); + free_abrt_conf_data(); + perror_msg_and_die("pid '%s' or limit '%s' is bogus", argv[3], argv[2]); } FILE *saved_core_pattern = fopen(VAR_RUN"/abrt/saved_core_pattern", "r"); @@ -360,52 +361,27 @@ int main(int argc, char** argv) fclose(saved_core_pattern); /* If we have a saved pattern and it's not a "|PROG ARGS" thing... */ if (s && s[0] != '|') - { core_basename = s; - argv[10] = NULL; /* don't use old way to pass OLD_PATTERN */ - } } struct utsname uts; - if (!argv[9]) /* no HOSTNAME? */ + if (!argv[8]) /* no HOSTNAME? */ { uname(&uts); - argv[9] = uts.nodename; - } - else /* argv[9]=HOSTNAME exists.*/ - if (argv[10]) /* OLD_PATTERN? (deprecated) */ - { - char *buf = (char*) xzalloc(strlen(argv[10]) / 2 + 2); - char *end = hex2bin(buf, argv[10], strlen(argv[10])); - if (end && end > buf && end[-1] == '\0') - { - core_basename = buf; - //log("core_basename:'%s'", core_basename); - } - else - { - /* Until recently, kernels were truncating expanded core pattern. - * In this case, we end up here... - */ - error_msg("bad old pattern '%s', ignoring and using 'core'", argv[10]); - /* core_basename = "core"; - already is */ - free(buf); - } + argv[8] = uts.nodename; } int src_fd_binary; char *executable = get_executable(pid, &src_fd_binary); if (executable && strstr(executable, "/abrt-hook-ccpp")) { + free_abrt_conf_data(); error_msg_and_die("pid %lu is '%s', not dumping it to avoid recursion", (long)pid, executable); } char *user_pwd = get_cwd(pid); /* may be NULL on error */ - /* Parse abrt.conf */ - load_abrt_conf(); - free_abrt_conf_data(); /* can do this because we need only g_settings_nMaxCrashReportsSize */ /* ... and plugins/CCpp.conf */ bool setting_MakeCompatCore; bool setting_SaveBinaryImage; @@ -430,7 +406,7 @@ int main(int argc, char** argv) int user_core_fd = -1; if (setting_MakeCompatCore && ulimit_c != 0) /* note: checks "user_pwd == NULL" inside; updates core_basename */ - user_core_fd = open_user_core(user_pwd, uid, pid, &argv[2]); + user_core_fd = open_user_core(user_pwd, uid, pid, &argv[1]); if (executable == NULL) { @@ -475,7 +451,7 @@ int main(int argc, char** argv) */ unsigned maxsize = g_settings_nMaxCrashReportsSize + g_settings_nMaxCrashReportsSize / 4; maxsize |= 63; - check_free_space(maxsize); + check_free_space(maxsize, g_settings_dump_location); } char path[PATH_MAX]; @@ -483,7 +459,7 @@ int main(int argc, char** argv) /* Check /var/spool/abrt/last-ccpp marker, do not dump repeated crashes * if they happen too often. Else, write new marker value. */ - snprintf(path, sizeof(path), "%s/last-ccpp", dddir); + snprintf(path, sizeof(path), "%s/last-ccpp", g_settings_dump_location); int fd = open(path, O_RDWR | O_CREAT, 0600); if (fd >= 0) { @@ -502,6 +478,7 @@ int main(int argc, char** argv) error_msg("not dumping repeating crash in '%s'", executable); if (setting_MakeCompatCore) goto create_user_core; + free_abrt_conf_data(); return 1; } } @@ -521,7 +498,7 @@ int main(int argc, char** argv) * and maybe crash again... * Unlike dirs, mere files are ignored by abrtd. */ - snprintf(path, sizeof(path), "%s/%s-coredump", dddir, last_slash); + snprintf(path, sizeof(path), "%s/%s-coredump", g_settings_dump_location, last_slash); int abrt_core_fd = xopen3(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); off_t core_size = copyfd_eof(STDIN_FILENO, abrt_core_fd, COPYFD_SPARSE); if (core_size < 0 || fsync(abrt_core_fd) != 0) @@ -529,16 +506,21 @@ int main(int argc, char** argv) unlink(path); /* copyfd_eof logs the error including errno string, * but it does not log file name */ + free_abrt_conf_data(); error_msg_and_die("error saving coredump to %s", path); } log("saved core dump of pid %lu (%s) to %s (%llu bytes)", (long)pid, executable, path, (long long)core_size); + free_abrt_conf_data(); return 0; } unsigned path_len = snprintf(path, sizeof(path), "%s/ccpp-%s-%lu.new", - dddir, iso_date_string(NULL), (long)pid); + g_settings_dump_location, iso_date_string(NULL), (long)pid); if (path_len >= (sizeof(path) - sizeof("/"FILENAME_COREDUMP))) + { + free_abrt_conf_data(); return 1; + } struct dump_dir *dd = dd_create(path, uid, 0640); if (dd) @@ -588,6 +570,7 @@ int main(int argc, char** argv) if (sz < 0 || fsync(dst_fd_binary) != 0) { unlink(path); + free_abrt_conf_data(); error_msg_and_die("error saving binary image to %s", path); } close(dst_fd_binary); @@ -606,7 +589,8 @@ int main(int argc, char** argv) unlink(core_basename); } errno = sv_errno; - perror_msg_and_die("can't open '%s'", path); + free_abrt_conf_data(); + perror_msg_and_die("Can't open '%s'", path); } fchown(abrt_core_fd, dd->dd_uid, dd->dd_gid); @@ -636,6 +620,7 @@ int main(int argc, char** argv) } /* copyfd_sparse logs the error including errno string, * but it does not log file name */ + free_abrt_conf_data(); error_msg_and_die("error writing %s", path); } log("saved core dump of pid %lu (%s) to %s (%llu bytes)", (long)pid, executable, path, (long long)core_size); @@ -667,16 +652,20 @@ int main(int argc, char** argv) */ unsigned maxsize = g_settings_nMaxCrashReportsSize + g_settings_nMaxCrashReportsSize / 4; maxsize |= 63; - trim_debug_dumps(DEBUG_DUMPS_DIR, maxsize * (double)(1024*1024), path); + trim_debug_dumps(g_settings_dump_location, maxsize * (double)(1024*1024), path); } + free_abrt_conf_data(); return 0; } /* We didn't create abrt dump, but may need to create compat coredump */ create_user_core: if (user_core_fd < 0) + { + free_abrt_conf_data(); return 0; + } off_t core_size = copyfd_size(STDIN_FILENO, user_core_fd, ulimit_c, COPYFD_SPARSE); if (core_size < 0 || fsync(user_core_fd) != 0) { @@ -684,15 +673,17 @@ int main(int argc, char** argv) perror_msg("error writing %s/%s", user_pwd, core_basename); xchdir(user_pwd); unlink(core_basename); + free_abrt_conf_data(); return 1; } if (ulimit_c == 0 || core_size > ulimit_c) { xchdir(user_pwd); unlink(core_basename); + free_abrt_conf_data(); return 1; } log("saved core dump of pid %lu to %s/%s (%llu bytes)", (long)pid, user_pwd, core_basename, (long long)core_size); - + free_abrt_conf_data(); return 0; } diff --git a/src/hooks/abrt-install-ccpp-hook b/src/hooks/abrt-install-ccpp-hook index 12a443f..2450eba 100755 --- a/src/hooks/abrt-install-ccpp-hook +++ b/src/hooks/abrt-install-ccpp-hook @@ -11,9 +11,9 @@ SAVED_PATTERN_DIR="/var/run/abrt" SAVED_PATTERN_FILE="/var/run/abrt/saved_core_pattern" HOOK_BIN="/usr/libexec/abrt-hook-ccpp" # Must match percent_specifiers[] order in abrt-hook-ccpp.c: -PATTERN="|$HOOK_BIN /var/spool/abrt %s %c %p %u %g %t %e" +PATTERN="|$HOOK_BIN %s %c %p %u %g %t %e" # Same, but with bogus "executable name" parameter -PATTERN1="|$HOOK_BIN /var/spool/abrt %s %c %p %u %g %t e" +PATTERN1="|$HOOK_BIN %s %c %p %u %g %t e" # core_pipe_limit specifies how many dump_helpers can run at the same time # 0 - means unlimited, but it's not guaranteed that /proc/ of crashing diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index 163e7c3..43364dc 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -20,7 +20,6 @@ libabrt_la_CPPFLAGS = \ -I$(srcdir)/../lib \ -DLOCALSTATEDIR='"$(localstatedir)"' \ -DVAR_RUN=\"$(VAR_RUN)\" \ - -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ -DCONF_DIR=\"$(CONF_DIR)\" \ diff --git a/src/lib/abrt_conf.c b/src/lib/abrt_conf.c index 2a1cf36..2e13f2d 100644 --- a/src/lib/abrt_conf.c +++ b/src/lib/abrt_conf.c @@ -26,6 +26,7 @@ char * g_settings_sWatchCrashdumpArchiveDir = NULL; unsigned int g_settings_nMaxCrashReportsSize = 1000; bool g_settings_bProcessUnpackaged = false; +char * g_settings_dump_location = NULL; void free_abrt_conf_data() { @@ -40,6 +41,9 @@ void free_abrt_conf_data() free(g_settings_sWatchCrashdumpArchiveDir); g_settings_sWatchCrashdumpArchiveDir = NULL; + + free(g_settings_dump_location); + g_settings_dump_location = NULL; } static GList *parse_list(const char* list) @@ -118,6 +122,14 @@ static void ParseCommon(map_string_h *settings, const char *conf_filename) g_settings_bProcessUnpackaged = string_to_bool(value); g_hash_table_remove(settings, "ProcessUnpackaged"); } + value = g_hash_table_lookup(settings, "DumpLocation"); + if (value) + { + g_settings_dump_location = xstrdup(value); + g_hash_table_remove(settings, "DumpLocation"); + } + else + g_settings_dump_location = xstrdup("/var/spool/abrt"); GHashTableIter iter; char *name; diff --git a/src/lib/abrt_conf.h b/src/lib/abrt_conf.h index 2ca7542..f45972e 100644 --- a/src/lib/abrt_conf.h +++ b/src/lib/abrt_conf.h @@ -37,6 +37,8 @@ extern bool g_settings_bOpenGPGCheck; extern bool g_settings_bProcessUnpackaged; #define g_settings_sWatchCrashdumpArchiveDir abrt_g_settings_sWatchCrashdumpArchiveDir extern char * g_settings_sWatchCrashdumpArchiveDir; +#define g_settings_dump_location abrt_g_settings_dump_location +extern char * g_settings_dump_location; #define load_abrt_conf abrt_load_abrt_conf int load_abrt_conf(); diff --git a/src/lib/hooklib.c b/src/lib/hooklib.c index b5fcec2..5ebec97 100644 --- a/src/lib/hooklib.c +++ b/src/lib/hooklib.c @@ -19,12 +19,12 @@ #include "internal_libreport.h" #include "hooklib.h" -void check_free_space(unsigned setting_MaxCrashReportsSize) +void check_free_space(unsigned setting_MaxCrashReportsSize, const char *dump_location) { struct statvfs vfs; - if (statvfs(DEBUG_DUMPS_DIR, &vfs) != 0) + if (statvfs(dump_location, &vfs) != 0) { - perror_msg_and_die("statvfs('%s')", DEBUG_DUMPS_DIR); + perror_msg_and_die("statvfs('%s')", dump_location); } /* Check that at least MaxCrashReportsSize/4 MBs are free */ @@ -34,7 +34,8 @@ void check_free_space(unsigned setting_MaxCrashReportsSize) unsigned long fs_free_mb_x4 = ((unsigned long long)vfs.f_bfree / (1024/4)) * vfs.f_bsize / 1024; if (fs_free_mb_x4 < setting_MaxCrashReportsSize) { - error_msg_and_die("aborting dump: only %luMiB is available on %s", fs_free_mb_x4 / 4, DEBUG_DUMPS_DIR); + error_msg_and_die("aborting dump: only %luMiB is available on %s", + fs_free_mb_x4 / 4, dump_location); } } diff --git a/src/lib/hooklib.h b/src/lib/hooklib.h index 1add7d0..0cb3f60 100644 --- a/src/lib/hooklib.h +++ b/src/lib/hooklib.h @@ -23,7 +23,7 @@ extern "C" { #endif #define check_free_space abrt_check_free_space -void check_free_space(unsigned setting_MaxCrashReportsSize); +void check_free_space(unsigned setting_MaxCrashReportsSize, const char *dump_location); #define trim_debug_dumps abrt_trim_debug_dumps void trim_debug_dumps(const char *dirname, double cap_size, const char *exclude_path); diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am index 543b424..de75c70 100644 --- a/src/plugins/Makefile.am +++ b/src/plugins/Makefile.am @@ -119,7 +119,6 @@ abrt_dump_oops_CPPFLAGS = \ -DVAR_RUN=\"$(VAR_RUN)\" \ -DCONF_DIR=\"$(CONF_DIR)\" \ -DLOCALSTATEDIR='"$(localstatedir)"' \ - -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \ -DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ @@ -140,7 +139,6 @@ abrt_action_analyze_c_CPPFLAGS = \ -DVAR_RUN=\"$(VAR_RUN)\" \ -DCONF_DIR=\"$(CONF_DIR)\" \ -DLOCALSTATEDIR='"$(localstatedir)"' \ - -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \ -DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ @@ -160,7 +158,6 @@ abrt_action_analyze_python_CPPFLAGS = \ -DVAR_RUN=\"$(VAR_RUN)\" \ -DCONF_DIR=\"$(CONF_DIR)\" \ -DLOCALSTATEDIR='"$(localstatedir)"' \ - -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \ -DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ @@ -181,7 +178,6 @@ abrt_action_analyze_oops_CPPFLAGS = \ -DVAR_RUN=\"$(VAR_RUN)\" \ -DCONF_DIR=\"$(CONF_DIR)\" \ -DLOCALSTATEDIR='"$(localstatedir)"' \ - -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \ -DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ @@ -201,7 +197,6 @@ abrt_action_trim_files_CPPFLAGS = \ -DVAR_RUN=\"$(VAR_RUN)\" \ -DCONF_DIR=\"$(CONF_DIR)\" \ -DLOCALSTATEDIR='"$(localstatedir)"' \ - -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \ -DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ @@ -222,7 +217,6 @@ abrt_action_generate_backtrace_CPPFLAGS = \ -DVAR_RUN=\"$(VAR_RUN)\" \ -DCONF_DIR=\"$(CONF_DIR)\" \ -DLOCALSTATEDIR='"$(localstatedir)"' \ - -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \ -DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ @@ -242,7 +236,6 @@ abrt_action_analyze_backtrace_CPPFLAGS = \ -DVAR_RUN=\"$(VAR_RUN)\" \ -DCONF_DIR=\"$(CONF_DIR)\" \ -DLOCALSTATEDIR='"$(localstatedir)"' \ - -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \ -DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ -- 1.7.6