diff --git a/src/detection/diskio/diskio.c b/src/detection/diskio/diskio.c index 7dc4e548b..efac624b9 100644 --- a/src/detection/diskio/diskio.c +++ b/src/detection/diskio/diskio.c @@ -47,8 +47,8 @@ const char* ffDetectDiskIO(FFlist* result, FFDiskIOOptions* options) { FFDiskIOResult* icPrev = (FFDiskIOResult*)ffListGet(&ioCounters1, i); FFDiskIOResult* icCurr = (FFDiskIOResult*)ffListGet(result, i); - if (!ffStrbufEqual(&icPrev->name, &icCurr->name)) - return "Physical disk name changed"; + if (!ffStrbufEqual(&icPrev->devPath, &icCurr->devPath)) + return "Physical disk device path changed"; static_assert(sizeof(FFDiskIOResult) - offsetof(FFDiskIOResult, bytesRead) == sizeof(uint64_t) * 4, "Unexpected struct FFDiskIOResult layout"); for (size_t off = offsetof(FFDiskIOResult, bytesRead); off < sizeof(FFDiskIOResult); off += sizeof(uint64_t)) diff --git a/src/detection/diskio/diskio.h b/src/detection/diskio/diskio.h index 39e0a1d4a..0082b18b7 100644 --- a/src/detection/diskio/diskio.h +++ b/src/detection/diskio/diskio.h @@ -2,22 +2,10 @@ #include "fastfetch.h" -typedef enum FFDiskIOPhysicalType -{ - FF_DISKIO_PHYSICAL_TYPE_UNKNOWN, - FF_DISKIO_PHYSICAL_TYPE_HDD, - FF_DISKIO_PHYSICAL_TYPE_SSD, -} FFDiskIOPhysicalType; - typedef struct FFDiskIOResult { FFstrbuf name; - FFstrbuf interconnect; - FFstrbuf serial; FFstrbuf devPath; - FFDiskIOPhysicalType type; - uint64_t size; - bool removable; uint64_t bytesRead; uint64_t readCount; uint64_t bytesWritten; diff --git a/src/detection/diskio/diskio_apple.c b/src/detection/diskio/diskio_apple.c index ca1dd5248..bc5d57f25 100644 --- a/src/detection/diskio/diskio_apple.c +++ b/src/detection/diskio/diskio_apple.c @@ -46,15 +46,8 @@ const char* ffDiskIOGetIoCounters(FFlist* result, FFDiskIOOptions* options) continue; FFDiskIOResult* device = (FFDiskIOResult*) ffListAdd(result); - ffStrbufInit(&device->serial); ffStrbufInitS(&device->name, deviceName); ffStrbufInit(&device->devPath); - device->removable = false; - device->type = FF_DISKIO_PHYSICAL_TYPE_UNKNOWN; - device->size = 0; - - FF_CFTYPE_AUTO_RELEASE CFBooleanRef removable = IORegistryEntryCreateCFProperty(entryPartition, CFSTR(kIOMediaRemovableKey), kCFAllocatorDefault, kNilOptions); - device->removable = !!CFBooleanGetValue(removable); ffCfDictGetInt64(statistics, CFSTR(kIOBlockStorageDriverStatisticsBytesReadKey), (int64_t*) &device->bytesRead); ffCfDictGetInt64(statistics, CFSTR(kIOBlockStorageDriverStatisticsBytesWrittenKey), (int64_t*) &device->bytesWritten); @@ -67,36 +60,6 @@ const char* ffDiskIOGetIoCounters(FFlist* result, FFDiskIOOptions* options) ffCfStrGetString(bsdName, &device->devPath); ffStrbufPrependS(&device->devPath, "/dev/"); } - - FF_CFTYPE_AUTO_RELEASE CFNumberRef mediaSize = IORegistryEntryCreateCFProperty(entryPartition, CFSTR(kIOMediaSizeKey), kCFAllocatorDefault, kNilOptions); - if (mediaSize) - ffCfNumGetInt64(mediaSize, (int64_t*) &device->size); - else - device->size = 0; - - ffStrbufInit(&device->interconnect); - FF_IOOBJECT_AUTO_RELEASE io_registry_entry_t entryPhysical = 0; - if (IORegistryEntryGetParentEntry(entryDriver, kIOServicePlane, &entryPhysical) == KERN_SUCCESS) - { - FF_CFTYPE_AUTO_RELEASE CFDictionaryRef protocolCharacteristics = IORegistryEntryCreateCFProperty(entryPhysical, CFSTR(kIOPropertyProtocolCharacteristicsKey), kCFAllocatorDefault, kNilOptions); - if (protocolCharacteristics) - ffCfDictGetString(protocolCharacteristics, CFSTR(kIOPropertyPhysicalInterconnectTypeKey), &device->interconnect); - - FF_CFTYPE_AUTO_RELEASE CFDictionaryRef deviceCharacteristics = IORegistryEntryCreateCFProperty(entryPhysical, CFSTR(kIOPropertyDeviceCharacteristicsKey), kCFAllocatorDefault, kNilOptions); - if (deviceCharacteristics) - { - ffCfDictGetString(deviceCharacteristics, CFSTR(kIOPropertyProductSerialNumberKey), &device->serial); - - CFStringRef mediumType = (CFStringRef) CFDictionaryGetValue(deviceCharacteristics, CFSTR(kIOPropertyMediumTypeKey)); - if (mediumType) - { - if (CFStringCompare(mediumType, CFSTR(kIOPropertyMediumTypeSolidStateKey), 0) == 0) - device->type = FF_DISKIO_PHYSICAL_TYPE_SSD; - else if (CFStringCompare(mediumType, CFSTR(kIOPropertyMediumTypeRotationalKey), 0) == 0) - device->type = FF_DISKIO_PHYSICAL_TYPE_HDD; - } - } - } } return NULL; diff --git a/src/detection/diskio/diskio_bsd.c b/src/detection/diskio/diskio_bsd.c index 2fb969eb6..08ecb47cf 100644 --- a/src/detection/diskio/diskio_bsd.c +++ b/src/detection/diskio/diskio_bsd.c @@ -32,40 +32,25 @@ const char* ffDiskIOGetIoCounters(FFlist* result, FFDiskIOOptions* options) if (provider->lg_geom->lg_rank != 1) continue; - FF_STRBUF_AUTO_DESTROY name = ffStrbufCreateS(provider->lg_name); - FF_STRBUF_AUTO_DESTROY identifier = ffStrbufCreate(); - FFDiskIOPhysicalType type = FF_DISKIO_PHYSICAL_TYPE_UNKNOWN; + FF_STRBUF_AUTO_DESTROY name = ffStrbufCreate(); for (struct gconfig* ptr = provider->lg_config.lh_first; ptr; ptr = ptr->lg_config.le_next) { if (ffStrEquals(ptr->lg_name, "descr")) ffStrbufSetS(&name, ptr->lg_val); - else if (ffStrEquals(ptr->lg_name, "rotationrate") && !ffStrEquals(ptr->lg_val, "unknown")) - type = ffStrEquals(ptr->lg_val, "0") ? FF_DISKIO_PHYSICAL_TYPE_SSD : FF_DISKIO_PHYSICAL_TYPE_HDD; - else if (ffStrEquals(ptr->lg_name, "ident")) - ffStrbufSetS(&identifier, ptr->lg_val); } + if (name.length == 0) + ffStrbufSetS(&name, provider->lg_name); if (options->namePrefix.length && !ffStrbufStartsWith(&name, &options->namePrefix)) continue; FFDiskIOResult* device = (FFDiskIOResult*) ffListAdd(result); ffStrbufInitF(&device->devPath, "/dev/%s", provider->lg_name); - ffStrbufInitMove(&device->serial, &identifier); - ffStrbufInit(&device->interconnect); - device->removable = false; - switch (snapIter->device_type & DEVSTAT_TYPE_IF_MASK) - { - case DEVSTAT_TYPE_IF_SCSI: ffStrbufAppendS(&device->interconnect, "SCSI"); break; - case DEVSTAT_TYPE_IF_IDE: ffStrbufAppendS(&device->interconnect, "IDE"); break; - case DEVSTAT_TYPE_IF_OTHER: ffStrbufAppendS(&device->interconnect, "OTHER"); break; - } device->bytesRead = snapIter->bytes[DEVSTAT_READ]; device->readCount = snapIter->operations[DEVSTAT_READ]; device->bytesWritten = snapIter->bytes[DEVSTAT_WRITE]; device->writeCount = snapIter->operations[DEVSTAT_WRITE]; - device->size = (uint64_t) provider->lg_mediasize; ffStrbufInitMove(&device->name, &name); - device->type = type; } geom_stats_snapshot_free(snap); diff --git a/src/detection/diskio/diskio_linux.c b/src/detection/diskio/diskio_linux.c index d941c0e40..fc9ffe043 100644 --- a/src/detection/diskio/diskio_linux.c +++ b/src/detection/diskio/diskio_linux.c @@ -20,7 +20,6 @@ const char* ffDiskIOGetIoCounters(FFlist* result, FFDiskIOOptions* options) if (devName[0] == '.') continue; - char pathSysBlock[PATH_MAX]; snprintf(pathSysBlock, PATH_MAX, "/sys/block/%s", devName); @@ -58,22 +57,6 @@ const char* ffDiskIOGetIoCounters(FFlist* result, FFDiskIOOptions* options) } } - { - ffStrbufInit(&device->interconnect); - if (strstr(pathSysDeviceReal, "/usb") != NULL) - ffStrbufSetS(&device->interconnect, "usb"); - else - { - snprintf(pathSysBlock, PATH_MAX, "/sys/block/%s/device/transport", devName); - if (!ffAppendFileBuffer(pathSysBlock, &device->interconnect)) - { - snprintf(pathSysBlock, PATH_MAX, "/sys/block/%s/device/uevent", devName); - if (ffParsePropFile(pathSysBlock, "DEVTYPE=", &device->interconnect)) - ffStrbufSubstrBeforeLastC(&device->interconnect, '_'); - } - } - } - // I/Os merges sectors ticks ... uint64_t nRead, sectorRead, nWritten, sectorWritten; { @@ -91,40 +74,6 @@ const char* ffDiskIOGetIoCounters(FFlist* result, FFDiskIOOptions* options) device->bytesWritten = sectorWritten * 512; device->readCount = nRead; device->writeCount = nWritten; - - { - snprintf(pathSysBlock, PATH_MAX, "/sys/block/%s/queue/rotational", devName); - char isRotationalChar = '1'; - if (ffReadFileData(pathSysBlock, 1, &isRotationalChar)) - device->type = isRotationalChar == '1' ? FF_DISKIO_PHYSICAL_TYPE_HDD : FF_DISKIO_PHYSICAL_TYPE_SSD; - else - device->type = FF_DISKIO_PHYSICAL_TYPE_UNKNOWN; - } - - { - snprintf(pathSysBlock, PATH_MAX, "/sys/block/%s/size", devName); - char blkSize[32]; - ssize_t fileSize = ffReadFileData(pathSysBlock, sizeof(blkSize) - 1, blkSize); - if (fileSize > 0) - { - blkSize[fileSize] = 0; - device->size = (uint64_t) strtoul(blkSize, NULL, 10) * 512; - } - else - device->size = 0; - } - - { - char removableChar = '0'; - snprintf(pathSysBlock, PATH_MAX, "/sys/block/%s/removable", devName); - device->removable = removableChar == '1'; - } - - { - ffStrbufInit(&device->serial); - snprintf(pathSysBlock, PATH_MAX, "/sys/block/%s/device/serial", devName); - ffReadFileBuffer(pathSysBlock, &device->serial); - } } return NULL; diff --git a/src/detection/diskio/diskio_windows.c b/src/detection/diskio/diskio_windows.c index a0c18ffad..de7ef5c1c 100644 --- a/src/detection/diskio/diskio_windows.c +++ b/src/detection/diskio/diskio_windows.c @@ -1,8 +1,8 @@ #include "diskio.h" #include "common/io/io.h" -#include "util/windows/registry.h" #include "util/windows/unicode.h" +#include #include const char* ffDiskIOGetIoCounters(FFlist* result, FFDiskIOOptions* options) @@ -52,6 +52,9 @@ const char* ffDiskIOGetIoCounters(FFlist* result, FFDiskIOOptions* options) ffStrbufTrimRight(&device->name, ' '); } + if (!device->name.length) + ffStrbufAppendF(&device->name, "PhysicalDrive%u", (unsigned) idev); + if (options->namePrefix.length && !ffStrbufStartsWith(&device->name, &options->namePrefix)) { ffStrbufDestroy(&device->name); @@ -59,6 +62,8 @@ const char* ffDiskIOGetIoCounters(FFlist* result, FFDiskIOOptions* options) continue; } + ffStrbufInitWS(&device->devPath, szDevice); + DISK_PERFORMANCE dp = {}; if (DeviceIoControl(hDevice, IOCTL_DISK_PERFORMANCE, NULL, 0, &dp, sizeof(dp), &retSize, NULL)) { @@ -73,74 +78,6 @@ const char* ffDiskIOGetIoCounters(FFlist* result, FFDiskIOOptions* options) result->length--; continue; } - - ffStrbufInitWS(&device->devPath, szDevice); - ffStrbufInit(&device->serial); - if (sdd->SerialNumberOffset != 0) - { - ffStrbufSetS(&device->serial, (const char*) sddBuffer + sdd->SerialNumberOffset); - ffStrbufTrim(&device->serial, ' '); - } - - device->removable = !!sdd->RemovableMedia; - - ffStrbufInit(&device->interconnect); - switch (sdd->BusType) - { - case BusTypeUnknown: ffStrbufSetStatic(&device->interconnect, "Unknown"); break; - case BusTypeScsi: ffStrbufSetStatic(&device->interconnect, "Scsi"); break; - case BusTypeAtapi: ffStrbufSetStatic(&device->interconnect, "Atapi"); break; - case BusTypeAta: ffStrbufSetStatic(&device->interconnect, "Ata"); break; - case BusType1394: ffStrbufSetStatic(&device->interconnect, "1394"); break; - case BusTypeSsa: ffStrbufSetStatic(&device->interconnect, "Ssa"); break; - case BusTypeFibre: ffStrbufSetStatic(&device->interconnect, "Fibra"); break; - case BusTypeUsb: ffStrbufSetStatic(&device->interconnect, "Usb"); break; - case BusTypeRAID: ffStrbufSetStatic(&device->interconnect, "RAID"); break; - case BusTypeiScsi: ffStrbufSetStatic(&device->interconnect, "iScsi"); break; - case BusTypeSas: ffStrbufSetStatic(&device->interconnect, "Sas"); break; - case BusTypeSata: ffStrbufSetStatic(&device->interconnect, "Sata"); break; - case BusTypeSd: ffStrbufSetStatic(&device->interconnect, "Sd"); break; - case BusTypeMmc: ffStrbufSetStatic(&device->interconnect, "Mmc"); break; - case BusTypeVirtual: ffStrbufSetStatic(&device->interconnect, "Virtual"); break; - case BusTypeFileBackedVirtual: ffStrbufSetStatic(&device->interconnect, "FileBackedVirtual"); break; - case BusTypeSpaces: ffStrbufSetStatic(&device->interconnect, "Spaces"); break; - case BusTypeNvme: ffStrbufSetStatic(&device->interconnect, "Nvme"); break; - case BusTypeSCM: ffStrbufSetStatic(&device->interconnect, "SCM"); break; - case BusTypeUfs: ffStrbufSetStatic(&device->interconnect, "Ufs"); break; - default: ffStrbufSetF(&device->interconnect, "Unknown (%d)", (int) sdd->BusType); break; - } - - DEVICE_SEEK_PENALTY_DESCRIPTOR dspd = {}; - if(DeviceIoControl( - hDevice, - IOCTL_STORAGE_QUERY_PROPERTY, - &(STORAGE_PROPERTY_QUERY) { - .PropertyId = StorageDeviceSeekPenaltyProperty, - .QueryType = PropertyStandardQuery, - }, - sizeof(STORAGE_PROPERTY_QUERY), - &dspd, - sizeof(dspd), - &retSize, - NULL - ) && retSize == sizeof(dspd)) - device->type = dspd.IncursSeekPenalty ? FF_DISKIO_PHYSICAL_TYPE_HDD : FF_DISKIO_PHYSICAL_TYPE_SSD; - else - device->type = FF_DISKIO_PHYSICAL_TYPE_UNKNOWN; - - DISK_GEOMETRY_EX dge = {}; - if(DeviceIoControl( - hDevice, - IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, - NULL, - 0, - &dge, - sizeof(dge), - &retSize, - NULL)) - device->size = (uint64_t) dge.DiskSize.QuadPart; - else - device->size = 0; } return NULL; diff --git a/src/modules/diskio/diskio.c b/src/modules/diskio/diskio.c index 8387d0217..d92c21609 100644 --- a/src/modules/diskio/diskio.c +++ b/src/modules/diskio/diskio.c @@ -6,7 +6,7 @@ #include "util/stringUtils.h" #define FF_DISKIO_DISPLAY_NAME "Disk IO" -#define FF_DISKIO_NUM_FORMAT_ARGS 13 +#define FF_DISKIO_NUM_FORMAT_ARGS 8 static int sortDevices(const FFDiskIOResult* left, const FFDiskIOResult* right) { @@ -17,10 +17,7 @@ static void formatKey(const FFDiskIOOptions* options, FFDiskIOResult* dev, uint3 { if(options->moduleArgs.key.length == 0) { - if(!dev->name.length) - ffStrbufSetF(&dev->name, "unknown %u", (unsigned) index); - - ffStrbufSetF(key, FF_DISKIO_DISPLAY_NAME " (%s)", dev->name.chars); + ffStrbufSetF(key, FF_DISKIO_DISPLAY_NAME " (%s)", dev->name.length ? dev->name.chars : dev->devPath.chars); } else { @@ -74,36 +71,15 @@ void ffPrintDiskIO(FFDiskIOOptions* options) ffParseSize(dev->bytesWritten, &buffer2); ffStrbufAppendS(&buffer2, "/s"); - const char* physicalType; - switch(dev->type) - { - case FF_DISKIO_PHYSICAL_TYPE_HDD: - physicalType = "HDD"; - break; - case FF_DISKIO_PHYSICAL_TYPE_SSD: - physicalType = "SSD"; - break; - default: - physicalType = "Unknown"; - break; - } - FF_STRBUF_AUTO_DESTROY sizePretty = ffStrbufCreate(); - ffParseSize(dev->size, &sizePretty); - ffPrintFormatString(key.chars, 0, &options->moduleArgs, FF_PRINT_TYPE_NO_CUSTOM_KEY, FF_DISKIO_NUM_FORMAT_ARGS, (FFformatarg[]){ {FF_FORMAT_ARG_TYPE_STRBUF, &buffer}, {FF_FORMAT_ARG_TYPE_STRBUF, &buffer2}, {FF_FORMAT_ARG_TYPE_STRBUF, &dev->name}, - {FF_FORMAT_ARG_TYPE_STRBUF, &dev->interconnect}, - {FF_FORMAT_ARG_TYPE_STRING, physicalType}, {FF_FORMAT_ARG_TYPE_STRBUF, &dev->devPath}, {FF_FORMAT_ARG_TYPE_UINT64, &dev->bytesRead}, {FF_FORMAT_ARG_TYPE_UINT64, &dev->bytesWritten}, {FF_FORMAT_ARG_TYPE_UINT64, &dev->readCount}, {FF_FORMAT_ARG_TYPE_UINT64, &dev->writeCount}, - {FF_FORMAT_ARG_TYPE_STRBUF, &sizePretty}, - {FF_FORMAT_ARG_TYPE_STRBUF, &dev->serial}, - {FF_FORMAT_ARG_TYPE_BOOL, &dev->removable}, }); } ++index; @@ -112,9 +88,7 @@ void ffPrintDiskIO(FFDiskIOOptions* options) FF_LIST_FOR_EACH(FFDiskIOResult, dev, result) { ffStrbufDestroy(&dev->name); - ffStrbufDestroy(&dev->interconnect); ffStrbufDestroy(&dev->devPath); - ffStrbufDestroy(&dev->serial); } } @@ -184,35 +158,16 @@ void ffGenerateDiskIOJsonResult(FFDiskIOOptions* options, yyjson_mut_doc* doc, y { yyjson_mut_val* obj = yyjson_mut_arr_add_obj(doc, arr); yyjson_mut_obj_add_strbuf(doc, obj, "name", &dev->name); - yyjson_mut_obj_add_strbuf(doc, obj, "interconnectType", &dev->interconnect); yyjson_mut_obj_add_strbuf(doc, obj, "devPath", &dev->devPath); - - switch(dev->type) - { - case FF_DISKIO_PHYSICAL_TYPE_HDD: - yyjson_mut_obj_add_str(doc, obj, "physicalType", "HDD"); - break; - case FF_DISKIO_PHYSICAL_TYPE_SSD: - yyjson_mut_obj_add_str(doc, obj, "physicalType", "SSD"); - break; - default: - yyjson_mut_obj_add_null(doc, obj, "physicalType"); - break; - } - yyjson_mut_obj_add_uint(doc, obj, "bytesRead", dev->bytesRead); yyjson_mut_obj_add_uint(doc, obj, "bytesWritten", dev->bytesWritten); yyjson_mut_obj_add_uint(doc, obj, "readCount", dev->readCount); yyjson_mut_obj_add_uint(doc, obj, "writeCount", dev->writeCount); - yyjson_mut_obj_add_uint(doc, obj, "size", dev->size); - yyjson_mut_obj_add_strbuf(doc, obj, "serial", &dev->serial); - yyjson_mut_obj_add_bool(doc, obj, "removable", dev->removable); } FF_LIST_FOR_EACH(FFDiskIOResult, dev, result) { ffStrbufDestroy(&dev->name); - ffStrbufDestroy(&dev->interconnect); ffStrbufDestroy(&dev->devPath); } } @@ -223,16 +178,11 @@ void ffPrintDiskIOHelpFormat(void) "Size of data read per second (formatted)", "Size of data written per second (formatted)", "Device name", - "Device interconnect type", - "Device physical type (SSD / HDD)", "Device raw file path", "Size of data read per second (in bytes)", "Size of data written per second (in bytes)", "Number of reads", "Number of writes", - "Device size (formatted)", - "Serial number", - "Removable", }); }