Files
fastfetch/src/detection/disk/disk_bsd.c
T

96 lines
3.2 KiB
C
Raw Normal View History

2022-10-27 14:58:29 +08:00
#include "disk.h"
#include "util/mallocHelper.h"
#include "util/stringUtils.h"
2022-10-27 14:58:29 +08:00
#include <sys/mount.h>
#ifdef __FreeBSD__
static void detectFsInfo(struct statfs* fs, FFDisk* disk)
{
2023-08-18 21:23:23 +08:00
if(ffStrbufEqualS(&disk->filesystem, "zfs"))
{
disk->type = !ffStrbufStartsWithS(&disk->mountFrom, "zroot/") || ffStrbufStartsWithS(&disk->mountFrom, "zroot/ROOT/")
2023-08-26 09:32:19 +08:00
? FF_DISK_VOLUME_TYPE_REGULAR_BIT
: FF_DISK_VOLUME_TYPE_SUBVOLUME_BIT;
2023-08-18 21:23:23 +08:00
}
else if(ffStrbufStartsWithS(&disk->mountpoint, "/boot") || ffStrbufStartsWithS(&disk->mountpoint, "/efi"))
2023-08-26 09:32:19 +08:00
disk->type = FF_DISK_VOLUME_TYPE_HIDDEN_BIT;
2023-08-18 21:23:23 +08:00
else if(!(fs->f_flags & MNT_LOCAL))
2023-08-26 09:32:19 +08:00
disk->type = FF_DISK_VOLUME_TYPE_EXTERNAL_BIT;
2022-10-27 14:58:29 +08:00
else
2023-08-26 09:32:19 +08:00
disk->type = FF_DISK_VOLUME_TYPE_REGULAR_BIT;
}
#elif __APPLE__
#include <sys/attr.h>
#include <unistd.h>
struct VolAttrBuf {
uint32_t length;
attrreference_t volNameRef;
char volNameSpace[MAXPATHLEN];
} __attribute__((aligned(4), packed));
void detectFsInfo(struct statfs* fs, FFDisk* disk)
{
if(fs->f_flags & MNT_DONTBROWSE)
disk->type = FF_DISK_VOLUME_TYPE_HIDDEN_BIT;
else if(fs->f_flags & MNT_REMOVABLE || !(fs->f_flags & MNT_LOCAL))
disk->type = FF_DISK_VOLUME_TYPE_EXTERNAL_BIT;
else
disk->type = FF_DISK_VOLUME_TYPE_REGULAR_BIT;
2022-10-27 14:58:29 +08:00
struct VolAttrBuf attrBuf;
if (getattrlist(disk->mountpoint.chars, &(struct attrlist) {
.bitmapcount = ATTR_BIT_MAP_COUNT,
.volattr = ATTR_VOL_INFO | ATTR_VOL_NAME,
}, &attrBuf, sizeof(attrBuf), 0) == 0)
ffStrbufInitNS(&disk->name, attrBuf.volNameRef.attr_length - 1 /* excluding '\0' */, attrBuf.volNameSpace);
2022-10-27 14:58:29 +08:00
}
#endif
2023-06-12 22:09:52 +08:00
const char* ffDetectDisksImpl(FFlist* disks)
2022-10-27 14:58:29 +08:00
{
int size = getfsstat(NULL, 0, MNT_WAIT);
2022-10-27 14:58:29 +08:00
if(size <= 0)
return "getfsstat(NULL, 0, MNT_WAIT) failed";
FF_AUTO_FREE struct statfs* buf = malloc(sizeof(*buf) * (unsigned) size);
if(getfsstat(buf, (int) (sizeof(*buf) * (unsigned) size), MNT_NOWAIT) <= 0)
return "getfsstat(buf, size, MNT_NOWAIT) failed";
2022-10-27 14:58:29 +08:00
for(struct statfs* fs = buf; fs < buf + size; ++fs)
{
if(!ffStrStartsWith(fs->f_mntfromname, "/dev/") && !ffStrEquals(fs->f_fstypename, "zfs"))
continue;
2023-06-12 22:09:52 +08:00
FFDisk* disk = ffListAdd(disks);
2022-10-27 14:58:29 +08:00
#ifdef __FreeBSD__
// f_bavail and f_ffree are signed on FreeBSD...
if(fs->f_bavail < 0) fs->f_bavail = 0;
if(fs->f_ffree < 0) fs->f_ffree = 0;
#endif
disk->bytesTotal = fs->f_blocks * fs->f_bsize;
2023-08-26 10:36:00 +08:00
disk->bytesFree = (uint64_t)fs->f_bfree * fs->f_bsize;
disk->bytesAvailable = (uint64_t)fs->f_bavail * fs->f_bsize;
disk->bytesUsed = 0; // To be filled in ./disk.c
2022-10-27 14:58:29 +08:00
disk->filesTotal = (uint32_t) fs->f_files;
disk->filesUsed = (uint32_t) (disk->filesTotal - (uint64_t)fs->f_ffree);
2023-09-17 20:08:46 +08:00
ffStrbufInitS(&disk->mountFrom, fs->f_mntfromname);
2022-10-27 14:58:29 +08:00
ffStrbufInitS(&disk->mountpoint, fs->f_mntonname);
ffStrbufInitS(&disk->filesystem, fs->f_fstypename);
ffStrbufInit(&disk->name);
disk->type = 0;
2022-10-27 14:58:29 +08:00
detectFsInfo(fs, disk);
2023-08-26 12:50:45 +08:00
2023-08-26 12:59:30 +08:00
if(fs->f_flags & MNT_RDONLY)
2023-08-26 12:50:45 +08:00
disk->type |= FF_DISK_VOLUME_TYPE_READONLY_BIT;
2022-10-27 14:58:29 +08:00
}
2023-06-12 22:09:52 +08:00
return NULL;
2022-10-27 14:58:29 +08:00
}