Fix core_pattern being unset
authorTim Pepper <timothy.c.pepper@linux.intel.com>
Fri, 2 Nov 2012 23:21:10 +0000 (16:21 -0700)
committerTim Pepper <timothy.c.pepper@linux.intel.com>
Fri, 2 Nov 2012 23:21:10 +0000 (16:21 -0700)
In the commited version I lost a multiply by 100 that'd previously had.
I'd intended for the free metric to be a percentage represented by an
integer with value 0..100.  This error means the core_pattern was unset
just at the first call to scan_folder().  That is corrected here.

Additionally the core_pattern is explicitly set on start now.

And the log messages are a bit more clear.

Signed-off-by: Tim Pepper <timothy.c.pepper@linux.intel.com>
src/coredump.c
src/corewatcher.c
src/corewatcher.h

index cc3a20d..4c84610 100644 (file)
@@ -684,44 +684,63 @@ void *scan_processed_folder(void __unused *unused)
        return NULL;
 }
 
+static void disable_corefiles(int diskfree)
+{
+       int ret;
+       ret = system("echo \"\" > /proc/sys/kernel/core_pattern");
+       if (ret != -1) {
+               fprintf(stderr, "+ disabled core pattern, disk low %d%%\n", diskfree);
+               syslog(LOG_WARNING,
+                       "Disabled kernel core_pattern, %s only has %d%% available",
+                       core_folder, diskfree);
+       }
+}
+
+void enable_corefiles(int diskfree)
+{
+       int ret;
+       char * proc_core_string = NULL;
+       ret = asprintf(&proc_core_string,
+                       "echo \"%score_%%e_%%t\" > /proc/sys/kernel/core_pattern",
+                       core_folder);
+       if (ret == -1)
+               goto err;
+
+       ret = system(proc_core_string);
+       free(proc_core_string);
+       if (ret == -1)
+               goto err;
+
+       if (diskfree == -1) {
+               fprintf(stderr, "+ enabled core pattern\n");
+               syslog(LOG_INFO, "Enabled corewatcher kernel core_pattern\n");
+       } else {
+               fprintf(stderr, "+ reenabled core pattern, disk %d%%", diskfree);
+               syslog(LOG_WARNING,
+                       "Reenabled corewatcher kernel core_pattern, %s now has %d%% available",
+                       core_folder, diskfree);
+       }
+       return;
+err:
+       fprintf(stderr, "+ unable to enable core pattern\n");
+       syslog(LOG_WARNING, "Unable to enable kernel core_pattern\n");
+       return;
+}
+
 /* do everything, called from timer event */
 int scan_folders(void __unused *unused)
 {
        struct statvfs stat;
        int newdiskfree;
-       int ret;
 
        if (statvfs(core_folder, &stat) == 0) {
-               newdiskfree = (int)(stat.f_bavail / stat.f_blocks);
+               newdiskfree = (int)(100 * stat.f_bavail / stat.f_blocks);
 
                openlog("corewatcher", 0, LOG_KERN);
-               if ((newdiskfree < 10) && (diskfree >= 10)) {
-                       ret = system("echo \"\" > /proc/sys/kernel/core_pattern");
-                       if (ret != -1) {
-                               fprintf(stderr, "+ disabled core pattern, disk low %d%%",
-                                       newdiskfree);
-                               syslog(LOG_WARNING,
-                                       "Disabled kernel core_pattern, %s only has %d%% available",
-                                       core_folder, newdiskfree);
-                       }
-               }
-               if ((newdiskfree > 12) && (diskfree <= 12)) {
-                       char * proc_core_string = NULL;
-                       ret = asprintf(&proc_core_string,
-                                       "echo \"%score_%%e_%%t\" > /proc/sys/kernel/core_pattern",
-                                       core_folder);
-                       if (ret != -1) {
-                               ret = system(proc_core_string);
-                               free(proc_core_string);
-                               if (ret != -1) {
-                                       fprintf(stderr, "+ reenabled core pattern, disk %d%%",
-                                               newdiskfree);
-                                       syslog(LOG_WARNING,
-                                               "Reenabled kernel core_pattern, %s now has %d%% available",
-                                               core_folder, newdiskfree);
-                               }
-                       }
-               }
+               if ((newdiskfree < 10) && (diskfree >= 10))
+                       disable_corefiles(newdiskfree);
+               if ((newdiskfree > 12) && (diskfree <= 12))
+                       enable_corefiles(newdiskfree);
                closelog();
 
                diskfree = newdiskfree;
index 5061856..c3f3c9d 100644 (file)
@@ -203,6 +203,8 @@ int main(int argc, char**argv)
        if (inotify_thread == NULL)
                fprintf(stderr, "+ Unable to start inotify thread\n");
 
+       enable_corefiles(-1);
+
        /*
         * TODO: add a thread / event source tied to a connmand plugin
         *  o  network up: trigger scan_folders(), enables event sources
index fc18e90..be82929 100644 (file)
@@ -72,6 +72,7 @@ extern int scan_core_folder(void __unused *unused);
 extern void *scan_processed_folder(void __unused *unused);
 extern const char *core_folder;
 extern const char *processed_folder;
+extern void enable_corefiles(int diskfree);
 
 /* configfile.c */
 extern void read_config_file(char *filename);