s3: Log the correct core path on Linux if core_pattern is set
authorVolker Lendecke <vl@samba.org>
Fri, 23 Jul 2010 10:22:23 +0000 (12:22 +0200)
committerVolker Lendecke <vl@samba.org>
Mon, 26 Jul 2010 14:06:21 +0000 (16:06 +0200)
Contributions from Bill Hymas, IBM

source3/configure.in
source3/lib/fault.c

index 26e98f53336aa3715aa4e5cfb63c3a1cb7f34989..905ad23efcc0d974c104b56d04de0619b1ae8b6c 100644 (file)
@@ -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)
index de19a720bc4a5114c0df6ccef7630c1a4a664668..02e054b680ea17736e71f9415533e2b7c87e49e7 100644 (file)
@@ -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) {