diff options
| author | sumuel <samuel@yakubos.org> | 2026-08-17 20:44:55 +0000 |
|---|---|---|
| committer | sumuel <samuel@yakubos.org> | 2026-08-17 20:44:55 +0000 |
| commit | 76424950e373d3b04ac3dd13019151bfba3e8423 (patch) | |
| tree | 4c3cfdbda039e592b9186be3e28f8d7cfd439e8a /src/detection/disk/disk_haiku.cpp | |
Add the files
Diffstat (limited to 'src/detection/disk/disk_haiku.cpp')
| -rw-r--r-- | src/detection/disk/disk_haiku.cpp | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/detection/disk/disk_haiku.cpp b/src/detection/disk/disk_haiku.cpp new file mode 100644 index 0000000..0987897 --- /dev/null +++ b/src/detection/disk/disk_haiku.cpp @@ -0,0 +1,74 @@ +extern "C" { +#include "disk.h" +#include "common/strutil.h" +} +#include <fs_info.h> +#include <Directory.h> +#include <Path.h> + +const char* ffDetectDisksImpl(FFDiskOptions* options, FFlist* disks) { + int32 pos = 0; + + for (dev_t dev; (dev = next_dev(&pos)) >= B_OK;) { + fs_info fs; + if (fs_stat_dev(dev, &fs) < 0) { + continue; + } + + node_ref node(fs.dev, fs.root); + BDirectory dir(&node); + BPath path(&dir); + if (path.InitCheck() != B_OK) { + continue; + } + + if (__builtin_expect(options->folders.length, 0)) { + if (!ffStrbufSeparatedContainS(&options->folders, path.Path(), FF_DISK_FOLDER_SEPARATOR)) { + continue; + } + } + + if (options->hideFolders.length && ffDiskMatchesFolderPatterns(&options->hideFolders, path.Path(), FF_DISK_FOLDER_SEPARATOR)) { + continue; + } + + if (options->hideFS.length && ffStrbufSeparatedContainS(&options->hideFS, fs.fsh_name, ':')) { + continue; + } + + FFDisk* disk = FF_LIST_ADD(FFDisk, *disks); + + disk->bytesTotal = (uint64_t) fs.total_blocks * (uint64_t) fs.block_size; + disk->bytesFree = (uint64_t) fs.free_blocks * (uint64_t) fs.block_size; + disk->bytesAvailable = disk->bytesFree; + disk->bytesUsed = 0; // To be filled in ./disk.c + + disk->filesTotal = (uint32_t) fs.total_nodes; + disk->filesUsed = (uint32_t) (fs.total_nodes - fs.free_nodes); + + ffStrbufInitS(&disk->mountFrom, fs.device_name); + ffStrbufInitS(&disk->mountpoint, path.Path()); + ffStrbufInitS(&disk->filesystem, fs.fsh_name); + ffStrbufInitS(&disk->name, fs.volume_name); + disk->type = FF_DISK_VOLUME_TYPE_NONE; + if (!(fs.flags & B_FS_IS_PERSISTENT)) { + disk->type = (FFDiskVolumeType) (disk->type | FF_DISK_VOLUME_TYPE_HIDDEN_BIT); + } + if (fs.flags & B_FS_IS_READONLY) { + disk->type = (FFDiskVolumeType) (disk->type | FF_DISK_VOLUME_TYPE_READONLY_BIT); + } + if (fs.flags & B_FS_IS_REMOVABLE) { + disk->type = (FFDiskVolumeType) (disk->type | FF_DISK_VOLUME_TYPE_EXTERNAL_BIT); + } + if (disk->type == FF_DISK_VOLUME_TYPE_NONE) { + disk->type = FF_DISK_VOLUME_TYPE_REGULAR_BIT; + } + disk->createTime = 0; + + time_t crTime; + if (dir.GetCreationTime(&crTime) == B_OK) { + disk->createTime = (uint64_t) crTime * 1000; + } + } + return NULL; +} |