diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/print_cpu_temperature.c | 365 | ||||
| -rw-r--r-- | src/print_cpu_usage.c | 32 | ||||
| -rw-r--r-- | src/print_disk_info.c | 33 | ||||
| -rw-r--r-- | src/print_load.c | 22 | 
4 files changed, 229 insertions, 223 deletions
| diff --git a/src/print_cpu_temperature.c b/src/print_cpu_temperature.c index fd2dd90..57cb114 100644 --- a/src/print_cpu_temperature.c +++ b/src/print_cpu_temperature.c @@ -44,17 +44,178 @@  #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); diff --git a/src/print_cpu_usage.c b/src/print_cpu_usage.c index 1753cf5..45a5ef2 100644 --- a/src/print_cpu_usage.c +++ b/src/print_cpu_usage.c @@ -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: diff --git a/src/print_disk_info.c b/src/print_disk_info.c index 624a8e2..d343fb8 100644 --- a/src/print_disk_info.c +++ b/src/print_disk_info.c @@ -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; diff --git a/src/print_load.c b/src/print_load.c index 7ba4ae1..6da2519 100644 --- a/src/print_load.c +++ b/src/print_load.c @@ -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); | 
