diff options
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/devices.c | 11 | ||||
| -rw-r--r-- | modules/devices/storage.c | 217 | 
2 files changed, 139 insertions, 89 deletions
| diff --git a/modules/devices.c b/modules/devices.c index fa474180..1c3253e4 100644 --- a/modules/devices.c +++ b/modules/devices.c @@ -38,6 +38,7 @@  #include "devices.h"  #include "dt_util.h" +#include "udisks2_util.h"  gchar *callback_processors();  gchar *callback_gpu(); @@ -616,8 +617,10 @@ void scan_storage(gboolean reload)      g_free(storage_list);      storage_list = g_strdup(""); -    __scan_ide_devices(); -    __scan_scsi_devices(); +    if (!__scan_udisks2_devices()) { +        __scan_ide_devices(); +        __scan_scsi_devices(); +    }      SCAN_END();  } @@ -791,14 +794,14 @@ void hi_module_init(void)      init_memory_labels();      init_cups();      sensors_init(); -    storage_init(); +    udisks2_init();  }  void hi_module_deinit(void)  {      moreinfo_del_with_prefix("DEV");      sensors_shutdown(); -    storage_shutdown(); +    udisks2_shutdown();      g_hash_table_destroy(memlabels);      g_module_close(cups);  } diff --git a/modules/devices/storage.c b/modules/devices/storage.c index 26b10097..e5ad84b8 100644 --- a/modules/devices/storage.c +++ b/modules/devices/storage.c @@ -23,88 +23,146 @@  #include "udisks2_util.h"  gchar *storage_icons = NULL; -gboolean udisks2_available = FALSE; -gboolean print_udisks2_info(const gchar *blockdev_name, gchar **str) { +gboolean __scan_udisks2_devices(void) { +    GSList *node, *drives;      udiskd *disk; -    gchar *features = NULL; +    gchar *udisks2_storage_list = NULL, *features = NULL, *moreinfo = NULL; +    gchar *devid, *label; +    const gchar *url, *vendor_str, *icon; +    int n = 0, i; + +    static struct { +        char *media_prefix; +        char *icon; +    } media2icon[] = { +        { "thumb", "usbfldisk"}, +        { "flash", "usbfldisk"}, +        { "floppy", "media-floppy"}, +        { "optical", "cdrom"}, +        { NULL, NULL} +    }; + +    moreinfo_del_with_prefix("DEV:UDISKS"); +    udisks2_storage_list = g_strdup(_("\n[UDisks2]\n")); + +    drives = get_udisks2_all_drives_info(); +    for (node = drives; node != NULL; node = node->next) { +        disk = (udiskd *)node->data; +        devid = g_strdup_printf("UDISKS%d", n++); + +        if (disk->vendor && strlen(disk->vendor) > 0) { +            label = g_strdup_printf("%s %s", disk->vendor, disk->model); +            vendor_str = disk->vendor; +        } +        else{ +            label = g_strdup(disk->model); +            vendor_str = disk->model; +        } -    disk = get_udisks2_drive_info(blockdev_name); -    if (disk == NULL) { -        return FALSE; -    } +        icon = NULL; +        if (disk->media_compatibility){ +            for (i = 0; media2icon[i].media_prefix != NULL; i++) { +                if (g_str_has_prefix(disk->media_compatibility, +                                     media2icon[i].media_prefix)) { +                    icon = media2icon[i].icon; +                    break; +                } +            } +        } +        if (icon == NULL && disk->ejectable && g_strcmp0(disk->connection_bus, "usb") == 0) { +            icon = "usbfldisk"; +        } +        if (icon == NULL){ +            icon = "hdd"; +        } -    features = h_strdup_cprintf("%s", features, disk->removable ? _("Removable"): _("Fixed")); -    if (disk->ejectable) { -        features = h_strdup_cprintf(", %s", features, _("Ejectable")); -    } -    if (disk->smart_enabled) { -        features = h_strdup_cprintf(", %s", features, _("Smart monitoring")); -    } +        url = vendor_get_url(vendor_str); +        udisks2_storage_list = h_strdup_cprintf("$%s$%s=\n", udisks2_storage_list, devid, label); +        storage_icons = h_strdup_cprintf("Icon$%s$%s=%s.png\n", storage_icons, devid, label, icon); +        features = h_strdup_cprintf("%s", features, disk->removable ? _("Removable"): _("Fixed")); -    *str = h_strdup_cprintf(_(  "Block Device=%s\n" -                                "Serial=%s\n" -                                "Size=%s\n" -                                "Features=%s\n"), -                                *str, -                                disk->block_dev, -                                disk->serial, -                                size_human_readable((gfloat) disk->size), -                                features); - -    if (disk->rotation_rate > 0){ -        *str = h_strdup_cprintf(_("Rotation Rate=%d\n"), *str, disk->rotation_rate); -    } -    if (disk->media_compatibility || disk->media){ -        *str = h_strdup_cprintf(_(  "Media=%s\n" -                                    "Media compatibility=%s\n"), -                                    *str, -                                    disk->media ? disk->media : _("(None)"), -                                    disk->media_compatibility ? disk->media_compatibility : _("(Unknown)")); -    } -    if (disk->smart_enabled){ -        *str = h_strdup_cprintf(_(  "[Smart monitoring]\n" -                                    "Status=%s\n" -                                    "Bad Sectors=%ld\n" -                                    "Power on time=%d days %d hours\n" -                                    "Temperature=%d°C\n"), -                                    *str, -                                    disk->smart_failing ? _("Failing"): _("OK"), -                                    disk->smart_bad_sectors, -                                    disk->smart_poweron/(60*60*24), (disk->smart_poweron/60/60) % 24, -                                    disk->smart_temperature); -    } +        if (disk->ejectable) { +            features = h_strdup_cprintf(", %s", features, _("Ejectable")); +        } +        if (disk->smart_enabled) { +            features = h_strdup_cprintf(", %s", features, _("Smart monitoring")); +        } -    g_free(features); -    udiskd_free(disk); +        moreinfo = g_strdup_printf(_("[Drive Information]\n" +                                   "Model=%s\n"), +                                   label); +        if (url) { +            moreinfo = h_strdup_cprintf(_("Vendor=%s (%s)\n"), +                                         moreinfo, +                                         vendor_get_name(vendor_str), +                                         url); +        } +        else { +            moreinfo = h_strdup_cprintf(_("Vendor=%s\n"), +                                         moreinfo, +                                         vendor_get_name(vendor_str)); +        } -    return TRUE; -} +        moreinfo = h_strdup_cprintf(_("Revision=%s\n" +                                    "Block Device=%s\n" +                                    "Serial=%s\n" +                                    "Size=%s\n" +                                    "Features=%s\n"), +                                    moreinfo, +                                    disk->revision, +                                    disk->block_dev, +                                    disk->serial, +                                    size_human_readable((gfloat) disk->size), +                                    features); + +        if (disk->rotation_rate > 0) { +            moreinfo = h_strdup_cprintf(_("Rotation Rate=%d\n"), moreinfo, disk->rotation_rate); +        } +        if (disk->media_compatibility || disk->media) { +            moreinfo = h_strdup_cprintf(_("Media=%s\n" +                                        "Media compatibility=%s\n"), +                                        moreinfo, +                                        disk->media ? disk->media : _("(None)"), +                                        disk->media_compatibility ? disk->media_compatibility : _("(Unknown)")); +        } +        if (disk->connection_bus && strlen(disk->connection_bus) > 0) { +            moreinfo = h_strdup_cprintf(_("Connection bus=%s\n"), moreinfo, disk->connection_bus); +        } +        if (disk->smart_enabled) { +            moreinfo = h_strdup_cprintf(_("[Smart monitoring]\n" +                                        "Status=%s\n" +                                        "Bad Sectors=%ld\n" +                                        "Power on time=%d days %d hours\n" +                                        "Temperature=%d°C\n"), +                                        moreinfo, +                                        disk->smart_failing ? _("Failing"): _("OK"), +                                        disk->smart_bad_sectors, +                                        disk->smart_poweron/(60*60*24), (disk->smart_poweron/60/60) % 24, +                                        disk->smart_temperature); +        } + +        moreinfo_add_with_prefix("DEV", devid, moreinfo); +        g_free(devid); +        g_free(features); +        g_free(label); -void print_scsi_dev_info(gint controller, gint channel, gint id, gint lun, gchar **str) { -    gchar *path; -    GDir *dir; -    const gchar *entry; +        features = NULL; +        moreinfo = NULL; +        devid = NULL; -    path = g_strdup_printf("/sys/class/scsi_device/%d:%d:%d:%d/device/block/", controller, channel, id, lun); -    dir = g_dir_open(path, 0, NULL); -    if (!dir){ -        g_free(path); -        return; +        udiskd_free(disk);      } +    g_slist_free(drives); -    if ((entry = g_dir_read_name(dir))) { -        gboolean udisk_info = FALSE; -        if (udisks2_available) { -            udisk_info = print_udisks2_info(entry, str); -        } -        if (!udisk_info) { -            // TODO: fallback -        } +    if (n) { +        storage_list = h_strconcat(storage_list, udisks2_storage_list, NULL); +        g_free(udisks2_storage_list); +        return TRUE;      } -    g_dir_close(dir); -    g_free(path); +    g_free(udisks2_storage_list); +    return FALSE;  }  /* SCSI support by Pascal F.Martin <pascalmartin@earthlink.net> */ @@ -210,22 +268,19 @@ void __scan_scsi_devices(void)                  }                  strhash = h_strdup_cprintf(_("Type=%s\n" -                                           "Revision=%s\n"), -                                           strhash, -                                           type, -                                           revision); - -                print_scsi_dev_info(scsi_controller, scsi_channel, scsi_id, scsi_lun, &strhash); - -                strhash = h_strdup_cprintf(_("[SCSI Controller]\n" +                                           "Revision=%s\n" +                                           "[SCSI Controller]\n"                                             "Controller=scsi%d\n"                                             "Channel=%d\n"                                             "ID=%d\n" "LUN=%d\n"),                                             strhash, +                                           type, +                                           revision,                                             scsi_controller,                                             scsi_channel,                                             scsi_id,                                             scsi_lun); +                  moreinfo_add_with_prefix("DEV", devid, strhash);                  g_free(devid); @@ -463,11 +518,3 @@ void __scan_ide_devices(void)  	g_free(ide_storage_list);      }  } - -void storage_init(void) { -    udisks2_available = udisks2_init(); -} - -void storage_shutdown(void) { -    udisks2_shutdown(); -} | 
