diff options
| author | Arnaud Degroote <degroote@NetBSD.org> | 2013-10-06 21:18:53 +0000 | 
|---|---|---|
| committer | Michael Stapelberg <michael@stapelberg.de> | 2013-10-07 19:32:50 +0200 | 
| commit | c6e9fc84c6a7213b31d9e2790ea36d42ee10e809 (patch) | |
| tree | 9d9145bbd3c8c6521937ecfdc62c5f16d722781b /src | |
| parent | 32551729e886a7a6bae4cf53cadceb3079c6cac2 (diff) | |
Add support for cpu temperature on NetBSD (using envsys(4))
Diffstat (limited to 'src')
| -rw-r--r-- | src/print_cpu_temperature.c | 89 | 
1 files changed, 89 insertions, 0 deletions
| diff --git a/src/print_cpu_temperature.c b/src/print_cpu_temperature.c index aefbcfb..8bd39a4 100644 --- a/src/print_cpu_temperature.c +++ b/src/print_cpu_temperature.c @@ -28,6 +28,15 @@  #define MUKTOC(v) ((v - 273150000) / 1000000.0)  #endif +#if defined(__NetBSD__) +#include <fcntl.h> +#include <prop/proplib.h> +#include <sys/envsys.h> + +#define MUKTOC(v) ((v - 273150000) / 1000000.0) +#endif + +  static char *thermal_zone;  /* @@ -135,7 +144,87 @@ void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const                          }                  }          } +#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; +        } + +        /* print sensors for all devices registered */ +        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) { +                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 the array of dictionaries */ +                while ((obj2 = prop_object_iterator_next(iter2)) != NULL) { +                        obj3 = prop_dictionary_get(obj2, "description"); +                        if (obj3 && +                            strcmp(path, prop_string_cstring_nocopy(obj3)) == 0) +                        { +                                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 + +                          walk += strlen("degrees");                  }          } | 
