ИМЯ
fanotify_mark -
    добавляет,
    удаляет
    или
    изменяет
    метку 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()
    добавляет,
    удаляет
    или
    изменяет
    метку 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, то все
      метки
      монтирований
      удаляются
      из группы.
      Если в flags
      содержится
      FAN_MARK_FILESYSTEM, то все
      метки
      файловых
      систем
      удаляются
      из группы.
      В
      противном
      случае
      удаляются
      все метки и
      каталогов
      и файлов.
      Вместе с
      FAN_MARK_FLUSH может
      быть
      указан
      только
      либо FAN_MARK_MOUNT,
      либо
      FAN_MARK_FILESYSTEM.Значение
      mask
      игнорируется.
Если не
    задано ни
    одно из
    этих
    значений,
    или
    указано
    больше
    одного, то
    вызов
    завершается
    с ошибкой
    EINVAL.
Кроме
    этого в flags
    могут быть
    указаны
    (побитовым
    сложением):
  - FAN_MARK_DONT_FOLLOW
- Если pathname —
      символьная
      ссылка, то
      помечается
      сама
      ссылка, а
      не файл, на
      который
      она
      ссылается
      (по
      умолчанию
      fanotify_mark()
      разыменовывает
      pathname, если это
      символьная
      ссылка).
- FAN_MARK_ONLYDIR
- Если
      объект
      файловой
      системы
      для
      пометки не
      является
      каталогом,
      то
      возвращается
      ошибка ENOTDIR.
- FAN_MARK_MOUNT
- Пометить
      точку
      монтирования,
      заданную в
      pathname. Если
      само
      значение
      pathname не
      является
      точкой
      монтирования,
      то будет
      помечена
      точка
      монтирования,
      которая
      содержит
      pathname. Будут
      отслеживаться
      все
      каталоги,
      подкаталоги
      и
      содержащиеся
      в точке
      монтирования
      файлы.
- FAN_MARK_FILESYSTEM
    (начиная с Linux
    4.20)
- Пометить
      файловую
      систему,
      заданную в
      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_EXEC
    (начиная с Linux
    5.0)
- Создать
      событие,
      когда файл
      открыт для
      начала
      выполнения.
      Подробней
      об этом в
      ЗАМЕЧАНИЯХ.
- FAN_Q_OVERFLOW
- Создать
      событие
      при
      переполнении
      очереди
      сообщений.
      Размер
      очереди
      сообщений
      ограничен
      16384
      элементами,
      если в fanotify_init(2)
      не указан
      FAN_UNLIMITED_QUEUE.
- FAN_OPEN_PERM
- Создать
      событие
      при
      запросе
      открытия
      файла или
      каталога.
      Требуется
      файловый
      дескриптор
      fanotify,
      созданный
      с FAN_CLASS_PRE_CONTENT или
      FAN_CLASS_CONTENT.
- FAN_OPEN_EXEC_PERM
    (начиная с Linux
    5.0)
- Создать
      событие
      при
      запросе
      открытия
      файла или
      каталога
      на
      выполнение.
      Требуется
      файловый
      дескриптор
      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.
ЗАМЕЧАНИЯ
При
    использовании
    FAN_OPEN_EXEC или FAN_OPEN_EXEC_PERM
    в mask
    события
    этих типов
    будут
    возвращаться
    только,
    когда
    происходит
    непосредственное
    выполнение
    программы.
    Точнее
    говоря,
    события
    этих типов
    будут
    сгенерированы
    для файлов,
    которые
    открываются
    с помощью
    execve(2), execveat(2) или
    uselib(2). События
    данных
    типов не
    будут
    возникать
    в ситуации,
    когда
    интерпретатору
    передаётся
    (или он
    читает)
    файл
    интерпретируемого
    сценария.
Также,
    если метка
    помещается
    на
    динамический
    компоновщик
    Linux, то
    пользователь
    должен
    также
    ожидать
    приём
    сообщения,
    когда он
    открывает
    объект ELF с
    помощью execve(2)
    или execveat(2).
Например,
    если
    вызывается
    следующий
    двоичный ELF
    и меткой
    FAN_OPEN_EXEC
    отмечен /:
  
$ /bin/echo foo
Слушающее
    приложение
    в этом
    случае
    получило
    бы события
    FAN_OPEN_EXEC для
    исполняемого
    файла ELF и
    интерпретатора,
    соответственно:
  
/bin/echo
/lib64/ld-linux-x86-64.so.2
ДЕФЕКТЫ
В ядрах Linux
    до версии 3.16
    существуют
    следующие
    дефекты:
  - Если flags
      содержит
      FAN_MARK_FLUSH, то dirfd и
      pathname должны
      задавать
      корректный
      объект
      файловой
      системы,
      даже если
      этот
      объект не
      используется.
- Вызов readdir(2)
      не
      генерирует
      событие
      FAN_ACCESS.
- Если fanotify_mark()
      вызван с
      FAN_MARK_FLUSH, то
      значение
      flags не
      проверяется
      на
      корректность.