Книга: Разработка приложений в среде Linux. Второе издание

11.3.7. Расширенные атрибуты Ext3

11.3.7. Расширенные атрибуты Ext3

Главная файловая система, используемая в Linux — это Third Extended File System (третья расширенная файловая система)[47], обычно упоминаемая как ext3. Хотя она поддерживает все традиционные функциональные средства файловых систем Unix, такие как значение отдельных бит в режиме файла, она также позволяет хранить некоторые дополнительные атрибуты для каждого файла. В табл. 11.4 описаны поддерживаемые в настоящее время дополнительные атрибуты. Эти флаги могут быть установлены и просмотрены с помощью программ chattr и lsattr.

Таблица 11.4. Расширенные атрибуты файла

Атрибут Определение
EXT3_APPEND_FL Если файл открыт для записи, должен быть указан флаг O_APPEND.
EXT3_IMMUTABLE_FL Файл не может быть модифицирован или удален ни одним пользователем, включая root.
EXT3_NODUMP Файл должен быть проигнорирован командой dump.
EXT3_SYNC_FL Файл должен обновляться синхронно, как если бы при открытии был указан флаг O_SYNC

Поскольку расширенные атрибуты ext3 выходят за пределы стандартного интерфейса файловых систем, они не могут модифицироваться с помощью chmod(), как все остальные атрибуты. Вместо этого используется ioctl(). Вспомним, как определен вызов ioctl().

#include <sys/ioctl.h>
#include <linux/ext3_fs.h>
int ioctl(int fd, int request, void *arg);

Файл, атрибуты которого меняются, должен быть открыт, как для fchmod(). Запрос (параметр request) на получение текущего состояния флагов — EXT3_IOC_GETFLAGS, а для установки их — EXT3_IOC_SETFLAGS. В обоих случаях arg должен быть указателем на int. Если используется EXT3_IOC_GETFLAGS, то long устанавливается в текущее значение программных флагов. Если применяется EXT3_IOC_SETFLAGS, то новое значение файловых флагов берется из int, на который указывает arg.

Это дополнение и неизменяемые флаги могут быть изменены только пользователем root, поскольку это связано с операциями, которые может выполнять только root.

Другие флаги могут быть модифицированы либо пользователем root, либо владельцем файла.

Приведем пример небольшой программы, которая отображает флаги для любого файла, переданного в командной строке. Она работает только с файлами из файловой системы ext3[48]. Вызов ioctl() завершится неудачей, если применить его к файлам из любой другой файловой системы.

 1: /* checkflags.c */
 2:
 3: /* Для каждого имени файла, переданного в командной строке, отобразить
 4:    информацию об атрибутах этого файла в файловой системе ext3. */
 5:
 6: #include <errno.h>
 7: #include <fcntl.h>
 8: #include <linux/ext3_fs.h>
 9: #include <stdio.h>
10: #include <string.h>
11: #include <sys/ioctl.h>
12: #include <unistd.h>
13:
14: int main(int argc, const char **argv) {
15:  const char **filename = argv + 1;
16:  int fd;
17:  int flags;
18:
19:  /* Пройти по каждому имени файла, переданному в командной строке. Последний
20:     указатель в argv[] равен NULL, поэтому такие циклы while() корректны. */
21:  while(*filename) {
22:   /* В отличие от нормальных атрибутов, атрибута ext3 можно опрашивать только
23:      если есть файловый дескриптор (имя файла не годится).
24:      Для выполнения запроса атрибутов ext3 нам не нужен доступ на запись,
25:      поэтому O_RDONLY подойдет. */
26:   fd = open(*filename, O_RDONLY);
27:   if (fd<0) {
28:    fprintf(stderr, "не открывается %s: %sn", *filename,
29:     strerror(errno));
30:    return 1;
31:   }
32:
33:   /* Этот вызов получает атрибуты, и помещает их в flags */
34:   if (ioctl(fd, EXT3_IOC_GETFLAGS, &flags)) {
35:    fprintf(stderr, "ioctl завершился ошибкой на %s: %sn", *filename,
36:     strerror(errno));
37:    return 1;
38:   }
39:
40:   printf("%s: ", *filename++);
41:
42:   /* Проверить каждый атрибут, и отобразить сообщение для каждого,
43:      который включен. */
44:   if (flags & EXT3_APPEND_FL) printf("Append");
45:   if (flags & EXT3_IMMUTABLE_FL) printf("Immutable");
46:   if (flags & EXT3_SYNC_FL) printf("Sync");
47:   if (flags & EXT3_NODUMP_FL) printf("Nodump");
48:
49:   printf("n");
50:   close(fd);
51:  }
52:
53:  return 0;
54: }

