Добавлены проверки
This commit is contained in:
parent
d14c1d37ba
commit
582ae5a294
4 changed files with 19 additions and 10 deletions
5
dub.json
5
dub.json
|
@ -9,9 +9,6 @@
|
||||||
"targetPath": "bin",
|
"targetPath": "bin",
|
||||||
"targetType": "executable",
|
"targetType": "executable",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fanotify": {
|
"fanotify": "~>0.1.0"
|
||||||
"repository": "git+https://git.zhirov.kz/dlang/fanotify.git",
|
|
||||||
"version": "97edc0d795c93ef773ff60d260951e5ff6ae6215"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
{
|
{
|
||||||
"fileVersion": 1,
|
"fileVersion": 1,
|
||||||
"versions": {
|
"versions": {
|
||||||
|
"fanotify": "0.1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
16
source/app.d
16
source/app.d
|
@ -5,24 +5,31 @@
|
||||||
// Импорты: fanotify_wrapper - обёртка, std.stdio для вывода, std.file для readLink (хотя здесь не используется из-за режима),
|
// Импорты: fanotify_wrapper - обёртка, std.stdio для вывода, std.file для readLink (хотя здесь не используется из-за режима),
|
||||||
// std.format для форматирования строк, core.sys.posix для констант.
|
// std.format для форматирования строк, core.sys.posix для констант.
|
||||||
|
|
||||||
import fanotify_wrapper; // Импорт обёртки для fanotify.
|
import dfanotify; // Импорт обёртки для fanotify.
|
||||||
|
|
||||||
import std.stdio; // Импорт для writeln, writefln (вывод в консоль).
|
import std.stdio; // Импорт для writeln, writefln (вывод в консоль).
|
||||||
import std.file : readLink; // Импорт readLink для чтения симлинков (не используется здесь, но оставлено для возможного расширения).
|
import std.file : readLink; // Импорт readLink для чтения симлинков (не используется здесь, но оставлено для возможного расширения).
|
||||||
import std.format : format; // Импорт format для форматирования строк (хотя здесь используется writefln напрямую).
|
import std.format : format; // Импорт format для форматирования строк (хотя здесь используется writefln напрямую).
|
||||||
import core.sys.posix.fcntl : AT_FDCWD; // Импорт AT_FDCWD для текущей директории.
|
import core.sys.posix.fcntl : AT_FDCWD; // Импорт AT_FDCWD для текущей директории.
|
||||||
import core.sys.posix.unistd : close; // Импорт close (не используется здесь, но для возможного расширения с fd).
|
import core.sys.posix.unistd : close; // Импорт close (не используется здесь, но для возможного расширения с fd).
|
||||||
|
import core.stdc.stdlib : exit;
|
||||||
|
|
||||||
// Функция main: точка входа приложения.
|
// Функция main: точка входа приложения.
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
|
Fanotify fan;
|
||||||
// Инициализация объекта Fanotify с флагами:
|
// Инициализация объекта Fanotify с флагами:
|
||||||
// FAN_CLASS_NOTIF - режим уведомлений (без контроля доступа),
|
// FAN_CLASS_NOTIF - режим уведомлений (без контроля доступа),
|
||||||
// FAN_CLOEXEC - закрытие дескриптора при exec,
|
// FAN_CLOEXEC - закрытие дескриптора при exec,
|
||||||
// FAN_REPORT_FID | FAN_REPORT_DIR_FID | FAN_REPORT_NAME - отчёт с FID (идентификатор файла) вместо fd, плюс имя файла.
|
// FAN_REPORT_FID | FAN_REPORT_DIR_FID | FAN_REPORT_NAME - отчёт с FID (идентификатор файла) вместо fd, плюс имя файла.
|
||||||
// Это позволяет получать имя без реального fd (fd будет FAN_NOFD).
|
// Это позволяет получать имя без реального fd (fd будет FAN_NOFD).
|
||||||
auto fan = new Fanotify(
|
try {
|
||||||
|
fan = new Fanotify(
|
||||||
FAN_CLASS_NOTIF | FAN_CLOEXEC | FAN_REPORT_FID | FAN_REPORT_DIR_FID | FAN_REPORT_NAME);
|
FAN_CLASS_NOTIF | FAN_CLOEXEC | FAN_REPORT_FID | FAN_REPORT_DIR_FID | FAN_REPORT_NAME);
|
||||||
|
} catch (Exception e) {
|
||||||
|
writeln(e.msg);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
// Определение маски событий: битовая OR флагов для мониторинга.
|
// Определение маски событий: битовая OR флагов для мониторинга.
|
||||||
// FAN_OPEN - открытие, FAN_MODIFY - модификация, FAN_CLOSE - закрытие (включает WRITE и NOWRITE),
|
// FAN_OPEN - открытие, FAN_MODIFY - модификация, FAN_CLOSE - закрытие (включает WRITE и NOWRITE),
|
||||||
|
@ -32,7 +39,12 @@ void main()
|
||||||
// Маркировка директории /tmp/scripts:
|
// Маркировка директории /tmp/scripts:
|
||||||
// FAN_MARK_ADD - добавить марку, FAN_MARK_ONLYDIR - только для директории (ошибка, если не директория).
|
// FAN_MARK_ADD - добавить марку, FAN_MARK_ONLYDIR - только для директории (ошибка, если не директория).
|
||||||
// AT_FDCWD - базовая директория текущая, путь "/tmp/scripts".
|
// AT_FDCWD - базовая директория текущая, путь "/tmp/scripts".
|
||||||
|
try {
|
||||||
fan.mark(FAN_MARK_ADD | FAN_MARK_ONLYDIR, eventMask, AT_FDCWD, "/tmp/scripts");
|
fan.mark(FAN_MARK_ADD | FAN_MARK_ONLYDIR, eventMask, AT_FDCWD, "/tmp/scripts");
|
||||||
|
} catch (Exception e) {
|
||||||
|
writeln(e.msg);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
writeln("Мониторинг запущен для /tmp/scripts..."); // Вывод сообщения о старте мониторинга.
|
writeln("Мониторинг запущен для /tmp/scripts..."); // Вывод сообщения о старте мониторинга.
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
// std.string и std.conv для работы со строками, core.stdc.errno для errno и strerror для детальных сообщений об ошибках,
|
// std.string и std.conv для работы со строками, core.stdc.errno для errno и strerror для детальных сообщений об ошибках,
|
||||||
// core.stdc.stdint для типов вроде uint64_t.
|
// core.stdc.stdint для типов вроде uint64_t.
|
||||||
|
|
||||||
module fanotify_wrapper;
|
module dfanotify;
|
||||||
|
|
||||||
public import fanotify; // Импорт низкоуровневых определений fanotify (структуры, константы, функции вроде fanotify_init, fanotify_mark).
|
public import fanotify; // Импорт низкоуровневых определений fanotify (структуры, константы, функции вроде fanotify_init, fanotify_mark).
|
||||||
|
|
||||||
|
@ -174,8 +174,7 @@ class Fanotify
|
||||||
if (hdr.info_type == FAN_EVENT_INFO_TYPE_DFID_NAME) // Если тип - DFID + NAME (директория FID + имя).
|
if (hdr.info_type == FAN_EVENT_INFO_TYPE_DFID_NAME) // Если тип - DFID + NAME (директория FID + имя).
|
||||||
{
|
{
|
||||||
// Расчёт смещения: пропускаем hdr, fsid (filesystem ID), затем file_handle.
|
// Расчёт смещения: пропускаем hdr, fsid (filesystem ID), затем file_handle.
|
||||||
size_t fidOffset = infoOffset + fanotify_event_info_header.sizeof + __kernel_fsid_t
|
size_t fidOffset = infoOffset + fanotify_event_info_header.sizeof + __kernel_fsid_t.sizeof;
|
||||||
.sizeof;
|
|
||||||
auto handle = cast(file_handle*)(buffer.ptr + fidOffset); // Кастинг в структуру file_handle (содержит handle_bytes - размер handle).
|
auto handle = cast(file_handle*)(buffer.ptr + fidOffset); // Кастинг в структуру file_handle (содержит handle_bytes - размер handle).
|
||||||
size_t handleEnd = fidOffset + file_handle.sizeof + handle.handle_bytes; // Конец handle в буфере.
|
size_t handleEnd = fidOffset + file_handle.sizeof + handle.handle_bytes; // Конец handle в буфере.
|
||||||
if (handleEnd < offset + meta.event_len) // Проверка, что за handle есть место для имени.
|
if (handleEnd < offset + meta.event_len) // Проверка, что за handle есть место для имени.
|
Loading…
Add table
Add a link
Reference in a new issue