summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2010-07-23 12:22:23 +0200
committerVolker Lendecke <vl@samba.org>2010-07-26 16:06:21 +0200
commitb6c4eb3c5204a5d43af10ba349fedc5f40796607 (patch)
treef80e120279e91a8b10bffd5fa7f68e1a583b02ce
parent2ef87d8ec00f70aa8714c739525c487e44142853 (diff)
downloadsamba-b6c4eb3c5204a5d43af10ba349fedc5f40796607.tar.gz
samba-b6c4eb3c5204a5d43af10ba349fedc5f40796607.tar.bz2
samba-b6c4eb3c5204a5d43af10ba349fedc5f40796607.zip
s3: Log the correct core path on Linux if core_pattern is set
Contributions from Bill Hymas, IBM
-rw-r--r--source3/configure.in9
-rw-r--r--source3/lib/fault.c57
2 files changed, 64 insertions, 2 deletions
diff --git a/source3/configure.in b/source3/configure.in
index 26e98f5333..905ad23efc 100644
--- a/source3/configure.in
+++ b/source3/configure.in
@@ -1105,6 +1105,15 @@ AC_CHECK_LIB(exc, trace_back_stack)
# check for sysctlbyname for BSD systems
AC_CHECK_FUNCS(sysctlbyname)
+#################################################
+# Check to see if core dump directory is defined in linux
+# with /proc/sys/kernel/core_pattern
+
+AC_CHECK_FILE([/proc/sys/kernel/core_pattern],
+ AC_DEFINE(HAVE_SYS_KERNEL_PROC_CORE_PATTERN, 1,
+ [Whether Linux kernel uses core_pattern for core files]),
+ [])
+
#############################
# check if building with gpfs
AC_CHECK_HEADERS(gpfs_gpl.h)
diff --git a/source3/lib/fault.c b/source3/lib/fault.c
index de19a720bc..02e054b680 100644
--- a/source3/lib/fault.c
+++ b/source3/lib/fault.c
@@ -192,6 +192,52 @@ static char *get_freebsd_corepath(void)
}
#endif
+#if defined(HAVE_SYS_KERNEL_PROC_CORE_PATTERN)
+
+/**
+ * Get the Linux corepath.
+ *
+ * On Linux the contents of /proc/sys/kernel/core_pattern indicates the
+ * location of the core path.
+ */
+static char *get_linux_corepath(void)
+{
+ char *end;
+ int fd;
+ char *result;
+
+ fd = open("/proc/sys/kernel/core_pattern", O_RDONLY, 0);
+ if (fd == -1) {
+ return NULL;
+ }
+
+ result = afdgets(fd, NULL, 0);
+ close(fd);
+
+ if (result == NULL) {
+ return NULL;
+ }
+
+ if (result[0] != '/') {
+ /*
+ * No absolute path, use the default (cwd)
+ */
+ TALLOC_FREE(result);
+ return NULL;
+ }
+ /* Strip off the common filename expansion */
+
+ end = strrchr_m(result, '/');
+
+ if ((end != result) /* this would be the only / */
+ && (end != NULL)) {
+ *end = '\0';
+ }
+ return result;
+}
+#endif
+
+
/**
* Try getting system-specific corepath if one exists.
*
@@ -200,11 +246,18 @@ static char *get_freebsd_corepath(void)
static char *get_corepath(const char *logbase, const char *progname)
{
#if (defined(FREEBSD) && defined(HAVE_SYSCTLBYNAME))
+ char *tmp_corepath = NULL;
+ tmp_corepath = get_freebsd_corepath();
- /* @todo: Add support for the linux corepath. */
+ /* If this has been set correctly, we're done. */
+ if (tmp_corepath) {
+ return tmp_corepath;
+ }
+#endif
+#if defined(HAVE_SYS_KERNEL_PROC_CORE_PATTERN)
char *tmp_corepath = NULL;
- tmp_corepath = get_freebsd_corepath();
+ tmp_corepath = get_linux_corepath();
/* If this has been set correctly, we're done. */
if (tmp_corepath) {