Linux программирование в примерах - Роббинс Арнольд
Шрифт:
Интервал:
Закладка:
Есть два неудобства в использовании этих вызовов. Во-первых, они специфичны для Linux. Во-вторых, часть сведений из struct statvfs отсутствует в struct statfs, наиболее значительными из них являются флаги (f_flag) и число доступных индексов (f_favail). (Поэтому statvfs() Linux приходится находить опции монтирования из других источников, таких, как /etc/mtab, и она «фабрикует» информацию для тех полей struct statvfs, для которых действительные сведения недоступны.)
Одно поле struct statfs заслуживает особого замечания. Это поле f_type, указывающее тип файловой системы. Значение является магическим числом файловой системы, извлеченной из суперблока. Справочная страница statfs(2) предоставляет список обычно используемых файловых систем и их магические числа, которые мы используем в ch08-statfs.c. (Увы, отдельного файла #include нет.)
1 /* ch08-statfs.с --- демонстрация statfs Linux */
2
3 /* ЗАМЕЧАНИЕ: специфично для GNU/Linux! */
4
5 #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>
11
12 /* Определения взяты из справочной страницы для statfs(2): */
13 #define AFFS_SUPER_MAGIC 0xADFF
14 #define EFS_SUPER_MAGIC 0x00414A53
15 #define EXT_SUPER_MAGIC 0x137D
16 #define EXT2_OLD_SUPER_MAGIC 0xEF51
17 #define EXT2_SUPER_MAGIC 0xEF53
18 #define HPFS_SUPER_MAGIC 0xF995E849
19 #define ISOFS_SUPER_MAGIC 0x9660
20 #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 0x4d44
25 #define NCP_SUPER_MAGIC 0x564c
26 #define NFS_SUPER_MAGIC 0x6969
27 #define PROC_SUPER_MAGIC 0x9fa0
28 #define SMB_SUPER_MAGIC 0x517B
29 #define XENIX_SUPER_MAGIC 0x012FF7B4
30 #define SYSV4_SUPER_MAGIC 0x012FF7B5
31 #define SYSV2_SUPER_MAGIC 0x012FF7B6
32 #define COH_SUPER_MAGIC 0x012FF7B7
33 #define UFS_MAGIC 0x00011954
34 #define XFS_SUPER_MAGIC 0x58465342
35 #define _XIAFS_SUPER_MAGIC 0x012FD16D
36
37 void process(const char *filename);
38 void do_statfs(const struct mntent *fs);
39
40 int errors = 0;
41 char *myname;
42
/* ...main() без изменений, process() почти идентична... */
85
86 /* type2str --- преобразование типа fs в строку из statfs(2) */
87
88 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