diff options
| -rw-r--r-- | hardinfo/udisks2_util.c | 50 | ||||
| -rw-r--r-- | includes/udisks2_util.h | 6 | ||||
| -rw-r--r-- | modules/devices/sensors.c | 21 | 
3 files changed, 77 insertions, 0 deletions
diff --git a/hardinfo/udisks2_util.c b/hardinfo/udisks2_util.c index 619cddf1..cd27bba1 100644 --- a/hardinfo/udisks2_util.c +++ b/hardinfo/udisks2_util.c @@ -211,10 +211,21 @@ GDBusConnection* get_udisks2_connection(void) {      return conn;  } +udiskt* udiskt_new() { +    return g_new0(udiskt, 1); +} +  udiskd* udiskd_new() {      return g_new0(udiskd, 1);  } +void udiskt_free(udiskt *u) { +    if (u) { +        g_free(u->drive); +        g_free(u); +    } +} +  void udiskd_free(udiskd *u) {      if (u) {          g_free(u->model); @@ -229,6 +240,41 @@ void udiskd_free(udiskd *u) {      }  } +gpointer get_udisks2_temp(const char *blockdev, GDBusProxy *drive){ +    GVariant *v; +    gboolean smart_enabled = FALSE; +    udiskt* disk_temp = NULL; + +    v = get_dbus_property(drive, UDISKS2_DRIVE_ATA_INTERFACE, "SmartEnabled"); +    if (v) { +        smart_enabled = g_variant_get_boolean(v); +        g_variant_unref(v); +    } + +    if (!smart_enabled) { +        return NULL; +    } + +    v = get_dbus_property(drive, UDISKS2_DRIVE_ATA_INTERFACE, "SmartTemperature"); +    if (v) { +        disk_temp = udiskt_new(); +        disk_temp->temperature = (gint32) g_variant_get_double(v) - 273.15; +        g_variant_unref(v); +    } + +    if (!disk_temp) { +        return NULL; +    } + +    v = get_dbus_property(drive, UDISKS2_DRIVE_INTERFACE, "Model"); +    if (v) { +        disk_temp->drive = g_variant_dup_string(v, NULL); +        g_variant_unref(v); +    } + +    return disk_temp; +} +  gpointer get_udisks2_drive_info(const char *blockdev, GDBusProxy *drive) {      GVariant *v;      const gchar *str; @@ -335,6 +381,10 @@ gpointer get_udisks2_drive_info(const char *blockdev, GDBusProxy *drive) {      return u;  } +GSList* get_udisks2_temps(void){ +    return udisks2_drives_func_caller(udisks2_conn, get_udisks2_temp); +} +  GSList* get_udisks2_all_drives_info(void){      return udisks2_drives_func_caller(udisks2_conn, get_udisks2_drive_info);  } diff --git a/includes/udisks2_util.h b/includes/udisks2_util.h index 6b0d9c53..db6753b7 100644 --- a/includes/udisks2_util.h +++ b/includes/udisks2_util.h @@ -18,6 +18,12 @@ typedef struct udiskd {      gint32 smart_temperature;  } udiskd; +typedef struct udiskt { +    gchar *drive; +    gint32 temperature; +} udiskt; +  void udisks2_init();  void udisks2_shutdown(); +GSList *get_udisks2_temps();  GSList *get_udisks2_all_drives_info(); diff --git a/modules/devices/sensors.c b/modules/devices/sensors.c index 7d041e06..c9181341 100644 --- a/modules/devices/sensors.c +++ b/modules/devices/sensors.c @@ -22,6 +22,7 @@  #include "expr.h"  #include "hardinfo.h"  #include "socket.h" +#include "udisks2_util.h"  gchar *sensors = NULL;  GHashTable *sensor_compute = NULL; @@ -510,6 +511,24 @@ static void read_sensors_hddtemp(void) {      }  } +void read_sensors_udisks2(void) { +    GSList *node; +    GSList *temps; +    udiskt *disk; + +    temps = get_udisks2_temps(); +    for (node = temps; node != NULL; node = node->next) { +        disk = (udiskt *)node->data; +        add_sensor("Hard Drive", +                   disk->drive, +                   "udisks2", +                   disk->temperature, +                   "\302\260C"); +        udiskt_free(disk); +    } +    g_slist_free(temps); +} +  void scan_sensors_do(void) {      g_free(sensors);      sensors = g_strdup(""); @@ -522,6 +541,8 @@ void scan_sensors_do(void) {      read_sensors_sys_thermal();      read_sensors_omnibook();      read_sensors_hddtemp(); +    read_sensors_udisks2(); +      /* FIXME: Add support for  ibm acpi and more sensors */  }  | 
