]> git.sur5r.net Git - i3/i3status/commitdiff
Add 'format_below_threshold' option for 'disk' module
authorMihai Coman <mihai.cmn@gmail.com>
Mon, 14 Nov 2016 20:10:19 +0000 (22:10 +0200)
committerMihai Coman <mihai.cmn@gmail.com>
Mon, 14 Nov 2016 23:09:05 +0000 (01:09 +0200)
Add 'format_above_threshold' option for 'cpu_temperature' module
Add 'format_above_threshold' option for 'cpu_usage' module
Add 'format_above_threshold' option for 'load' module

i3status.c
include/i3status.h
src/print_cpu_temperature.c
src/print_cpu_usage.c
src/print_disk_info.c
src/print_load.c

index f48761201f1cef5e510157cc3359ab94850705aa..1968a97a9e7ab852a052e6f4fef61625d88bbdf3 100644 (file)
@@ -404,6 +404,7 @@ int main(int argc, char *argv[]) {
 
     cfg_opt_t load_opts[] = {
         CFG_STR("format", "%1min %5min %15min", CFGF_NONE),
+        CFG_STR("format_above_threshold", NULL, CFGF_NONE),
         CFG_FLOAT("max_threshold", 5, CFGF_NONE),
         CFG_CUSTOM_ALIGN_OPT,
         CFG_CUSTOM_COLOR_OPTS,
@@ -414,6 +415,8 @@ int main(int argc, char *argv[]) {
 
     cfg_opt_t usage_opts[] = {
         CFG_STR("format", "%usage", CFGF_NONE),
+        CFG_STR("format_above_threshold", NULL, CFGF_NONE),
+        CFG_STR("format_above_degraded_threshold", NULL, CFGF_NONE),
         CFG_FLOAT("max_threshold", 95, CFGF_NONE),
         CFG_FLOAT("degraded_threshold", 90, CFGF_NONE),
         CFG_CUSTOM_ALIGN_OPT,
@@ -425,6 +428,7 @@ int main(int argc, char *argv[]) {
 
     cfg_opt_t temp_opts[] = {
         CFG_STR("format", "%degrees C", CFGF_NONE),
+        CFG_STR("format_above_threshold", NULL, CFGF_NONE),
         CFG_STR("path", NULL, CFGF_NONE),
         CFG_INT("max_threshold", 75, CFGF_NONE),
         CFG_CUSTOM_ALIGN_OPT,
@@ -436,6 +440,7 @@ int main(int argc, char *argv[]) {
 
     cfg_opt_t disk_opts[] = {
         CFG_STR("format", "%free", CFGF_NONE),
+        CFG_STR("format_below_threshold", NULL, CFGF_NONE),
         CFG_STR("format_not_mounted", NULL, CFGF_NONE),
         CFG_STR("prefix_type", "binary", CFGF_NONE),
         CFG_STR("threshold_type", "percentage_avail", CFGF_NONE),
@@ -695,13 +700,13 @@ int main(int argc, char *argv[]) {
 
             CASE_SEC_TITLE("disk") {
                 SEC_OPEN_MAP("disk_info");
-                print_disk_info(json_gen, buffer, title, cfg_getstr(sec, "format"), cfg_getstr(sec, "format_not_mounted"), cfg_getstr(sec, "prefix_type"), cfg_getstr(sec, "threshold_type"), cfg_getfloat(sec, "low_threshold"));
+                print_disk_info(json_gen, buffer, title, cfg_getstr(sec, "format"), cfg_getstr(sec, "format_below_threshold"), cfg_getstr(sec, "format_not_mounted"), cfg_getstr(sec, "prefix_type"), cfg_getstr(sec, "threshold_type"), cfg_getfloat(sec, "low_threshold"));
                 SEC_CLOSE_MAP;
             }
 
             CASE_SEC("load") {
                 SEC_OPEN_MAP("load");
-                print_load(json_gen, buffer, cfg_getstr(sec, "format"), cfg_getfloat(sec, "max_threshold"));
+                print_load(json_gen, buffer, cfg_getstr(sec, "format"), cfg_getstr(sec, "format_above_threshold"), cfg_getfloat(sec, "max_threshold"));
                 SEC_CLOSE_MAP;
             }
 
@@ -735,13 +740,13 @@ int main(int argc, char *argv[]) {
 
             CASE_SEC_TITLE("cpu_temperature") {
                 SEC_OPEN_MAP("cpu_temperature");
-                print_cpu_temperature_info(json_gen, buffer, atoi(title), cfg_getstr(sec, "path"), cfg_getstr(sec, "format"), cfg_getint(sec, "max_threshold"));
+                print_cpu_temperature_info(json_gen, buffer, atoi(title), cfg_getstr(sec, "path"), cfg_getstr(sec, "format"), cfg_getstr(sec, "format_above_threshold"), cfg_getint(sec, "max_threshold"));
                 SEC_CLOSE_MAP;
             }
 
             CASE_SEC("cpu_usage") {
                 SEC_OPEN_MAP("cpu_usage");
-                print_cpu_usage(json_gen, buffer, cfg_getstr(sec, "format"), cfg_getfloat(sec, "max_threshold"), cfg_getfloat(sec, "degraded_threshold"));
+                print_cpu_usage(json_gen, buffer, cfg_getstr(sec, "format"), cfg_getstr(sec, "format_above_threshold"), cfg_getstr(sec, "format_above_degraded_threshold"), cfg_getfloat(sec, "max_threshold"), cfg_getfloat(sec, "degraded_threshold"));
                 SEC_CLOSE_MAP;
             }
         }
index d2b7064ae370ee32fcd47b62ddee9bbc60e4dff6..e1b11f976b838ded392b9ea557823391d9f60fdf 100644 (file)
@@ -205,7 +205,7 @@ typedef enum {
 const char *first_eth_interface(const net_type_t type);
 
 void print_ipv6_info(yajl_gen json_gen, char *buffer, const char *format_up, const char *format_down);
-void print_disk_info(yajl_gen json_gen, char *buffer, const char *path, const char *format, const char *format_not_mounted, const char *prefix_type, const char *threshold_type, const double low_threshold);
+void print_disk_info(yajl_gen json_gen, char *buffer, const char *path, const char *format, const char *format_below_threshold, const char *format_not_mounted, const char *prefix_type, const char *threshold_type, const double low_threshold);
 void print_battery_info(yajl_gen json_gen, char *buffer, int number, const char *path, const char *format, const char *format_down, const char *status_chr, const char *status_bat, const char *status_unk, const char *status_full, int low_threshold, char *threshold_type, bool last_full_capacity, bool integer_battery_capacity, bool hide_seconds);
 void print_time(yajl_gen json_gen, char *buffer, const char *title, const char *format, const char *tz, const char *locale, const char *format_time, time_t t);
 void print_ddate(yajl_gen json_gen, char *buffer, const char *format, time_t t);
@@ -213,10 +213,10 @@ const char *get_ip_addr(const char *interface);
 void print_wireless_info(yajl_gen json_gen, char *buffer, const char *interface, const char *format_up, const char *format_down);
 void print_run_watch(yajl_gen json_gen, char *buffer, const char *title, const char *pidfile, const char *format, const char *format_down);
 void print_path_exists(yajl_gen json_gen, char *buffer, const char *title, const char *path, const char *format, const char *format_down);
-void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const char *path, const char *format, int);
-void print_cpu_usage(yajl_gen json_gen, char *buffer, const char *format, const float max_threshold, const float degraded_threshold);
+void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const char *path, const char *format, const char *format_above_threshold, int);
+void print_cpu_usage(yajl_gen json_gen, char *buffer, const char *format, const char *format_above_threshold, const char *format_above_degraded_threshold, const float max_threshold, const float degraded_threshold);
 void print_eth_info(yajl_gen json_gen, char *buffer, const char *interface, const char *format_up, const char *format_down);
-void print_load(yajl_gen json_gen, char *buffer, const char *format, const float max_threshold);
+void print_load(yajl_gen json_gen, char *buffer, const char *format, const char *format_above_threshold, const float max_threshold);
 void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *fmt_muted, const char *device, const char *mixer, int mixer_idx);
 bool process_runs(const char *path);
 int volume_pulseaudio(uint32_t sink_idx, const char *sink_name);
index fd2dd90c796f8e17890e1787ff4d66c85d80c476..57cb1148fbc85fee35c65825a55911a154ede05d 100644 (file)
 #define MUKTOC(v) ((v - 273150000) / 1000000.0)
 #endif
 
+typedef struct temperature_s {
+    double raw_value;
+    char formatted_value[20];
+} temperature_t;
+
+#define ERROR_CODE 1
+
+static int read_temperature(char *thermal_zone, temperature_t *temperature) {
+#if defined(LINUX)
+    static char buf[16];
+    long int temp;
+
+    if (!slurp(thermal_zone, buf, sizeof(buf)))
+        return ERROR_CODE;
+
+    temp = strtol(buf, NULL, 10);
+    temperature->raw_value = temp / 1000;
+
+    if (temp == LONG_MIN || temp == LONG_MAX || temp <= 0)
+        strcpy(temperature->formatted_value, "?");
+    else
+        sprintf(temperature->formatted_value, "%ld", (temp / 1000));
+
+#elif defined(__DragonFly__)
+    struct sensor th_sensor;
+    size_t th_sensorlen;
+
+    th_sensorlen = sizeof(th_sensor);
+
+    if (sysctlbyname(thermal_zone, &th_sensor, &th_sensorlen, NULL, 0) == -1) {
+        perror("sysctlbyname");
+        return ERROR_CODE;
+    }
+
+    temperature->raw_value = MUKTOC(th_sensor.value);
+    sprintf(temperature->formatted_value, "%.2f", MUKTOC(th_sensor.value));
+
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+    int sysctl_rslt;
+    size_t sysctl_size = sizeof(sysctl_rslt);
+
+    if (sysctlbyname(thermal_zone, &sysctl_rslt, &sysctl_size, NULL, 0))
+        return ERROR_CODE;
+
+    temperature->raw_value = TZ_AVG(sysctl_rslt);
+    sprintf(temperature->formatted_value, "%d.%d", TZ_KELVTOC(sysctl_rslt));
+
+#elif defined(__OpenBSD__)
+    struct sensordev sensordev;
+    struct sensor sensor;
+    size_t sdlen, slen;
+    int dev, numt, mib[5] = {CTL_HW, HW_SENSORS, 0, 0, 0};
+
+    sdlen = sizeof(sensordev);
+    slen = sizeof(sensor);
+
+    for (dev = 0;; dev++) {
+        mib[2] = dev;
+        if (sysctl(mib, 3, &sensordev, &sdlen, NULL, 0) == -1) {
+            if (errno == ENXIO)
+                continue;
+            if (errno == ENOENT)
+                break;
+            return ERROR_CODE;
+        }
+        /* 'path' is the node within the full path (defaults to acpitz0). */
+        if (BEGINS_WITH(sensordev.xname, thermal_zone)) {
+            mib[3] = SENSOR_TEMP;
+            /* Limit to temo0, but should retrieve from a full path... */
+            for (numt = 0; numt < 1 /*sensordev.maxnumt[SENSOR_TEMP]*/; numt++) {
+                mib[4] = numt;
+                if (sysctl(mib, 5, &sensor, &slen, NULL, 0) == -1) {
+                    if (errno != ENOENT) {
+                        warn("sysctl");
+                        continue;
+                    }
+                }
+                temperature->raw_value = MUKTOC(sensor.value);
+                sprintf(temperature->formatted_value, "%.2f", MUKTOC(sensor.value));
+            }
+        }
+    }
+#elif defined(__NetBSD__)
+    int fd, rval;
+    bool err = false;
+    prop_dictionary_t dict;
+    prop_array_t array;
+    prop_object_iterator_t iter;
+    prop_object_iterator_t iter2;
+    prop_object_t obj, obj2, obj3;
+
+    fd = open("/dev/sysmon", O_RDONLY);
+    if (fd == -1)
+        return ERROR_CODE;
+
+    rval = prop_dictionary_recv_ioctl(fd, ENVSYS_GETDICTIONARY, &dict);
+    if (rval == -1) {
+        err = true;
+        goto error_netbsd1;
+    }
+
+    /* No drivers registered? */
+    if (prop_dictionary_count(dict) == 0) {
+        err = true;
+        goto error_netbsd2;
+    }
+
+    iter = prop_dictionary_iterator(dict);
+    if (iter == NULL) {
+        err = true;
+        goto error_netbsd2;
+    }
+
+    /* iterate over the dictionary returned by the kernel */
+    while ((obj = prop_object_iterator_next(iter)) != NULL) {
+        /* skip this dict if it's not what we're looking for */
+        if ((strlen(prop_dictionary_keysym_cstring_nocopy(obj)) != strlen(thermal_zone)) ||
+            (strncmp(thermal_zone,
+                     prop_dictionary_keysym_cstring_nocopy(obj),
+                     strlen(thermal_zone)) != 0))
+            continue;
+
+        array = prop_dictionary_get_keysym(dict, obj);
+        if (prop_object_type(array) != PROP_TYPE_ARRAY) {
+            err = true;
+            goto error_netbsd3;
+        }
+
+        iter2 = prop_array_iterator(array);
+        if (!iter2) {
+            err = true;
+            goto error_netbsd3;
+        }
+
+        /* iterate over array of dicts specific to target sensor */
+        while ((obj2 = prop_object_iterator_next(iter2)) != NULL) {
+            obj3 = prop_dictionary_get(obj2, "cur-value");
+
+            float temp = MUKTOC(prop_number_integer_value(obj3));
+            temperature->raw_value = temp;
+            sprintf(temperature->formatted_value, "%.2f", temp);
+
+            break;
+        }
+        prop_object_iterator_release(iter2);
+    }
+error_netbsd3:
+    prop_object_iterator_release(iter);
+error_netbsd2:
+    prop_object_release(dict);
+error_netbsd1:
+    close(fd);
+    if (err)
+        return ERROR_CODE;
+
+#endif
+    return 0;
+}
+
 /*
  * Reads the CPU temperature from /sys/class/thermal/thermal_zone%d/temp (or
  * the user provided path) and returns the temperature in degree celcius.
  *
  */
-void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const char *path, const char *format, int max_threshold) {
+void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const char *path, const char *format, const char *format_above_threshold, int max_threshold) {
     char *outwalk = buffer;
 #ifdef THERMAL_ZONE
+    const char *selected_format = format;
     const char *walk;
     bool colorful_output = false;
     char *thermal_zone;
+    temperature_t temperature;
 
     if (path == NULL)
         asprintf(&thermal_zone, THERMAL_ZONE, zone);
@@ -74,200 +235,32 @@ void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const
 
     INSTANCE(thermal_zone);
 
-    for (walk = format; *walk != '\0'; walk++) {
+    if (read_temperature(thermal_zone, &temperature) != 0)
+        goto error;
+
+    if (temperature.raw_value >= max_threshold) {
+        START_COLOR("color_bad");
+        colorful_output = true;
+        if (format_above_threshold != NULL)
+            selected_format = format_above_threshold;
+    }
+
+    for (walk = selected_format; *walk != '\0'; walk++) {
         if (*walk != '%') {
             *(outwalk++) = *walk;
             continue;
         }
-
         if (BEGINS_WITH(walk + 1, "degrees")) {
-#if defined(LINUX)
-            static char buf[16];
-            long int temp;
-            if (!slurp(thermal_zone, buf, sizeof(buf)))
-                goto error;
-            temp = strtol(buf, NULL, 10);
-            if (temp == LONG_MIN || temp == LONG_MAX || temp <= 0)
-                *(outwalk++) = '?';
-            else {
-                if ((temp / 1000) >= max_threshold) {
-                    START_COLOR("color_bad");
-                    colorful_output = true;
-                }
-                outwalk += sprintf(outwalk, "%ld", (temp / 1000));
-                if (colorful_output) {
-                    END_COLOR;
-                    colorful_output = false;
-                }
-            }
-#elif defined(__DragonFly__)
-            struct sensor th_sensor;
-            size_t th_sensorlen;
-
-            th_sensorlen = sizeof(th_sensor);
-
-            if (sysctlbyname(thermal_zone, &th_sensor, &th_sensorlen, NULL, 0) == -1) {
-                perror("sysctlbyname");
-                goto error;
-            }
-            if (MUKTOC(th_sensor.value) >= max_threshold) {
-                START_COLOR("color_bad");
-                colorful_output = true;
-            }
-            outwalk += sprintf(outwalk, "%.2f", MUKTOC(th_sensor.value));
-            if (colorful_output) {
-                END_COLOR;
-                colorful_output = false;
-            }
-
-#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
-            int sysctl_rslt;
-            size_t sysctl_size = sizeof(sysctl_rslt);
-            if (sysctlbyname(thermal_zone, &sysctl_rslt, &sysctl_size, NULL, 0))
-                goto error;
-
-            if (TZ_AVG(sysctl_rslt) >= max_threshold) {
-                START_COLOR("color_bad");
-                colorful_output = true;
-            }
-            outwalk += sprintf(outwalk, "%d.%d", TZ_KELVTOC(sysctl_rslt));
-            if (colorful_output) {
-                END_COLOR;
-                colorful_output = false;
-            }
-
-#elif defined(__OpenBSD__)
-            struct sensordev sensordev;
-            struct sensor sensor;
-            size_t sdlen, slen;
-            int dev, numt, mib[5] = {CTL_HW, HW_SENSORS, 0, 0, 0};
-
-            sdlen = sizeof(sensordev);
-            slen = sizeof(sensor);
-
-            for (dev = 0;; dev++) {
-                mib[2] = dev;
-                if (sysctl(mib, 3, &sensordev, &sdlen, NULL, 0) == -1) {
-                    if (errno == ENXIO)
-                        continue;
-                    if (errno == ENOENT)
-                        break;
-                    goto error;
-                }
-                /* 'path' is the node within the full path (defaults to acpitz0). */
-                if (BEGINS_WITH(sensordev.xname, thermal_zone)) {
-                    mib[3] = SENSOR_TEMP;
-                    /* Limit to temo0, but should retrieve from a full path... */
-                    for (numt = 0; numt < 1 /*sensordev.maxnumt[SENSOR_TEMP]*/; numt++) {
-                        mib[4] = numt;
-                        if (sysctl(mib, 5, &sensor, &slen, NULL, 0) == -1) {
-                            if (errno != ENOENT) {
-                                warn("sysctl");
-                                continue;
-                            }
-                        }
-                        if ((int)MUKTOC(sensor.value) >= max_threshold) {
-                            START_COLOR("color_bad");
-                            colorful_output = true;
-                        }
-
-                        outwalk += sprintf(outwalk, "%.2f", MUKTOC(sensor.value));
-
-                        if (colorful_output) {
-                            END_COLOR;
-                            colorful_output = false;
-                        }
-                    }
-                }
-            }
-#elif defined(__NetBSD__)
-            int fd, rval;
-            bool err = false;
-            prop_dictionary_t dict;
-            prop_array_t array;
-            prop_object_iterator_t iter;
-            prop_object_iterator_t iter2;
-            prop_object_t obj, obj2, obj3;
-
-            fd = open("/dev/sysmon", O_RDONLY);
-            if (fd == -1)
-                goto error;
-
-            rval = prop_dictionary_recv_ioctl(fd, ENVSYS_GETDICTIONARY, &dict);
-            if (rval == -1) {
-                err = true;
-                goto error_netbsd1;
-            }
-
-            /* No drivers registered? */
-            if (prop_dictionary_count(dict) == 0) {
-                err = true;
-                goto error_netbsd2;
-            }
-
-            iter = prop_dictionary_iterator(dict);
-            if (iter == NULL) {
-                err = true;
-                goto error_netbsd2;
-            }
-
-            /* iterate over the dictionary returned by the kernel */
-            while ((obj = prop_object_iterator_next(iter)) != NULL) {
-                /* skip this dict if it's not what we're looking for */
-                if ((strlen(prop_dictionary_keysym_cstring_nocopy(obj)) != strlen(thermal_zone)) ||
-                    (strncmp(thermal_zone,
-                             prop_dictionary_keysym_cstring_nocopy(obj),
-                             strlen(thermal_zone)) != 0))
-                    continue;
-
-                array = prop_dictionary_get_keysym(dict, obj);
-                if (prop_object_type(array) != PROP_TYPE_ARRAY) {
-                    err = true;
-                    goto error_netbsd3;
-                }
-
-                iter2 = prop_array_iterator(array);
-                if (!iter2) {
-                    err = true;
-                    goto error_netbsd3;
-                }
-
-                /* iterate over array of dicts specific to target sensor */
-                while ((obj2 = prop_object_iterator_next(iter2)) != NULL) {
-                    obj3 = prop_dictionary_get(obj2, "cur-value");
-
-                    float temp = MUKTOC(prop_number_integer_value(obj3));
-                    if ((int)temp >= max_threshold) {
-                        START_COLOR("color_bad");
-                        colorful_output = true;
-                    }
-
-                    outwalk += sprintf(outwalk, "%.2f", temp);
-
-                    if (colorful_output) {
-                        END_COLOR;
-                        colorful_output = false;
-                    }
-
-                    break;
-                }
-                prop_object_iterator_release(iter2);
-            }
-        error_netbsd3:
-            prop_object_iterator_release(iter);
-        error_netbsd2:
-            prop_object_release(dict);
-        error_netbsd1:
-            close(fd);
-            if (err)
-                goto error;
-
-#endif
-
+            outwalk += sprintf(outwalk, "%s", temperature.formatted_value);
             walk += strlen("degrees");
         }
     }
 
+    if (colorful_output) {
+        END_COLOR;
+        colorful_output = false;
+    }
+
     free(thermal_zone);
 
     OUTPUT_FULL_TEXT(buffer);
index 1753cf53044ea8cd307f00124507211ec695023b..45a5ef250f7ee1050f6f98b96b200a7a439ddb8e 100644 (file)
@@ -41,7 +41,8 @@ static int prev_idle = 0;
  * percentage.
  *
  */
-void print_cpu_usage(yajl_gen json_gen, char *buffer, const char *format, const float max_threshold, const float degraded_threshold) {
+void print_cpu_usage(yajl_gen json_gen, char *buffer, const char *format, const char *format_above_threshold, const char *format_above_degraded_threshold, const float max_threshold, const float degraded_threshold) {
+    const char *selected_format = format;
     const char *walk;
     char *outwalk = buffer;
     int curr_user = 0, curr_nice = 0, curr_system = 0, curr_idle = 0, curr_total;
@@ -96,29 +97,34 @@ void print_cpu_usage(yajl_gen json_gen, char *buffer, const char *format, const
 #else
     goto error;
 #endif
-    for (walk = format; *walk != '\0'; walk++) {
+
+    if (diff_usage >= max_threshold) {
+        START_COLOR("color_bad");
+        colorful_output = true;
+        if (format_above_threshold != NULL)
+            selected_format = format_above_threshold;
+    } else if (diff_usage >= degraded_threshold) {
+        START_COLOR("color_degraded");
+        colorful_output = true;
+        if (format_above_degraded_threshold != NULL)
+            selected_format = format_above_degraded_threshold;
+    }
+
+    for (walk = selected_format; *walk != '\0'; walk++) {
         if (*walk != '%') {
             *(outwalk++) = *walk;
             continue;
         }
 
-        if (diff_usage >= max_threshold) {
-            START_COLOR("color_bad");
-            colorful_output = true;
-        } else if (diff_usage >= degraded_threshold) {
-            START_COLOR("color_degraded");
-            colorful_output = true;
-        }
-
         if (BEGINS_WITH(walk + 1, "usage")) {
             outwalk += sprintf(outwalk, "%02d%s", diff_usage, pct_mark);
             walk += strlen("usage");
         }
-
-        if (colorful_output)
-            END_COLOR;
     }
 
+    if (colorful_output)
+        END_COLOR;
+
     OUTPUT_FULL_TEXT(buffer);
     return;
 error:
index 624a8e2f2c2431d3074c36c0957909a8ca9dcc07..d343fb89c1b94abe09271feb02a87da78c3235c1 100644 (file)
@@ -110,10 +110,12 @@ static bool below_threshold(struct statvfs buf, const char *prefix_type, const c
  * human readable manner.
  *
  */
-void print_disk_info(yajl_gen json_gen, char *buffer, const char *path, const char *format, const char *format_not_mounted, const char *prefix_type, const char *threshold_type, const double low_threshold) {
+void print_disk_info(yajl_gen json_gen, char *buffer, const char *path, const char *format, const char *format_below_threshold, const char *format_not_mounted, const char *prefix_type, const char *threshold_type, const double low_threshold) {
+    const char *selected_format = format;
     const char *walk;
     char *outwalk = buffer;
     bool colorful_output = false;
+    bool mounted = false;
 
     INSTANCE(path);
 
@@ -122,47 +124,48 @@ void print_disk_info(yajl_gen json_gen, char *buffer, const char *path, const ch
 
     if (statfs(path, &buf) == -1)
         return;
+
+    mounted = true;
 #elif defined(__NetBSD__)
     struct statvfs buf;
 
     if (statvfs(path, &buf) == -1)
         return;
+
+    mounted = true;
 #else
     struct statvfs buf;
 
-    if (format_not_mounted == NULL) {
-        format_not_mounted = "";
-    }
-
     if (statvfs(path, &buf) == -1) {
         /* If statvfs errors, e.g., due to the path not existing,
-         * we use the format for a not mounted device. */
-        format = format_not_mounted;
+         * we consider the device not mounted. */
+        mounted = false;
     } else {
         FILE *mntentfile = setmntent("/etc/mtab", "r");
         struct mntent *m;
-        bool found = false;
 
         while ((m = getmntent(mntentfile)) != NULL) {
             if (strcmp(m->mnt_dir, path) == 0) {
-                found = true;
+                mounted = true;
                 break;
             }
         }
         endmntent(mntentfile);
-
-        if (!found) {
-            format = format_not_mounted;
-        }
     }
 #endif
 
-    if (low_threshold > 0 && below_threshold(buf, prefix_type, threshold_type, low_threshold)) {
+    if (!mounted) {
+        if (format_not_mounted == NULL)
+            format_not_mounted = "";
+        selected_format = format_not_mounted;
+    } else if (low_threshold > 0 && below_threshold(buf, prefix_type, threshold_type, low_threshold)) {
         START_COLOR("color_bad");
         colorful_output = true;
+        if (format_below_threshold != NULL)
+            selected_format = format_below_threshold;
     }
 
-    for (walk = format; *walk != '\0'; walk++) {
+    for (walk = selected_format; *walk != '\0'; walk++) {
         if (*walk != '%') {
             *(outwalk++) = *walk;
             continue;
index 7ba4ae1a9534428cf3181f592b776130fe0b788f..6da2519c3d58496e58ecfac1491b767dd7fd17d3 100644 (file)
@@ -6,28 +6,31 @@
 #include <yajl/yajl_gen.h>
 #include <yajl/yajl_version.h>
 
-void print_load(yajl_gen json_gen, char *buffer, const char *format, const float max_threshold) {
+void print_load(yajl_gen json_gen, char *buffer, const char *format, const char *format_above_threshold, const float max_threshold) {
     char *outwalk = buffer;
 /* Get load */
 
 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(linux) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) || defined(sun) || defined(__DragonFly__)
     double loadavg[3];
+    const char *selected_format = format;
     const char *walk;
     bool colorful_output = false;
 
     if (getloadavg(loadavg, 3) == -1)
         goto error;
 
-    for (walk = format; *walk != '\0'; walk++) {
+    if (loadavg[0] >= max_threshold) {
+        START_COLOR("color_bad");
+        colorful_output = true;
+        if (format_above_threshold != NULL)
+            selected_format = format_above_threshold;
+    }
+
+    for (walk = selected_format; *walk != '\0'; walk++) {
         if (*walk != '%') {
             *(outwalk++) = *walk;
             continue;
         }
-        if (loadavg[0] >= max_threshold) {
-            START_COLOR("color_bad");
-            colorful_output = true;
-        }
-
         if (BEGINS_WITH(walk + 1, "1min")) {
             outwalk += sprintf(outwalk, "%1.2f", loadavg[0]);
             walk += strlen("1min");
@@ -42,10 +45,11 @@ void print_load(yajl_gen json_gen, char *buffer, const char *format, const float
             outwalk += sprintf(outwalk, "%1.2f", loadavg[2]);
             walk += strlen("15min");
         }
-        if (colorful_output)
-            END_COLOR;
     }
 
+    if (colorful_output)
+        END_COLOR;
+
     *outwalk = '\0';
     OUTPUT_FULL_TEXT(buffer);