Linux программирование в примерах
Часть 99 из 253 Информация о книге
Есть два неудобства в использовании этих вызовов. Во-первых, они специфичны для Linux. Во-вторых, часть сведений из
отсутствует вstruct statvfs, наиболее значительными из них являются флаги (struct statfs) и число доступных индексов (f_flag). (Поэтомуf_favailLinux приходится находить опции монтирования из других источников, таких, какstatvfs(), и она «фабрикует» информацию для тех полей/etc/mtab, для которых действительные сведения недоступны.)struct statvfsОдно поле
заслуживает особого замечания. Это полеstruct statfs, указывающее тип файловой системы. Значение является магическим числом файловой системы, извлеченной из суперблока. Справочная страница statfs(2) предоставляет список обычно используемых файловых систем и их магические числа, которые мы используем вf_type. (Увы, отдельного файлаch08-statfs.cнет.)#include1 /* ch08-statfs.с --- демонстрация statfs Linux */23 /* ЗАМЕЧАНИЕ: специфично для GNU/Linux! */45 #include <stdio.h>6 #include <errno.h>7 #include <mntent.h> /* для getmntent() и др. */8 #include <unistd.h> /* для getopt() */9 #include <sys/types.h>10 #include <sys/vfs.h>1112 /* Определения взяты из справочной страницы для statfs(2): */13 #define AFFS_SUPER_MAGIC 0xADFF14 #define EFS_SUPER_MAGIC 0x00414A5315 #define EXT_SUPER_MAGIC 0x137D16 #define EXT2_OLD_SUPER_MAGIC 0xEF5117 #define EXT2_SUPER_MAGIC 0xEF5318 #define HPFS_SUPER_MAGIC 0xF995E84919 #define ISOFS_SUPER_MAGIC 0x966020 #define MINIX_SUPER_MAGIC 0x137F /* оригинальный minix */21 #define MINIX_SUPER_MAGIC2 0x138F /* 30-симв. minix */22 #define MINIX2_SUPER_MAGIC 0x2468 /* minix V2 */23 #define MINIX2_SUPER_MAGIC2 0x2478 /* minix V2, имена 30 симв. */24 #define MSDOS_SUPER_MAGIC 0x4d4425 #define NCP_SUPER_MAGIC 0x564c26 #define NFS_SUPER_MAGIC 0x696927 #define PROC_SUPER_MAGIC 0x9fa028 #define SMB_SUPER_MAGIC 0x517B29 #define XENIX_SUPER_MAGIC 0x012FF7B430 #define SYSV4_SUPER_MAGIC 0x012FF7B531 #define SYSV2_SUPER_MAGIC 0x012FF7B632 #define COH_SUPER_MAGIC 0x012FF7B733 #define UFS_MAGIC 0x0001195434 #define XFS_SUPER_MAGIC 0x5846534235 #define _XIAFS_SUPER_MAGIC 0x012FD16D3637 void process(const char *filename);38 void do_statfs(const struct mntent *fs);3940 int errors = 0;41 char *myname;42/* ...main() без изменений, process() почти идентична... */8586 /* type2str --- преобразование типа fs в строку из statfs(2) */8788 const char *type2str(long type)89 {90 static struct fsname {91 long type;92 const char *name;93 } table[] = {94 { AFFS_SUPER_MAGIC, "AFFS" },95 { COH_SUPER_MAGIC, "COH" },96 { EXT2_OLD_SUPER_MAGIC, "OLD EXT2" },97 { EXT2_SUPER_MAGIС, "EXT2" },98 { HPFS_SUPER_MAGIC, "HPFS" },99 { ISOFS_SUPER_MAGIC, "ISOFS" },100 { MINIX2_SUPER_MAGIC, "MINIX V2" },101 { MINIX2_SUPER_MAGIC2, "MINIX V2 30 char" },102 { MINIX_SUPER_MAGIC, "MINIX" },103 { MINIX_SUPER_MAGIC2, "MINIX 30 char" },104 { MSDOS_SUPER_MAGIC, "MSDOS" },105 { NCP_SUPER_MAGIС, "NCP" },106 { NFS_SUPER_MAGIC, "NFS" },107 { PROC_SUPER_MAGIC, "PROC" },108 { SMB_SUPER_MAGIC, "SMB" },109 { SYSV2_SUPER_MAGIC, "SYSV2" },110 { SYSV4_SUPER_MAGIC, "SYSV4" },111 { UFS_MAGIC, "UFS" },112 { XENIX_SUPER_MAGIC, "XENIX" },113 { _XIAFS_SUPER_MAGIC, "XIAFS" },114 { 0, NULL },115 };116 static char unknown[100];117 int i;118