summaryrefslogtreecommitdiff
path: root/plugins/udisks/udisks-plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/udisks/udisks-plugin.c')
-rw-r--r--plugins/udisks/udisks-plugin.c528
1 files changed, 256 insertions, 272 deletions
diff --git a/plugins/udisks/udisks-plugin.c b/plugins/udisks/udisks-plugin.c
index 702de64..be259a4 100644
--- a/plugins/udisks/udisks-plugin.c
+++ b/plugins/udisks/udisks-plugin.c
@@ -1,6 +1,4 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- * vim: sts=0 sw=8 ts=8 tw=78 noexpandtab
- *
+/*
* Copyright (C) 2009 Pramod Dematagoda <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
@@ -39,11 +37,11 @@
* Info about a single sensor
*/
typedef struct _DevInfo{
- gchar *path;
- gchar *id;
- gdouble temp;
- DBusGProxy *sensor_proxy;
- GError *error;
+ gchar *path;
+ gchar *id;
+ gdouble temp;
+ DBusGProxy *sensor_proxy;
+ GError *error;
} DevInfo;
const gchar *plugin_name = "udisks";
@@ -55,296 +53,282 @@ DBusGConnection *connection;
static void update_device(DevInfo *info)
{
- DBusGProxy *sensor_proxy;
- GValue smart_time = { 0, };
- SkDisk *sk_disk;
- GValue smart_blob_val = { 0, };
- GArray *smart_blob;
- guint64 temperature;
-
- g_return_if_fail(info != NULL);
-
- g_clear_error(&info->error);
-
- sensor_proxy = dbus_g_proxy_new_for_name(connection,
- UDISKS_BUS_NAME,
- info->path,
- UDISKS_PROPERTIES_INTERFACE);
-
- if (!dbus_g_proxy_call(sensor_proxy, "Get", NULL,
- G_TYPE_STRING, UDISKS_BUS_NAME,
- G_TYPE_STRING, "DriveAtaSmartTimeCollected", G_TYPE_INVALID,
- G_TYPE_VALUE, &smart_time,
- G_TYPE_INVALID) ||
- !g_value_get_uint64(&smart_time))
- {
- g_object_unref(sensor_proxy);
- return;
- }
-
- if (!dbus_g_proxy_call(sensor_proxy, "Get", &info->error,
- G_TYPE_STRING, UDISKS_BUS_NAME,
- G_TYPE_STRING, "DriveAtaSmartBlob", G_TYPE_INVALID,
- G_TYPE_VALUE, &smart_blob_val,
- G_TYPE_INVALID))
- {
- g_debug("Error getting DriveAtaSmartBlob %s",
- info->error ? info->error->message : "NULL");
- g_object_unref(sensor_proxy);
- return;
- }
- smart_blob = g_value_get_boxed(&smart_blob_val);
-
- sk_disk_open(NULL, &sk_disk);
- sk_disk_set_blob(sk_disk, smart_blob->data, smart_blob->len);
- if (sk_disk_smart_get_temperature(sk_disk, &temperature) < 0)
- {
- g_debug("Error getting temperature from AtaSmartBlob");
- g_free(sk_disk);
- g_array_free(smart_blob, TRUE);
- g_object_unref(sensor_proxy);
- return;
- }
-
- /* Temperature is in mK, so convert it to K first */
- temperature /= 1000;
- info->temp = (gdouble)temperature - 273.15;
-
- g_free(sk_disk);
- g_array_free(smart_blob, TRUE);
- g_object_unref(sensor_proxy);
+ DBusGProxy *sensor_proxy;
+ GValue smart_time = { 0, };
+ SkDisk *sk_disk;
+ GValue smart_blob_val = { 0, };
+ GArray *smart_blob;
+ guint64 temperature;
+
+ g_return_if_fail(info != NULL);
+
+ g_clear_error(&info->error);
+
+ sensor_proxy = dbus_g_proxy_new_for_name(connection,
+ UDISKS_BUS_NAME,
+ info->path,
+ UDISKS_PROPERTIES_INTERFACE);
+
+ if (!dbus_g_proxy_call(sensor_proxy, "Get", NULL,
+ G_TYPE_STRING, UDISKS_BUS_NAME,
+ G_TYPE_STRING, "DriveAtaSmartTimeCollected", G_TYPE_INVALID,
+ G_TYPE_VALUE, &smart_time,
+ G_TYPE_INVALID) ||
+ !g_value_get_uint64(&smart_time)) {
+
+ g_object_unref(sensor_proxy);
+ return;
+ }
+
+ if (!dbus_g_proxy_call(sensor_proxy, "Get", &info->error,
+ G_TYPE_STRING, UDISKS_BUS_NAME,
+ G_TYPE_STRING, "DriveAtaSmartBlob", G_TYPE_INVALID,
+ G_TYPE_VALUE, &smart_blob_val,
+ G_TYPE_INVALID)) {
+
+ g_debug("Error getting DriveAtaSmartBlob %s", info->error ? info->error->message : "NULL");
+ g_object_unref(sensor_proxy);
+ return;
+ }
+ smart_blob = g_value_get_boxed(&smart_blob_val);
+
+ sk_disk_open(NULL, &sk_disk);
+ sk_disk_set_blob(sk_disk, smart_blob->data, smart_blob->len);
+ if (sk_disk_smart_get_temperature(sk_disk, &temperature) < 0) {
+ g_debug("Error getting temperature from AtaSmartBlob");
+ g_free(sk_disk);
+ g_array_free(smart_blob, TRUE);
+ g_object_unref(sensor_proxy);
+ return;
+ }
+
+ /* Temperature is in mK, so convert it to K first */
+ temperature /= 1000;
+ info->temp = (gdouble)temperature - 273.15;
+
+ g_free(sk_disk);
+ g_array_free(smart_blob, TRUE);
+ g_object_unref(sensor_proxy);
}
/* This is the handler for the Changed() signal emitted by UDisks. */
static void udisks_changed_signal_cb(DBusGProxy *sensor_proxy) {
- const gchar *path;
- DevInfo *info;
+ const gchar *path;
+ DevInfo *info;
- path = dbus_g_proxy_get_path(sensor_proxy);
- g_debug("%s changed()", path);
- info = g_hash_table_lookup(devices, path);
+ path = dbus_g_proxy_get_path(sensor_proxy);
+ g_debug("%s changed()", path);
+ info = g_hash_table_lookup(devices, path);
- update_device(info);
+ update_device(info);
}
static void udisks_plugin_get_sensors(GList **sensors) {
- DBusGProxy *proxy, *sensor_proxy;
- GError *error = NULL;
- GPtrArray *paths;
- guint i;
- DevInfo *info;
-
- /* This connection will be used for everything, including the obtaining
- * of sensor data
- */
- connection = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);
- if (connection == NULL)
- {
- g_debug("Failed to open connection to DBUS: %s",
- error->message);
- g_error_free(error);
- return;
- }
-
- /* This is the proxy which is only used once during the enumeration of
- * the device object paths
- */
- proxy = dbus_g_proxy_new_for_name(connection,
- UDISKS_BUS_NAME,
- UDISKS_OBJECT_PATH,
- UDISKS_INTERFACE_NAME);
-
- /* The object paths of the disks are enumerated and placed in an array
- * of object paths
- */
- if (!dbus_g_proxy_call(proxy, "EnumerateDevices", &error,
- G_TYPE_INVALID,
- dbus_g_type_get_collection("GPtrArray",
- DBUS_TYPE_G_OBJECT_PATH),
- &paths,
- G_TYPE_INVALID))
- {
- g_debug("Failed to enumerate disk devices: %s",
- error->message);
- g_error_free(error);
- g_object_unref(proxy);
- dbus_g_connection_unref(connection);
- connection = NULL;
- return;
- }
-
- for (i = 0; i < paths->len; i++) {
- /* This proxy is used to get the required data in order to build
- * up the list of sensors
- */
- GValue smart_available = G_VALUE_INIT;
- gchar *path = (gchar *)g_ptr_array_index(paths, i);
-
- sensor_proxy = dbus_g_proxy_new_for_name(connection,
- UDISKS_BUS_NAME,
- path,
- UDISKS_PROPERTIES_INTERFACE);
-
- if (dbus_g_proxy_call(sensor_proxy, "Get", &error,
- G_TYPE_STRING,
- UDISKS_BUS_NAME,
- G_TYPE_STRING,
- "DriveAtaSmartIsAvailable",
- G_TYPE_INVALID,
- G_TYPE_VALUE, &smart_available, G_TYPE_INVALID)) {
- if (!g_value_get_boolean(&smart_available)) {
- g_debug("Drive at path '%s' does not support "
- "Smart monitoring... ignoring",
- path);
- g_object_unref(sensor_proxy);
- g_free (path);
- continue;
- }
-
- GValue model_v = G_VALUE_INIT;
- dbus_g_proxy_call(sensor_proxy, "Get", NULL,
- G_TYPE_STRING, UDISKS_BUS_NAME,
- G_TYPE_STRING, "DriveModel",
- G_TYPE_INVALID,
- G_TYPE_VALUE, &model_v,
- G_TYPE_INVALID);
-
- GValue dev_v = G_VALUE_INIT;
- dbus_g_proxy_call(sensor_proxy, "Get", NULL,
- G_TYPE_STRING, UDISKS_BUS_NAME,
- G_TYPE_STRING, "DeviceFile",
- G_TYPE_INVALID,
- G_TYPE_VALUE, &dev_v,
- G_TYPE_INVALID);
-
- GValue ids_v = G_VALUE_INIT;
- dbus_g_proxy_call(sensor_proxy, "Get", NULL,
- G_TYPE_STRING, UDISKS_BUS_NAME,
- G_TYPE_STRING, "DeviceFileById",
- G_TYPE_INVALID,
- G_TYPE_VALUE, &ids_v,
- G_TYPE_INVALID);
-
- g_object_unref(sensor_proxy);
-
- sensor_proxy = dbus_g_proxy_new_for_name(connection,
- UDISKS_BUS_NAME,
- path,
- UDISKS_DEVICE_INTERFACE_NAME);
-
- /* Use the Changed() signal emitted from UDisks to
- * get the temperature immediately if it changes rather
- * than waiting to poll
- */
- dbus_g_proxy_add_signal(sensor_proxy, "Changed",
- G_TYPE_INVALID);
-
- dbus_g_proxy_connect_signal(sensor_proxy, "Changed",
- G_CALLBACK(udisks_changed_signal_cb),
- path, NULL);
-
-
- gchar *model = g_value_get_string(&model_v);
- gchar *dev = g_value_get_string(&dev_v);
- GStrv ids = g_value_get_boxed(&ids_v);
-
- gchar *id = ids != NULL && ids[0] != NULL ? ids[0] : dev;
-
- info = g_malloc0(sizeof(DevInfo));
- if (devices == NULL)
- {
- devices = g_hash_table_new(g_str_hash,
- g_str_equal);
- }
- info->id = g_strdup(id);
- info->path = g_strdup(path);
- info->sensor_proxy = sensor_proxy;
- /* Set the device status changed as TRUE because we need
- * to get the initial temperature reading
- */
- info->temp = 0.0;
- g_hash_table_insert(devices, info->id, info);
-
- /* Write the sensor data */
- sensors_applet_plugin_add_sensor(sensors,
- id,
- "Disk Temperature",
- model,
- TEMP_SENSOR,
- FALSE,
- HDD_ICON,
- DEFAULT_GRAPH_COLOR);
- g_strfreev(ids);
- g_free(model);
- g_free(dev);
- g_debug("Added %s %s", path, id);
- } else {
- g_debug ("Cannot obtain data for device: %s\n"
- "Error: %s\n",
- path,
- error->message);
- g_error_free (error);
- error = NULL;
- g_object_unref(sensor_proxy);
- }
- g_free(path);
- }
- g_ptr_array_free(paths, TRUE);
- g_object_unref(proxy);
- if (devices == NULL)
- {
- dbus_g_connection_unref(connection);
- connection = NULL;
- }
+ DBusGProxy *proxy, *sensor_proxy;
+ GError *error = NULL;
+ GPtrArray *paths;
+ guint i;
+ DevInfo *info;
+
+ /* This connection will be used for everything, including the obtaining of sensor data */
+ connection = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);
+ if (connection == NULL)
+ {
+ g_debug("Failed to open connection to DBUS: %s", error->message);
+ g_error_free(error);
+ return;
+ }
+
+ /* This is the proxy which is only used once during the enumeration of the device object paths */
+ proxy = dbus_g_proxy_new_for_name(connection,
+ UDISKS_BUS_NAME,
+ UDISKS_OBJECT_PATH,
+ UDISKS_INTERFACE_NAME);
+
+ /* The object paths of the disks are enumerated and placed in an array of object paths */
+ if (!dbus_g_proxy_call(proxy, "EnumerateDevices", &error,
+ G_TYPE_INVALID,
+ dbus_g_type_get_collection("GPtrArray",
+ DBUS_TYPE_G_OBJECT_PATH),
+ &paths,
+ G_TYPE_INVALID)) {
+
+ g_debug("Failed to enumerate disk devices: %s", error->message);
+ g_error_free(error);
+ g_object_unref(proxy);
+ dbus_g_connection_unref(connection);
+ connection = NULL;
+ return;
+ }
+
+ for (i = 0; i < paths->len; i++) {
+ /* This proxy is used to get the required data in order to build up the list of sensors */
+ GValue smart_available = G_VALUE_INIT;
+ gchar *path = (gchar *)g_ptr_array_index(paths, i);
+
+ sensor_proxy = dbus_g_proxy_new_for_name(connection,
+ UDISKS_BUS_NAME,
+ path,
+ UDISKS_PROPERTIES_INTERFACE);
+
+ if (dbus_g_proxy_call(sensor_proxy, "Get", &error,
+ G_TYPE_STRING,
+ UDISKS_BUS_NAME,
+ G_TYPE_STRING,
+ "DriveAtaSmartIsAvailable",
+ G_TYPE_INVALID,
+ G_TYPE_VALUE, &smart_available, G_TYPE_INVALID)) {
+
+ if (!g_value_get_boolean(&smart_available)) {
+ g_debug("Drive at path '%s' does not support Smart monitoring... ignoring", path);
+ g_object_unref(sensor_proxy);
+ g_free (path);
+ continue;
+ }
+
+ GValue model_v = G_VALUE_INIT;
+ dbus_g_proxy_call(sensor_proxy, "Get", NULL,
+ G_TYPE_STRING, UDISKS_BUS_NAME,
+ G_TYPE_STRING, "DriveModel",
+ G_TYPE_INVALID,
+ G_TYPE_VALUE, &model_v,
+ G_TYPE_INVALID);
+
+ GValue dev_v = G_VALUE_INIT;
+ dbus_g_proxy_call(sensor_proxy, "Get", NULL,
+ G_TYPE_STRING, UDISKS_BUS_NAME,
+ G_TYPE_STRING, "DeviceFile",
+ G_TYPE_INVALID,
+ G_TYPE_VALUE, &dev_v,
+ G_TYPE_INVALID);
+
+ GValue ids_v = G_VALUE_INIT;
+ dbus_g_proxy_call(sensor_proxy, "Get", NULL,
+ G_TYPE_STRING, UDISKS_BUS_NAME,
+ G_TYPE_STRING, "DeviceFileById",
+ G_TYPE_INVALID,
+ G_TYPE_VALUE, &ids_v,
+ G_TYPE_INVALID);
+
+ g_object_unref(sensor_proxy);
+
+ sensor_proxy = dbus_g_proxy_new_for_name(connection,
+ UDISKS_BUS_NAME,
+ path,
+ UDISKS_DEVICE_INTERFACE_NAME);
+
+ /* Use the Changed() signal emitted from UDisks to
+ * get the temperature immediately if it changes rather
+ * than waiting to poll
+ */
+ dbus_g_proxy_add_signal(sensor_proxy, "Changed", G_TYPE_INVALID);
+
+ dbus_g_proxy_connect_signal(sensor_proxy, "Changed",
+ G_CALLBACK(udisks_changed_signal_cb),
+ path, NULL);
+
+ gchar *model = g_value_get_string(&model_v);
+ gchar *dev = g_value_get_string(&dev_v);
+ GStrv ids = g_value_get_boxed(&ids_v);
+
+ gchar *id = ids != NULL && ids[0] != NULL ? ids[0] : dev;
+
+ info = g_malloc0(sizeof(DevInfo));
+ if (devices == NULL)
+ {
+ devices = g_hash_table_new(g_str_hash, g_str_equal);
+ }
+ info->id = g_strdup(id);
+ info->path = g_strdup(path);
+ info->sensor_proxy = sensor_proxy;
+ /* Set the device status changed as TRUE because we need
+ * to get the initial temperature reading
+ */
+ info->temp = 0.0;
+ g_hash_table_insert(devices, info->id, info);
+
+ /* Write the sensor data */
+ sensors_applet_plugin_add_sensor(sensors,
+ id,
+ "Disk Temperature",
+ model,
+ TEMP_SENSOR,
+ FALSE,
+ HDD_ICON,
+ DEFAULT_GRAPH_COLOR);
+
+ g_strfreev(ids);
+ g_free(model);
+ g_free(dev);
+ g_debug("Added %s %s", path, id);
+ } else {
+ g_debug ("Cannot obtain data for device: %s\n"
+ "Error: %s\n",
+ path,
+ error->message);
+ g_error_free (error);
+ error = NULL;
+ g_object_unref(sensor_proxy);
+ }
+ g_free(path);
+ } /* end of for */
+
+ g_ptr_array_free(paths, TRUE);
+ g_object_unref(proxy);
+ if (devices == NULL)
+ {
+ dbus_g_connection_unref(connection);
+ connection = NULL;
+ }
}
static gdouble udisks_plugin_get_sensor_value(const gchar *path,
- const gchar *id,
- SensorType type,
- GError **error) {
- DevInfo *info;
-
- info = (DevInfo *)g_hash_table_lookup(devices, path);
- if (info == NULL)
- {
- g_set_error(error, SENSORS_APPLET_PLUGIN_ERROR, 0,
- "Error finding disk with path %s", path);
- return 0.0;
- }
-
- if (info->error)
- {
- *error = info->error;
- info->error = NULL;
- return 0.0;
- }
- /* update value since Changed() signal doesn't fire manually enough so
- * poll instead */
- update_device(info);
- return info->temp;
+ const gchar *id,
+ SensorType type,
+ GError **error) {
+ DevInfo *info;
+
+ info = (DevInfo *)g_hash_table_lookup(devices, path);
+ if (info == NULL)
+ {
+ g_set_error(error, SENSORS_APPLET_PLUGIN_ERROR, 0, "Error finding disk with path %s", path);
+ return 0.0;
+ }
+
+ if (info->error)
+ {
+ *error = info->error;
+ info->error = NULL;
+ return 0.0;
+ }
+
+ /* update value since Changed() signal doesn't fire manually enough so poll instead */
+ update_device(info);
+ return info->temp;
}
static GList *udisks_plugin_init(void) {
- GList *sensors = NULL;
+ GList *sensors = NULL;
- udisks_plugin_get_sensors(&sensors);
+ udisks_plugin_get_sensors(&sensors);
- return sensors;
+ return sensors;
}
const gchar *sensors_applet_plugin_name(void)
{
- return plugin_name;
+ return plugin_name;
}
GList *sensors_applet_plugin_init(void)
{
- return udisks_plugin_init();
+ return udisks_plugin_init();
}
gdouble sensors_applet_plugin_get_sensor_value(const gchar *path,
- const gchar *id,
- SensorType type,
- GError **error) {
- return udisks_plugin_get_sensor_value(path, id, type, error);
+ const gchar *id,
+ SensorType type,
+ GError **error) {
+
+ return udisks_plugin_get_sensor_value(path, id, type, error);
}