diff options
author | Ondrej Čerman <ondrej.cerman@gmail.com> | 2018-11-27 23:25:42 +0100 |
---|---|---|
committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2018-11-30 04:57:38 -0800 |
commit | bca05f203758173c227aed228463fdddefcd8c6a (patch) | |
tree | 760dc8abb94d5279f62990ff9e4d41e97fe7bda3 /modules/devices | |
parent | 0f3cf14d062ccd89467ecd933081b18a4e6636b9 (diff) |
devices/storage: added udisks2 support
Diffstat (limited to 'modules/devices')
-rw-r--r-- | modules/devices/storage.c | 107 |
1 files changed, 101 insertions, 6 deletions
diff --git a/modules/devices/storage.c b/modules/devices/storage.c index d6192437..26b10097 100644 --- a/modules/devices/storage.c +++ b/modules/devices/storage.c @@ -20,12 +20,95 @@ #include "hardinfo.h" #include "devices.h" +#include "udisks2_util.h" gchar *storage_icons = NULL; +gboolean udisks2_available = FALSE; + +gboolean print_udisks2_info(const gchar *blockdev_name, gchar **str) { + udiskd *disk; + gchar *features = NULL; + + disk = get_udisks2_drive_info(blockdev_name); + if (disk == NULL) { + return FALSE; + } + + 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")); + } + + *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); + } + + g_free(features); + udiskd_free(disk); + + return TRUE; +} + +void print_scsi_dev_info(gint controller, gint channel, gint id, gint lun, gchar **str) { + gchar *path; + GDir *dir; + const gchar *entry; + + 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; + } + + 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 + } + } + + g_dir_close(dir); + g_free(path); +} /* SCSI support by Pascal F.Martin <pascalmartin@earthlink.net> */ -void -__scan_scsi_devices(void) +void __scan_scsi_devices(void) { FILE *proc_scsi; gchar buffer[256], *buf; @@ -127,14 +210,18 @@ __scan_scsi_devices(void) } strhash = h_strdup_cprintf(_("Type=%s\n" - "Revision=%s\n" - "[SCSI Controller]\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" "Controller=scsi%d\n" "Channel=%d\n" "ID=%d\n" "LUN=%d\n"), strhash, - type, - revision, scsi_controller, scsi_channel, scsi_id, @@ -376,3 +463,11 @@ void __scan_ide_devices(void) g_free(ide_storage_list); } } + +void storage_init(void) { + udisks2_available = udisks2_init(); +} + +void storage_shutdown(void) { + udisks2_shutdown(); +} |