diff options
| author | Ondrej Čerman <ondrej.cerman@gmail.com> | 2019-07-07 11:24:08 +0200 | 
|---|---|---|
| committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2019-07-10 12:25:23 -0700 | 
| commit | 51b6b209d270a646e82a70e9ea8450af6902504d (patch) | |
| tree | e1afcade64f258ee933f3e0bb5c6223b47fa0ba1 | |
| parent | d2a3384ac0348306b691657e8cb34f28cbfec550 (diff) | |
devices/storage: added partitions info
| -rw-r--r-- | hardinfo/udisks2_util.c | 86 | ||||
| -rw-r--r-- | includes/udisks2_util.h | 11 | ||||
| -rw-r--r-- | modules/devices/storage.c | 31 | 
3 files changed, 112 insertions, 16 deletions
| diff --git a/hardinfo/udisks2_util.c b/hardinfo/udisks2_util.c index 65d5efd2..37870fd9 100644 --- a/hardinfo/udisks2_util.c +++ b/hardinfo/udisks2_util.c @@ -14,6 +14,8 @@  #define UDISKS2_MANAGER_OBJ_PATH     "/org/freedesktop/UDisks2/Manager"  #define UDISKS2_BLOCK_DEVICES_PATH   "/org/freedesktop/UDisks2/block_devices" +#define STRDUP_IF_NOT_EMPTY(S) (g_strcmp0(S, "") == 0) ? NULL: g_strdup(S); +  GDBusConnection* udisks2_conn = NULL;  GVariant* get_dbus_property(GDBusProxy* proxy, const gchar *interface, @@ -216,6 +218,10 @@ udiskt* udiskt_new() {      return g_new0(udiskt, 1);  } +udiskp* udiskp_new() { +    return g_new0(udiskp, 1); +} +  udiskd* udiskd_new() {      return g_new0(udiskd, 1);  } @@ -227,6 +233,17 @@ void udiskt_free(udiskt *u) {      }  } +void udiskp_free(udiskp *u) { +    if (u) { +        g_free(u->block); +        g_free(u->type); +        g_free(u->version); +        g_free(u->label); +        udiskp_free(u->next); +        g_free(u); +    } +} +  void udiskd_free(udiskd *u) {      if (u) {          g_free(u->model); @@ -236,13 +253,63 @@ void udiskd_free(udiskd *u) {          g_free(u->serial);          g_free(u->connection_bus);          g_free(u->partition_table); -        g_free(u->partitions); +        udiskp_free(u->partitions);          g_free(u->media);          g_strfreev(u->media_compatibility);          g_free(u);      }  } +udiskp* get_udisks2_partition_info(const gchar *part_path) { +    GVariant *v; +    GDBusProxy *proxy; +    GError *error = NULL; +    udiskp* partition; +    const gchar *str; + +    if (!g_str_has_prefix(part_path, UDISKS2_BLOCK_DEVICES_PATH)) { +        return NULL; +    } + +    partition = udiskp_new(); +    partition->block = g_strdup(part_path + strlen(UDISKS2_BLOCK_DEVICES_PATH) + 1); + +    proxy = g_dbus_proxy_new_sync(udisks2_conn, G_DBUS_PROXY_FLAGS_NONE, +                                      NULL, UDISKS2_INTERFACE, part_path, +                                      DBUS_PROPERTIES_INTERFACE, NULL, &error); +    if (error == NULL) { +        v = get_dbus_property(proxy, UDISKS2_BLOCK_INTERFACE, "IdLabel"); +        if (v) { +            str = g_variant_get_string(v, NULL); +            partition->label = STRDUP_IF_NOT_EMPTY(str); +            g_variant_unref(v); +        } +        v = get_dbus_property(proxy, UDISKS2_BLOCK_INTERFACE, "IdType"); +        if (v) { +            str = g_variant_dup_string(v, NULL); +            partition->type = STRDUP_IF_NOT_EMPTY(str); +            g_variant_unref(v); +        } +        v = get_dbus_property(proxy, UDISKS2_BLOCK_INTERFACE, "IdVersion"); +        if (v) { +            str = g_variant_dup_string(v, NULL); +            partition->version = STRDUP_IF_NOT_EMPTY(str); +            g_variant_unref(v); +        } +        v = get_dbus_property(proxy, UDISKS2_BLOCK_INTERFACE, "Size"); +        if (v) { +            partition->size = g_variant_get_uint64(v); +            g_variant_unref(v); +        } +    } +    else{ +        g_error_free(error); +    } + +    g_object_unref(proxy); +    return partition; +} +  gpointer get_udisks2_temp(const char *blockdev, GDBusProxy *block, GDBusProxy *drive){      GVariant *v;      gboolean smart_enabled = FALSE; @@ -283,6 +350,7 @@ gpointer get_udisks2_drive_info(const char *blockdev, GDBusProxy *block, GDBusPr      GVariantIter *iter;      const gchar *str, *part;      udiskd *u = NULL; +    udiskp **p = NULL;      gsize n, i;      u = udiskd_new();      u->block_dev = g_strdup(blockdev); @@ -412,17 +480,15 @@ gpointer get_udisks2_drive_info(const char *blockdev, GDBusProxy *block, GDBusPr      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); -                } + +        p = &(u->partitions); +        while (g_variant_iter_loop (iter, "o", &str)) { +            *p = get_udisks2_partition_info(str); +            if (*p != NULL){ +                p = &((*p)->next);              }          } +          g_variant_iter_free (iter);          g_variant_unref(v);      } diff --git a/includes/udisks2_util.h b/includes/udisks2_util.h index 8a57a825..abaad8eb 100644 --- a/includes/udisks2_util.h +++ b/includes/udisks2_util.h @@ -1,3 +1,12 @@ +typedef struct udiskp { +    gchar *block; +    gchar *type; +    gchar *version; +    gchar *label; +    guint64 size; +    struct udiskp* next; +} udiskp; +  typedef struct udiskd {      gchar *model;      gchar *vendor; @@ -6,7 +15,7 @@ typedef struct udiskd {      gchar *serial;      gchar *connection_bus;      gchar *partition_table; -    gchar *partitions; +    udiskp *partitions;      gboolean ejectable;      gboolean removable;      gint32 rotation_rate; diff --git a/modules/devices/storage.c b/modules/devices/storage.c index f6aafdb7..9fd576a2 100644 --- a/modules/devices/storage.c +++ b/modules/devices/storage.c @@ -27,8 +27,9 @@ gchar *storage_icons = NULL;  gboolean __scan_udisks2_devices(void) {      GSList *node, *drives;      udiskd *disk; +    udiskp *part;      gchar *udisks2_storage_list = NULL, *features = NULL, *moreinfo = NULL; -    gchar *devid, *label, *media_comp = NULL; +    gchar *devid, *label, *tmp = NULL, *media_comp = NULL;      const gchar *url, *vendor_str, *media_label, *icon, *media_curr = NULL;      int n = 0, i, j; @@ -206,11 +207,31 @@ gboolean __scan_udisks2_devices(void) {          }          if (disk->partition_table || disk->partitions) {              moreinfo = h_strdup_cprintf(_("[Partition table]\n" -                                        "Type=%s\n" -                                        "Partitions=%s\n"), +                                        "Type=%s\n"),                                          moreinfo, -                                        disk->partition_table ? disk->partition_table : _("(Unknown)"), -                                        disk->partitions ? disk->partitions : _("(Unknown)")); +                                        disk->partition_table ? disk->partition_table : _("(Unknown)")); + +            if (disk->partitions != NULL) { +                part = disk->partitions; +                while (part != NULL){ + +                    tmp = size_human_readable((gfloat) part->size); +                    if (part->label) { +                        tmp = h_strdup_cprintf(" - %s", tmp, part->label); +                    } +                    if (part->type && part->version) { +                        tmp = h_strdup_cprintf(" (%s %s)", tmp, part->type, part->version); +                    } +                    else if (part->type) { +                        tmp = h_strdup_cprintf(" (%s)", tmp, part->type); +                    } +                    moreinfo = h_strdup_cprintf(_("Partition %s=%s\n"), +                                                moreinfo, +                                                part->block, tmp); +                    g_free(tmp); +                    part = part->next; +                } +            }          }          moreinfo_add_with_prefix("DEV", devid, moreinfo); | 