Ниже приведена похожая программа, которая устанавливает расширенные атрибуты ext3 для указанного списка файлов. Первый параметр должен быть списком флагов, которые нужно установить. Каждый флаг представляется в списке в виде одной буквы: А — только для добавления (append only), I — неизменяемый (immutable), S — синхронизированный (sync), N — недампированный (nodump). Эта программа не модифицирует существующие флаги файла; она только устанавливает флаги, переданные в командной строке.

 1: /* setflags.c */
 2:
 3: /* Первый параметр этой программы — строка, состоящая из
 4:    0 (допускается пустая) или более букв из набора I, A, S,
 5:    N. Эта строка указывает, какие из атрибутов ext3 должны
 6:    быть включены для файлов, указанных в остальных
 7:    параметрах командной строки — остальные атрибуты выключаются
 8:    буквы обозначают соответственно: immutable, append-only, sync и nodump.
 9:
10:    Например, команда "setflags IN file1, file2" включает
11:    флаги immutable и nodump для файлов file1 и file2, но отключает
12:    флаги sync и append-only для этих файлов. */
13:
14: #include <errno.h>
15: #include <fcntl.h>
16: #include <linux/ext3_fs.h>
17: #include <stdio.h>
18: #include <string.h>
19: #include <sys/ioctl.h>
20: #include <unistd.h>
21:
22: int main(int argc, const char **argv) {
23:  const char **filename = argv + 1;
24:  int fd;
25:  int flags = 0;
26:
27:  /* Убедиться, что указаны устанавливаемые флаги, вместе
28:     с именами файлов. Позволить установить "0", как признак
29:     того, что все флаги должны быть сброшены. */
30:  if (argc<3){
31:   fprintf(stderr, "Использование setflags: [0][I][A][S][N]"
32:    "<filenames>n");
33:   return 1;
34:  }
35:
36:  /* каждая буква представляет флаг; установить
37:     флаг, которые указаны */
38:  if (strchr(argv[1], 'I') ) flags |= EXT3_IMMUTABLE_FL;
39:  if (strchr(argv[1], 'A') ) flags |= EXT3_APPEND_FL;
40:  if (strchr(argv[1], 'S') ) flags |= EXT3_SYNC_FL;
41:  if (strchr(argv[1], 'N') ) flags |= EXT3_NODUMP_FL;
42:
43:  /* пройти по всем именам в argv[] */
44:  while (*(++filename)) {
45:   /* В отличие от нормальных атрибутов, атрибута ext3 можно опрашивать,
46:      только если есть файловый дескриптор (имя файла не годится).
47:      Для выполнения запроса атрибутов ext3 нам не нужен доступ на запись,
48:      поэтому O_RDONLY подойдет. */
49:   fd = open(*filename, O_RDONLY);
50:   if (fd < 0) {
51:    fprintf(stderr, "невозможно открыть %s:%sn", *filename,
52:     strerror(errno));
53:    return 1;
54:   }
55:
56:   /* Установить атрибуты в соответствии с переданными
57:      флагами. */
58:   if (ioctl(fd, EXT3_IOC_SETFLAGS, &flags)) {
59:    fprintf(stderr, "Сбой ioctl в %s:%sn", *filename,
60:     strerror(errno));
61:    return 1;
62:   }
63:   close(fd);
64:  }
65:
66:  return 0;
67: }

Оглавление книги


Генерация: 1.198. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз