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);  | 
