Чтение онлайн

ЖАНРЫ

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

119 for (i = 0; table[i].type != 0; i++)

120 if (table[i].type == type)

121 return table[i].name;

122

123 sprintf(unknown, "unknown type: %#x", type);

124 return unknown;

125 }

126

Поделиться с друзьями: