blob: 4d362eeef4144b3062dedfa6a3882ab944f70752 [file] [log] [blame]
/****************************************************************************
| (C) Copyright 2008 Novell, Inc. All Rights Reserved.
|
| GPLv2: This program is free software; you can redistribute it
| and/or modify it under the terms of version 2 of the GNU General
| Public License as published by the Free Software Foundation.
|
| This program is distributed in the hope that it will be useful,
| but WITHOUT ANY WARRANTY; without even the implied warranty of
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
| GNU General Public License for more details.
+-------------------------------------------------------------------------*/
#ifdef __APPLE__
#include <eprintf.h>
int main (int argc, char *argv[])
{
fatal("statfs is different on APPLE");
return 0;
}
#else
/*
* NAME
* statfs, fstatfs - get file system statistics
*
* SYNOPSIS
* #include <sys/vfs.h>
*
* int statfs(const char *path, struct statfs *buf);
* int fstatfs(int fd, struct statfs *buf);
*
* DESCRIPTION
* statfs returns information about a mounted file system. path is
* the path name of any file within the mounted filesystem. buf is a
* pointer to a statfs structure defined as follows:
*
* struct statfs {
* long f_type; // type of filesystem (see below)
* long f_bsize; // optimal transfer block size
* long f_blocks; // total data blocks in file system
* long f_bfree; // free blocks in fs
* long f_bavail; // free blocks avail to non-superuser
* long f_files; // total file nodes in file system
* long f_ffree; // free file nodes in fs
* fsid_t f_fsid; // file system id
* long f_namelen; // maximum length of filenames
* long f_spare[6]; // spare for later
* };
* Fields that are undefined for a particular file system are set
* to 0. fstatfs returns the same information about an open file
* referenced by descriptor fd.
*
* RETURN VALUE
* On success, zero is returned. On error, -1 is returned, and
* errno is set appropriately.
*/
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/vfs.h>
#include <style.h>
#include <puny.h>
#include <eprintf.h>
typedef struct FsType_s {
long fs_magic;
char *fs_name;
} FsType_s;
FsType_s FsType[] = {
{ 0xADFF, "Amiga Fast FS" },
{ 0x00414A53, "SGI's Extent FS" },
{ 0x137D, "EXT (not 2 or 3) FS" },
{ 0xEF51, "Old EXT-2 FS" },
{ 0xEF53, "EXT-2 FS" },
{ 0xF995E849, "OS/2 FS" },
{ 0x9660, "ISO-CD FS" },
{ 0x137F, "Orig. Minix FS" },
{ 0x138F, "30 char Minix FS" },
{ 0x2468, "Minix V2" },
{ 0x2478, "Minix V2, 30 char" },
{ 0x4d44, "MSDOS" },
{ 0x564c, "NCP" },
{ 0x6969, "NFS" },
{ 0x9fa0, "Proc" },
{ 0x517B, "SMB" },
{ 0x012FF7B4, "Xenix SysV" },
{ 0x012FF7B5, "SysV.4" },
{ 0x012FF7B6, "SysV.2" },
{ 0x012FF7B7, "Coherent CD-ROM" },
{ 0x00011954, "UFS Solaris" },
{ 0x58465342, "XFS (SGI or Berkeley?)" },
{ 0x012FD16D, "Xia FS" },
{ 0, NULL }
};
char *findFsName (long magic)
{
FsType_s *fs;
for (fs = FsType; fs->fs_name; ++fs) {
if (fs->fs_magic == magic) return fs->fs_name;
}
return "Unknown";
}
void prStatfs (char *name, struct statfs *sfs)
{
printf("%s: type=%s: file system id=%d.%d\n",
name, findFsName(sfs->f_type),
sfs->f_fsid.__val[0], sfs->f_fsid.__val[1]);
printf("\t%10lld: optimal transfer block size\n", (u64)sfs->f_bsize);
printf("\t%10lld: total data blocks in file system\n", (u64)sfs->f_blocks);
printf("\t%10lld: free blocks in fs\n", (u64)sfs->f_bfree);
printf("\t%10lld: free blocks avail to non-superuser\n", (u64)sfs->f_bavail);
printf("\t%10lld: total file nodes in file system\n", (u64)sfs->f_files);
printf("\t%10lld: free file nodes in fs\n", (u64)sfs->f_ffree);
printf("\t%10lld: maximum length of filenames\n", (u64)sfs->f_namelen);
}
int doStatfs (char *name)
{
struct statfs sfs;
int rc;
rc = statfs(name, &sfs);
if (rc == -1) {
rc = errno;
fprintf(stderr, "statfs:%s %s\n", name, strerror(errno));
return rc;
}
prStatfs(name, &sfs);
return 0;
}
int main (int argc, char *argv[])
{
int i;
int rc = 0;
punyopt(argc, argv, NULL, NULL);
if (argc == optind) {
rc = doStatfs(Option.dir);
} else for (i = optind; i < argc && !rc; ++i) {
rc = doStatfs(argv[i]);
}
if (rc) fatal("doStatfs:");
return 0;
}
#endif