📄 show_free.cpp
字号:
#include <stdio.h>#include <stdlib.h>#include <inttypes.h>#include <sys/statvfs.h>#include <sys/types.h>#include <mntent.h>#include <string.h>#ifndef CHAR_BIT# define CHAR_BIT 8#endif#define ME_DUMMY(fs_name, fs_type) (!strcmp(fs_type, "auto") || !strcmp(fs_type, "ignore"))#define ME_REMOTE(fs_name, fs_type) (strchr (fs_name, ':') != 0)#define PROPAGATE_ALL_ONES(x) (signed (x) == -1 ? (uintmax_t)-1 : (uintmax_t)(x))#define EXTRACT_TOP_BIT(x) ((x) & ((uintmax_t) 1 << (sizeof (x) * CHAR_BIT - 1)))#define PROPAGATE_TOP_BIT(x) ((x) | ~ (EXTRACT_TOP_BIT (x) - 1))struct mount_entry{ char *me_devname; // Device node pathname, including "/dev/". char *me_mountdir; // Mount point directory pathname. char *me_type; // "nfs", "4.2", etc. dev_t me_dev; // Device number of me_mountdir. unsigned int me_dummy : 1; // Nonzero for dummy filesystems. unsigned int me_remote : 1; // Nonzero for remote fileystems.};struct fs_usage{ int fsu_blocksize; // Size of a block. uintmax_t fsu_blocks; // Total blocks. uintmax_t fsu_bfree; // Free blocks available to superuser. uintmax_t fsu_bavail; // Free blocks available to non-superuser. int fsu_bavail_top_bit_set; // 1 if fsu_bavail represents a value < 0. uintmax_t fsu_files; // Total file nodes. uintmax_t fsu_ffree; // Free file nodes.};size_t show_free(char *,char *);void read_filesystem_list(char *,char *);size_t get_free(const char *disk, const char *mount_point,const char *fstype, int me_dummy, int me_remote);int get_fs_usage(const char *path, const char *disk, fs_usage *fsp);static mount_entry *mount_list;void read_filesystem_list(char * device,char *mount_point)//device=null,mountdir起作用,mountdir=null,device起作用{ mount_list = new mount_entry; mount_list->me_devname = device; mount_list->me_mountdir = mount_point; mount_list->me_type = "nfs"; mount_list->me_dummy = ME_DUMMY(mount_list->me_devname, mount_list->me_type); mount_list->me_remote = ME_REMOTE(mount_list->me_devname, mount_list->me_type); mount_list->me_dev = (dev_t)-1; return;}int get_fs_usage(const char *path, const char *disk, fs_usage *fsp){ struct statvfs fsd; if (statvfs (path, &fsd) < 0) return -1; fsp->fsu_blocksize =PROPAGATE_ALL_ONES (fsd.f_frsize ? fsd.f_frsize : fsd.f_bsize); fsp->fsu_blocks = PROPAGATE_ALL_ONES (fsd.f_blocks); fsp->fsu_bfree = PROPAGATE_ALL_ONES (fsd.f_bfree); fsp->fsu_bavail = PROPAGATE_TOP_BIT (fsd.f_bavail); fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (fsd.f_bavail) != 0; fsp->fsu_files = PROPAGATE_ALL_ONES (fsd.f_files); fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.f_ffree); return 0;}size_t get_free(const char *disk, const char *mount_point,const char *fstype, int me_dummy, int me_remote){ struct fs_usage fsu; const char *stat_file; stat_file = mount_point ? mount_point : disk; if(get_fs_usage(stat_file, disk, &fsu)) return 0; size_t free = fsu.fsu_bavail * fsu.fsu_blocksize; return free;}size_t show_free(char * device,char *mount_point){ read_filesystem_list(device,mount_point); if(mount_list == NULL) return 0; mount_entry *me = mount_list; size_t df = (size_t)get_free(me->me_devname, me->me_mountdir, me->me_type, me->me_dummy, me->me_remote); delete mount_list; return df;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -