[PATCH udisks] Expose SMART drive temperature as property DriveAtaSmartTemperature

Forest Bond forest at alittletooquiet.net
Tue May 3 11:28:40 PDT 2011


From: Forest Bond <forest.bond at rapidrollout.com>

---
 data/org.freedesktop.UDisks.Device.xml |    8 ++++++++
 src/device-private.c                   |   11 +++++++++++
 src/device-private.h                   |    2 ++
 src/device.c                           |   20 ++++++++++++++++++++
 tools/udisks.c                         |    3 +++
 5 files changed, 44 insertions(+), 0 deletions(-)

diff --git a/data/org.freedesktop.UDisks.Device.xml b/data/org.freedesktop.UDisks.Device.xml
index 8b76ccb..a7e120d 100644
--- a/data/org.freedesktop.UDisks.Device.xml
+++ b/data/org.freedesktop.UDisks.Device.xml
@@ -2419,6 +2419,14 @@
             is greater than zero.
       </doc:para></doc:description></doc:doc>
     </property>
+    <property name="DriveAtaSmartTemperature" type="t" access="read">
+      <doc:doc><doc:description><doc:para>
+            The temperature for the disk in mKelvin.
+            This property is only valid if
+            <doc:ref type="property" to="Device:DriveAtaSmartTimeCollected">DriveAtaSmartTimeCollected</doc:ref>
+            is greater than zero.
+      </doc:para></doc:description></doc:doc>
+    </property>
 
     <!-- **************************************************************************************************** -->
 
diff --git a/src/device-private.c b/src/device-private.c
index 22a0d35..d92ee8b 100644
--- a/src/device-private.c
+++ b/src/device-private.c
@@ -1401,6 +1401,17 @@ device_set_drive_ata_smart_blob_steal (Device *device,
   emit_changed (device, "drive_ata_smart_blob");
 }
 
+void
+device_set_drive_ata_smart_temperature (Device *device,
+                                        uint64_t value)
+{
+  if (device->priv->drive_ata_smart_temperature != value)
+    {
+      device->priv->drive_ata_smart_temperature = value;
+      emit_changed (device, "drive_ata_smart_temperature");
+    }
+}
+
 
 void
 device_set_linux_lvm2_lv_name (Device *device,
diff --git a/src/device-private.h b/src/device-private.h
index a6db7f2..5621179 100644
--- a/src/device-private.h
+++ b/src/device-private.h
@@ -227,6 +227,7 @@ struct DevicePrivate
   SkSmartOverall drive_ata_smart_status;
   void *drive_ata_smart_blob;
   gsize drive_ata_smart_blob_size;
+  uint64_t drive_ata_smart_temperature;
 
   gchar *linux_dmmp_component_holder;
 
@@ -392,6 +393,7 @@ void device_set_holders_objpath (Device *device, GStrv value);
 void device_set_drive_ata_smart_is_available (Device *device, gboolean value);
 void device_set_drive_ata_smart_time_collected (Device *device, guint64 value);
 void device_set_drive_ata_smart_status (Device *device, SkSmartOverall value);
+void device_set_drive_ata_smart_temperature (Device *device, uint64_t value);
 void device_set_drive_ata_smart_blob_steal (Device *device, gchar *blob, gsize blob_size);
 
 G_END_DECLS
diff --git a/src/device.c b/src/device.c
index 91c6cd1..edb21d7 100644
--- a/src/device.c
+++ b/src/device.c
@@ -275,6 +275,7 @@ enum
     PROP_DRIVE_ATA_SMART_TIME_COLLECTED,
     PROP_DRIVE_ATA_SMART_STATUS,
     PROP_DRIVE_ATA_SMART_BLOB,
+    PROP_DRIVE_ATA_SMART_TEMPERATURE,
 
     PROP_LINUX_MD_COMPONENT_LEVEL,
     PROP_LINUX_MD_COMPONENT_POSITION,
@@ -680,6 +681,9 @@ get_property (GObject *object,
         g_array_unref (a);
       }
       break;
+    case PROP_DRIVE_ATA_SMART_TEMPERATURE:
+      g_value_set_uint64 (value, device->priv->drive_ata_smart_temperature);
+      break;
 
     case PROP_LINUX_MD_COMPONENT_LEVEL:
       g_value_set_string (value, device->priv->linux_md_component_level);
@@ -1444,6 +1448,15 @@ device_class_init (DeviceClass *klass)
                                                        NULL,
                                                        dbus_g_type_get_collection ("GArray", G_TYPE_UCHAR),
                                                        G_PARAM_READABLE));
+  g_object_class_install_property (object_class,
+                                   PROP_DRIVE_ATA_SMART_TEMPERATURE,
+                                   g_param_spec_uint64 ("drive-ata-smart-temperature",
+                                                        NULL,
+                                                        NULL,
+                                                        0,
+                                                        G_MAXUINT64,
+                                                        0,
+                                                        G_PARAM_READABLE));
 
   g_object_class_install_property (object_class,
                                    PROP_LINUX_MD_COMPONENT_LEVEL,
@@ -9666,6 +9679,7 @@ drive_ata_smart_refresh_data_completed_cb (DBusGMethodInvocation *context,
   gsize blob_size;
   time_t time_collected;
   SkSmartOverall overall;
+  uint64_t temperature;
 
   PROFILE ("drive_ata_smart_refresh_data_completed_cb(device=%s) start", device->priv->native_path);
 
@@ -9758,8 +9772,14 @@ drive_ata_smart_refresh_data_completed_cb (DBusGMethodInvocation *context,
   PROFILE ("drive_ata_smart_refresh_data_completed_cb(device=%s) overall smart status", device->priv->native_path);
   if (sk_disk_smart_get_overall (d, &overall) != 0)
     overall = -1;
+
+  PROFILE ("drive_ata_smart_refresh_data_completed_cb(device=%s) temperature", device->priv->native_path);
+  if (sk_disk_smart_get_temperature (d, &temperature) != 0)
+    temperature = 0;
+
   device_set_drive_ata_smart_status (device, overall);
   device_set_drive_ata_smart_blob_steal (device, blob, blob_size);
+  device_set_drive_ata_smart_temperature (device, temperature);
   blob = NULL;
 
   /* emit change event since we've updated the smart data */
diff --git a/tools/udisks.c b/tools/udisks.c
index 6481efb..007fe9c 100644
--- a/tools/udisks.c
+++ b/tools/udisks.c
@@ -413,6 +413,7 @@ typedef struct
   gchar *drive_ata_smart_status;
   gchar *drive_ata_smart_blob;
   gsize drive_ata_smart_blob_size;
+  guint64 drive_ata_smart_temperature;
 
   char *linux_md_component_level;
   int linux_md_component_position;
@@ -689,6 +690,8 @@ collect_props (const char *key,
       props->drive_ata_smart_blob = g_memdup (a->data, a->len);
       props->drive_ata_smart_blob_size = a->len;
     }
+  else if (strcmp (key, "DriveAtaSmartTemperature") == 0)
+    props->drive_ata_smart_temperature = g_value_get_uint64 (value);
 
   else if (strcmp (key, "LinuxMdComponentLevel") == 0)
     props->linux_md_component_level = g_strdup (g_value_get_string (value));
-- 
1.7.0.4
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.freedesktop.org/archives/devkit-devel/attachments/20110503/288e22d9/attachment.pgp>


More information about the devkit-devel mailing list