Шрифт:
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
127 /* do_statfs --- Использовать statfs и вывести сведения */
128
129 void do_statfs(const struct mntent *fs)
130 {
131 struct statfs vfs;
132
133 if (fs->mnt_fsname[0] != '/') /* пропустить фиктивные файловые системы */
134 return;
135
136 if (statfs(fs->mnt_dir, &vfs) != 0) {
137 fprintf(stderr, "%s: %s: statfs failed: %s\n",
138 myname, fs->mnt_dir, strerror(errno));
139 errors++;
140 return;
141 }
142
143 printf("%s, mounted on %s:\n", fs->mnt_dir, fs->mnt_fsname);
144
145 printf("\tf_type: %s\n", type2str(vfs.f_type));
146 printf("\tf_bsize: %ld\n", vfs.f_bsize);
147 printf("\tf_blocks: %ld\n", vfs.f_blocks);
148 printf("\tf_bfree: %ld\n", vfs.f_bfree);
149 printf("\tf_bavail: %ld\n", vfs.f_bavail);
150 printf("\tf_files: %ld\n", vfs.f_files);
151 printf("\tf_ffree: %ld\n", vfs.f_ffree);
152 printf("\tf_namelen: %ld\n", vfs.f_namelen);
153 }
Чтобы сохранить место, мы опустили
main
, которая не изменилась с представленной ранее другой программы, мы также опустили process
, которая теперь вызывает do_statfs
вместо do_statvfs
. Строки 13–35 содержат список магических чисел файловых систем из справочной страницы statfs(2). Хотя эти числа можно получить из заголовочных файлов исходного кода ядра, это трудно (мы пробовали), а показанному здесь способу представления следовать легче. Строки 86–125 определяют
type2str
, которая преобразует магическое число в выводимую строку. Она осуществляет простой линейный поиск в таблице пар (значение, строка). В (маловероятном) случае, когда магическое число в таблице отсутствует, type2str
создает сообщение «неизвестный тип» и возвращает его (строки 123–124). do_statfs
(строки 129–153) выводит сведения из struct statfs
. Член f_fsid
опущен, поскольку fsid_t
является непрозрачным типом. Код прост; строка 145 использует type2str
для вывода типа файловой системы. Как для сходной программы, использующей statvfs
, эта функция игнорирует файловые системы, которые не расположены на локальных устройствах (строки 133–134). Вот вывод на нашей системе:
$ ch08-statfs /* Запуск программы */
/, mounted on /dev/hda2: /* Результаты для файловой системы ext2 */
f_type: ЕХТ2
f_bsize: 4096
f_blocks: 1549609
f_bfrее: 316664
f_bavail: 237946
f_files: 788704
f_ffree: 555483
f_namelen: 255
...
/win, mounted on /dev/hda1: /* Результаты для файловой с-мы vfat */