One of the people I work with (an excellent fellow, I might add) was grumbling about how he could gather information about the mounted disks on a computer. He was mucking around with ‘df’ in the command line, and giving serious thought to the business of parsing the result into his program.
I was concerned that this might be rather slow – especially since his program was written in C, and he’d already demonstrated his mettle with a marvellously efficient ring buffer. So this isn’t mere incompetence here – it’s just unfamiliarity with the language and all the wonderful modules that are available. I offered him the following snippet of code and, since others might encounter the same problem, I offer it here as well.
Firstly, you’ll need to include the necessary module:
#include <sys/statvfs.h>
Then you’ll need to define the structure to store the disk information:
typedef struct _diskInfo
{
unsigned long size;
unsigned long used;
unsigned long free;
unsigned long blockSize;
unsigned long blocks;
} diskInfo;
And finally, you’ll need the function to gather this wonderful information for you:
diskInfo diskUsage(char * path,unsigned int function)
{
struct statvfs buf;
diskInfo disk;
unsigned long freeblks;
int ret;
ret = statvfs(path,&buf);
disk.blockSize = buf.f_frsize;
disk.blocks = buf.f_blocks;
freeblks = buf.f_bfree;
disk.size = disk.blockSize * disk.blocks;
disk.free = disk.blockSize * freeblks;
disk.used = disk.size - disk.free;
return disk;
}
I’ll keep publishing snippets until I loose interest. So this might be part one of an occasional series, or it might be the only one I ever write.
Reading the man page of statfs.h made me laugh:
“Nobody knows what f_fsid is supposed to contain”.