Zohar81
Zohar81

Reputation: 5136

macOS: Getting number of used inodes in volume programmatically

I'd like to get the number of used inodes for specified volume using function API rather then using the output of df shell command.

I've looked at the man page of getattrlist and found the following attribute, but it may also refer to hard links, but they point to existing inodes, and I don't want to count them more than once.

ATTR_VOL_FILECOUNT        A u_int32_t containing the number of files on the volume.

I also tried to run dtruss df and search for the exact sys call which retrieves this value, but I couldn't put my finger on it :

csops(0x872, 0x7, 0x7FFEEE4C8E80)        = 0 0
sysctl([CTL_KERN, 14, 1, 2162, 0, 0] (4), 0x7FFEEE4C8FC8, 0x7FFEEE4C8FC0, 0x0, 0x0)      = 0 0
csops(0x872, 0x7, 0x7FFEEE4C8770)        = 0 0
getfsstat64(0x0, 0x0, 0x2)       = 6 0
getfsstat64(0x7FFD41001600, 0x3B48, 0x2)         = 6 0
getfsstat64(0x7FFD41001600, 0x3B48, 0x1)         = 6 0
getrlimit(0x1008, 0x7FFEEE4C9EC0, 0x0)       = 0 0
fstat64(0x1, 0x7FFEEE4C9ED8, 0x0)        = 0 0
ioctl(0x1, 0x4004667A, 0x7FFEEE4C9F24)       = 0 0  

Here's df output (notice the iused field)

Filesystem    512-blocks      Used Available Capacity iused               ifree %iused  Mounted on
/dev/disk1s1   976695384 757288824 211770792    79% 2000778 9223372036852775029    0%   /

Any ideas where can I find the source code of df or to other API for this task.

thanks

Upvotes: 0

Views: 262

Answers (1)

unwind
unwind

Reputation: 399979

I think I found the source and it does this:

if (iflag) {
        inodes = sfsp->f_files;
        used = inodes - sfsp->f_ffree;
        (void)printf(" %*llu %*llu %4.0f%% ", mwp->iused, used,
            mwp->ifree, sfsp->f_ffree, inodes == 0 ? 100.0 :
            (double)used / (double)inodes * 100.0);

where sfsp is a pointer to a struct statfs instance, from statfs() like you'd expect.

Upvotes: 1

Related Questions