fanotify_mark(2) добавляет, удаляет или изменяет метку fanotify для объекта

ОБЗОР

#include <sys/fanotify.h>


int fanotify_mark(int fanotify_fd, unsigned int flags,
uint64_t mask, int dirfd, const char *pathname);

ОПИСАНИЕ

Обзор программного интерфейса fanotify смотрите в fanotify(7).

Системный вызов fanotify_mark(2) добавляет, удаляет или изменяет метку fanotify для объекта файловой системы. Вызывающий должен иметь право на чтение помеченного объекта файловой системы.

Аргумент fanotify_fd — файловый дескриптор, возвращаемый fanotify_init(2).

Аргумент flags — битовая маска, описывающая выполняемое изменение. Она должна содержать только одно значение из:

FAN_MARK_ADD
События в mask будут добавлены в маску меток (или в маску игнорирования). Если значение mask пусто, то возвращается ошибка EINVAL.
FAN_MARK_REMOVE
События в mask будут удалены из маски меток (или маски игнорирования). Если значение mask пусто, то возвращается ошибка EINVAL.
FAN_MARK_FLUSH
Будут удалены все метки для смонтированных или несмонтированных точек из группы fanotify. Если flags содержит FAN_MARK_MOUNT, то все метки для точек монтирования удаляются из группы. В противном случае удаляются все метки для каталогов и файлов. Другие флаги, кроме FAN_MARK_MOUNT, нельзя использовать вместе с FAN_MARK_FLUSH. Значение mask игнорируется.

Если не задано ни одно из этих значений, или указано больше одного, то вызов завершается с ошибкой EINVAL.

Кроме этого в flags могут быть указаны (побитовым сложением):

FAN_MARK_DONT_FOLLOW
Если pathname — символьная ссылка, то помечается сама ссылка, а не файл, на который она ссылается (по умолчанию fanotify_mark() разыменовывает pathname, если это символьная ссылка).
FAN_MARK_ONLYDIR
Если объект файловой системы для пометки не является каталогом, то возвращается ошибка ENOTDIR.
FAN_MARK_MOUNT
Пометить точку монтирования, заданную в pathname. Если само значение pathname не является точкой монтирования, то будет помечена точка монтирования, которая содержит pathname. Будут отслеживаться все каталоги, подкаталоги и содержащиеся в точке монтирования файлы.
FAN_MARK_IGNORED_MASK
События в mask должны быть добавлены или удалены из маски игнорирования.
FAN_MARK_IGNORED_SURV_MODIFY
Маска игнорирования должна остаться неизменной при событиях изменения. Если этот флаг не указан, то маска игнорирования очищается при появлении событий изменения игнорируемого файла или каталога.

В mask указывается какие события должны прослушиваться (или игнорироваться). Данная битовая маска состоит из следующих значений:

FAN_ACCESS
Создать событие при доступе (для чтения) к файлу или каталогу (но смотрите ДЕФЕКТЫ).
FAN_MODIFY
Создать событие при изменении (при записи) файла.
FAN_CLOSE_WRITE
Создать событие при закрытии файла, открытого на запись.
FAN_CLOSE_NOWRITE
Создать событие при закрытии файла или каталога, открытого только для чтения.
FAN_OPEN
Создать событие при открытии файла или каталога.
FAN_OPEN_PERM
Создать событие при запросе открытия файла или каталога. Требуется файловый дескриптор fanotify, созданный с FAN_CLASS_PRE_CONTENT или FAN_CLASS_CONTENT.
FAN_ACCESS_PERM
Создать событие при запросе чтения файла или каталога. Требуется файловый дескриптор fanotify, созданный с FAN_CLASS_PRE_CONTENT или FAN_CLASS_CONTENT.
FAN_ONDIR
Создать события для каталогов, например при вызове opendir(3), readdir(3) (но смотрите ДЕФЕКТЫ) и closedir(3). Без этого флага будут создаваться события только для файлов.
FAN_EVENT_ON_CHILD
Должны создаваться события для прямых потомков помеченных каталогов. Флаг не влияет на помеченные точки монтирования. Заметим, что события не генерируются для потомков подкаталогов помеченных каталогов. Для слежения за всем деревом каталогов нужно пометить соответствующую точку монтирования.

Определены следующие составные значения:

FAN_CLOSE
Файл закрыт (FAN_CLOSE_WRITE|FAN_CLOSE_NOWRITE).

Объект файловой системы для пометки задаётся файловым дескриптором dirfd и путём, указанным в pathname:

*
Если значение pathname равно NULL, то в dirfd указан объект файловой системы для пометки.
*
Если значение pathname равно NULL и dirfd равно специальному значению AT_FDCWD, то помечается текущий рабочий каталог.
*
Если в pathname задан абсолютный путь, то им определяется объект файловой системы для пометки, а dirfd игнорируется.
*
Если в pathname задан относительный путь и dirfd не равно AT_FDCWD, то помечаемый объект файловой системы определяется из pathname относительно каталога, заданного в dirfd.
*
Если в pathname задан относительный путь и dirfd равно AT_FDCWD, то помечаемый объект файловой системы определяется из pathname относительно текущего рабочего каталога.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении fanotify_mark() возвращает 0; при ошибке возвращается -1, а в errno задаётся причина ошибки.

ОШИБКИ

EBADF
В fanotify_fd передан некорректный файловый дескриптор.
EINVAL
В flags или mask указано некорректное значение, или в fanotify_fd не файловый дескриптор fanotify.
EINVAL
Файловые дескриптор fanotify был открыт с FAN_CLASS_NOTIF и маска содержит флаг для событий доступа (FAN_OPEN_PERM или FAN_ACCESS_PERM).
ENOENT
Объект файловой системы, указанный в dirfd и pathname, не существует. Эта ошибка также возникает при попытке удаления метки с не помеченного объекта.
ENOMEM
Невозможно выделить необходимую память.
ENOSPC
Количество меток превышает ограничение в 8192 и флаг FAN_UNLIMITED_MARKS не был указан при создании файлового дескриптора fanotify с помощью fanotify_init(2).
ENOSYS
В этом ядре не реализован fanotify_mark(). Программный интерфейс fanotify доступен только, если ядро было собрано с параметром CONFIG_FANOTIFY.
ENOTDIR
В значении flags содержится FAN_MARK_ONLYDIR, а в dirfd и pathname указан не каталог.

ВЕРСИИ

Вызов fanotify_mark() появился в версии 2.6.36 ядра Linux и был включён в версии 2.6.37.

СООТВЕТСТВИЕ СТАНДАРТАМ

Данный системный вызов есть только в Linux.

ДЕФЕКТЫ

В ядрах Linux до версии 3.16 существуют следующие дефекты:
*
Если flags содержит FAN_MARK_FLUSH, то dirfd и pathname должны задавать корректный объект файловой системы, даже если этот объект не используется.
*
Вызов readdir(2) не генерирует событие FAN_ACCESS.
*
Если fanotify_mark(2) вызван с FAN_MARK_FLUSH, то значение flags не проверяется на корректность.