diff options
-rw-r--r-- | hardinfo/udisks2_util.c | 96 | ||||
-rw-r--r-- | includes/udisks2_util.h | 6 | ||||
-rw-r--r-- | modules/devices/storage.c | 19 |
3 files changed, 96 insertions, 25 deletions
diff --git a/hardinfo/udisks2_util.c b/hardinfo/udisks2_util.c index cd27bba1..02b70e9f 100644 --- a/hardinfo/udisks2_util.c +++ b/hardinfo/udisks2_util.c @@ -2,16 +2,17 @@ #include "udisks2_util.h" #include "hardinfo.h" -#define UDISKS2_INTERFACE "org.freedesktop.UDisks2" -#define UDISKS2_MANAGER_INTERFACE "org.freedesktop.UDisks2.Manager" -#define UDISKS2_BLOCK_INTERFACE "org.freedesktop.UDisks2.Block" -#define UDISKS2_LOOP_INTERFACE "org.freedesktop.UDisks2.Loop" -#define UDISKS2_PARTITION_INTERFACE "org.freedesktop.UDisks2.Partition" -#define UDISKS2_DRIVE_INTERFACE "org.freedesktop.UDisks2.Drive" -#define UDISKS2_DRIVE_ATA_INTERFACE "org.freedesktop.UDisks2.Drive.Ata" -#define DBUS_PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties" -#define UDISKS2_MANAGER_OBJ_PATH "/org/freedesktop/UDisks2/Manager" -#define UDISKS2_BLOCK_DEVICES_PATH "/org/freedesktop/UDisks2/block_devices" +#define UDISKS2_INTERFACE "org.freedesktop.UDisks2" +#define UDISKS2_MANAGER_INTERFACE "org.freedesktop.UDisks2.Manager" +#define UDISKS2_BLOCK_INTERFACE "org.freedesktop.UDisks2.Block" +#define UDISKS2_LOOP_INTERFACE "org.freedesktop.UDisks2.Loop" +#define UDISKS2_PARTITION_INTERFACE "org.freedesktop.UDisks2.Partition" +#define UDISKS2_PART_TABLE_INTERFACE "org.freedesktop.UDisks2.PartitionTable" +#define UDISKS2_DRIVE_INTERFACE "org.freedesktop.UDisks2.Drive" +#define UDISKS2_DRIVE_ATA_INTERFACE "org.freedesktop.UDisks2.Drive.Ata" +#define DBUS_PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties" +#define UDISKS2_MANAGER_OBJ_PATH "/org/freedesktop/UDisks2/Manager" +#define UDISKS2_BLOCK_DEVICES_PATH "/org/freedesktop/UDisks2/block_devices" GDBusConnection* udisks2_conn = NULL; @@ -94,8 +95,8 @@ GSList* get_block_dev_paths_from_sysfs(){ } GSList* udisks2_drives_func_caller(GDBusConnection* conn, - gpointer (*func)(const char*, GDBusProxy*)) { - GDBusProxy *proxy, *drive_proxy; + gpointer (*func)(const char*, GDBusProxy*, GDBusProxy*)) { + GDBusProxy *block_proxy, *drive_proxy; GVariant *block_v, *v; GSList *result_list = NULL, *block_dev_list, *node; GError *error = NULL; @@ -114,7 +115,7 @@ GSList* udisks2_drives_func_caller(GDBusConnection* conn, for (node = block_dev_list; node != NULL; node = node->next) { block_path = (gchar *)node->data; - proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE, + block_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE, NULL, UDISKS2_INTERFACE, block_path, DBUS_PROPERTIES_INTERFACE, NULL, &error); if (error){ @@ -124,18 +125,18 @@ GSList* udisks2_drives_func_caller(GDBusConnection* conn, } // Skip partitions - v = get_dbus_property(proxy, UDISKS2_PARTITION_INTERFACE, "Size"); + v = get_dbus_property(block_proxy, UDISKS2_PARTITION_INTERFACE, "Size"); if (v){ g_variant_unref(v); - g_object_unref(proxy); + g_object_unref(block_proxy); continue; } // Skip loop devices - v = get_dbus_property(proxy, UDISKS2_LOOP_INTERFACE, "BackingFile"); + v = get_dbus_property(block_proxy, UDISKS2_LOOP_INTERFACE, "BackingFile"); if (v){ g_variant_unref(v); - g_object_unref(proxy); + g_object_unref(block_proxy); continue; } @@ -143,7 +144,7 @@ GSList* udisks2_drives_func_caller(GDBusConnection* conn, drive_path = NULL; // let's find drive proxy - v = get_dbus_property(proxy, UDISKS2_BLOCK_INTERFACE, "Drive"); + v = get_dbus_property(block_proxy, UDISKS2_BLOCK_INTERFACE, "Drive"); if (v){ drive_path = g_variant_get_string(v, NULL); @@ -155,7 +156,7 @@ GSList* udisks2_drives_func_caller(GDBusConnection* conn, if (error == NULL) { // call requested function - output = func(block_dev, drive_proxy); + output = func(block_dev, block_proxy, drive_proxy); if (output != NULL){ result_list = g_slist_append(result_list, output); @@ -169,7 +170,7 @@ GSList* udisks2_drives_func_caller(GDBusConnection* conn, } g_variant_unref(v); } - g_object_unref(proxy); + g_object_unref(block_proxy); } g_slist_free_full(block_dev_list, g_free); @@ -234,13 +235,15 @@ void udiskd_free(udiskd *u) { g_free(u->block_dev); g_free(u->serial); g_free(u->connection_bus); + g_free(u->partition_table); + g_free(u->partitions); g_free(u->media); g_free(u->media_compatibility); g_free(u); } } -gpointer get_udisks2_temp(const char *blockdev, GDBusProxy *drive){ +gpointer get_udisks2_temp(const char *blockdev, GDBusProxy *block, GDBusProxy *drive){ GVariant *v; gboolean smart_enabled = FALSE; udiskt* disk_temp = NULL; @@ -275,9 +278,10 @@ gpointer get_udisks2_temp(const char *blockdev, GDBusProxy *drive){ return disk_temp; } -gpointer get_udisks2_drive_info(const char *blockdev, GDBusProxy *drive) { +gpointer get_udisks2_drive_info(const char *blockdev, GDBusProxy *block, GDBusProxy *drive) { GVariant *v; - const gchar *str; + GVariantIter *iter; + const gchar *str, *part; udiskd *u = NULL; u = udiskd_new(); @@ -328,7 +332,6 @@ gpointer get_udisks2_drive_info(const char *blockdev, GDBusProxy *drive) { } v = get_dbus_property(drive, UDISKS2_DRIVE_INTERFACE, "MediaCompatibility"); if (v){ - GVariantIter *iter; g_variant_get(v, "as", &iter); while (g_variant_iter_loop (iter, "s", &str)){ if (u->media_compatibility == NULL){ @@ -351,6 +354,26 @@ gpointer get_udisks2_drive_info(const char *blockdev, GDBusProxy *drive) { u->removable = g_variant_get_boolean(v); g_variant_unref(v); } + v = get_dbus_property(drive, UDISKS2_DRIVE_ATA_INTERFACE, "PmSupported"); + if (v){ + u->pm_supported = g_variant_get_boolean(v); + g_variant_unref(v); + } + v = get_dbus_property(drive, UDISKS2_DRIVE_ATA_INTERFACE, "ApmSupported"); + if (v){ + u->apm_supported = g_variant_get_boolean(v); + g_variant_unref(v); + } + v = get_dbus_property(drive, UDISKS2_DRIVE_ATA_INTERFACE, "AamSupported"); + if (v){ + u->aam_supported = g_variant_get_boolean(v); + g_variant_unref(v); + } + v = get_dbus_property(drive, UDISKS2_DRIVE_ATA_INTERFACE, "SmartSupported"); + if (v){ + u->smart_supported = g_variant_get_boolean(v); + g_variant_unref(v); + } v = get_dbus_property(drive, UDISKS2_DRIVE_ATA_INTERFACE, "SmartEnabled"); if (v){ u->smart_enabled = g_variant_get_boolean(v); @@ -378,6 +401,31 @@ gpointer get_udisks2_drive_info(const char *blockdev, GDBusProxy *drive) { g_variant_unref(v); } } + + v = get_dbus_property(block, UDISKS2_PART_TABLE_INTERFACE, "Type"); + if (v){ + u->partition_table = g_variant_dup_string(v, NULL); + g_variant_unref(v); + } + // 'Partitions' property is available in udisks2 version 2.7.2 or newer + v = get_dbus_property(block, UDISKS2_PART_TABLE_INTERFACE, "Partitions"); + if (v){ + g_variant_get(v, "ao", &iter); + while (g_variant_iter_loop (iter, "o", &str)){ + if (g_str_has_prefix(str, UDISKS2_BLOCK_DEVICES_PATH)){ + part = str + strlen(UDISKS2_BLOCK_DEVICES_PATH) + 1; + if (u->partitions == NULL){ + u->partitions = g_strdup(part); + } + else{ + u->partitions = h_strdup_cprintf(", %s", u->partitions, part); + } + } + } + g_variant_iter_free (iter); + g_variant_unref(v); + } + return u; } diff --git a/includes/udisks2_util.h b/includes/udisks2_util.h index db6753b7..df72e830 100644 --- a/includes/udisks2_util.h +++ b/includes/udisks2_util.h @@ -5,12 +5,18 @@ typedef struct udiskd { gchar *block_dev; gchar *serial; gchar *connection_bus; + gchar *partition_table; + gchar *partitions; gboolean ejectable; gboolean removable; gint32 rotation_rate; gint64 size; gchar *media; gchar *media_compatibility; + gboolean pm_supported; + gboolean aam_supported; + gboolean apm_supported; + gboolean smart_supported; gboolean smart_enabled; gboolean smart_failing; guint64 smart_poweron; diff --git a/modules/devices/storage.c b/modules/devices/storage.c index e5ad84b8..cb2cc590 100644 --- a/modules/devices/storage.c +++ b/modules/devices/storage.c @@ -85,9 +85,18 @@ gboolean __scan_udisks2_devices(void) { if (disk->ejectable) { features = h_strdup_cprintf(", %s", features, _("Ejectable")); } - if (disk->smart_enabled) { + if (disk->smart_supported) { features = h_strdup_cprintf(", %s", features, _("Smart monitoring")); } + if (disk->pm_supported) { + features = h_strdup_cprintf(", %s", features, _("Power Managment")); + } + if (disk->apm_supported) { + features = h_strdup_cprintf(", %s", features, _("Advanced Power Management")); + } + if (disk->aam_supported) { + features = h_strdup_cprintf(", %s", features, _("Automatic Acoustic Management")); + } moreinfo = g_strdup_printf(_("[Drive Information]\n" "Model=%s\n"), @@ -141,6 +150,14 @@ gboolean __scan_udisks2_devices(void) { disk->smart_poweron/(60*60*24), (disk->smart_poweron/60/60) % 24, disk->smart_temperature); } + if (disk->partition_table || disk->partitions) { + moreinfo = h_strdup_cprintf(_("[Partition table]\n" + "Type=%s\n" + "Partitions=%s\n"), + moreinfo, + disk->partition_table ? disk->partition_table : _("(Unknown)"), + disk->partitions ? disk->partitions : _("(Unknown)")); + } moreinfo_add_with_prefix("DEV", devid, moreinfo); g_free(devid); |