From 582ae5a294844d725f2896c3002b154895363f52 Mon Sep 17 00:00:00 2001 From: Alexander Zhirov Date: Thu, 28 Aug 2025 23:07:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dub.json | 5 +---- dub.selections.json | 1 + source/app.d | 18 +++++++++++++++--- source/{fanotify_wrapper.d => dfanotify.d} | 5 ++--- 4 files changed, 19 insertions(+), 10 deletions(-) rename source/{fanotify_wrapper.d => dfanotify.d} (99%) diff --git a/dub.json b/dub.json index 4cf8d3a..60ff96a 100644 --- a/dub.json +++ b/dub.json @@ -9,9 +9,6 @@ "targetPath": "bin", "targetType": "executable", "dependencies": { - "fanotify": { - "repository": "git+https://git.zhirov.kz/dlang/fanotify.git", - "version": "97edc0d795c93ef773ff60d260951e5ff6ae6215" - } + "fanotify": "~>0.1.0" } } \ No newline at end of file diff --git a/dub.selections.json b/dub.selections.json index 322586b..3de4f99 100644 --- a/dub.selections.json +++ b/dub.selections.json @@ -1,5 +1,6 @@ { "fileVersion": 1, "versions": { + "fanotify": "0.1.0" } } diff --git a/source/app.d b/source/app.d index 2cc78c9..cd0dc67 100644 --- a/source/app.d +++ b/source/app.d @@ -5,24 +5,31 @@ // Импорты: fanotify_wrapper - обёртка, std.stdio для вывода, std.file для readLink (хотя здесь не используется из-за режима), // std.format для форматирования строк, core.sys.posix для констант. -import fanotify_wrapper; // Импорт обёртки для fanotify. +import dfanotify; // Импорт обёртки для fanotify. import std.stdio; // Импорт для writeln, writefln (вывод в консоль). import std.file : readLink; // Импорт readLink для чтения симлинков (не используется здесь, но оставлено для возможного расширения). import std.format : format; // Импорт format для форматирования строк (хотя здесь используется writefln напрямую). import core.sys.posix.fcntl : AT_FDCWD; // Импорт AT_FDCWD для текущей директории. import core.sys.posix.unistd : close; // Импорт close (не используется здесь, но для возможного расширения с fd). +import core.stdc.stdlib : exit; // Функция main: точка входа приложения. void main() { + Fanotify fan; // Инициализация объекта Fanotify с флагами: // FAN_CLASS_NOTIF - режим уведомлений (без контроля доступа), // FAN_CLOEXEC - закрытие дескриптора при exec, // FAN_REPORT_FID | FAN_REPORT_DIR_FID | FAN_REPORT_NAME - отчёт с FID (идентификатор файла) вместо fd, плюс имя файла. // Это позволяет получать имя без реального 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); + } catch (Exception e) { + writeln(e.msg); + exit(1); + } // Определение маски событий: битовая OR флагов для мониторинга. // FAN_OPEN - открытие, FAN_MODIFY - модификация, FAN_CLOSE - закрытие (включает WRITE и NOWRITE), @@ -32,7 +39,12 @@ void main() // Маркировка директории /tmp/scripts: // FAN_MARK_ADD - добавить марку, FAN_MARK_ONLYDIR - только для директории (ошибка, если не директория). // AT_FDCWD - базовая директория текущая, путь "/tmp/scripts". - fan.mark(FAN_MARK_ADD | FAN_MARK_ONLYDIR, eventMask, AT_FDCWD, "/tmp/scripts"); + try { + fan.mark(FAN_MARK_ADD | FAN_MARK_ONLYDIR, eventMask, AT_FDCWD, "/tmp/scripts"); + } catch (Exception e) { + writeln(e.msg); + exit(1); + } writeln("Мониторинг запущен для /tmp/scripts..."); // Вывод сообщения о старте мониторинга. diff --git a/source/fanotify_wrapper.d b/source/dfanotify.d similarity index 99% rename from source/fanotify_wrapper.d rename to source/dfanotify.d index 067373f..120272e 100644 --- a/source/fanotify_wrapper.d +++ b/source/dfanotify.d @@ -7,7 +7,7 @@ // std.string и std.conv для работы со строками, core.stdc.errno для errno и strerror для детальных сообщений об ошибках, // core.stdc.stdint для типов вроде uint64_t. -module fanotify_wrapper; +module dfanotify; 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 + имя). { // Расчёт смещения: пропускаем hdr, fsid (filesystem ID), затем file_handle. - size_t fidOffset = infoOffset + fanotify_event_info_header.sizeof + __kernel_fsid_t - .sizeof; + size_t fidOffset = infoOffset + fanotify_event_info_header.sizeof + __kernel_fsid_t.sizeof; auto handle = cast(file_handle*)(buffer.ptr + fidOffset); // Кастинг в структуру file_handle (содержит handle_bytes - размер handle). size_t handleEnd = fidOffset + file_handle.sizeof + handle.handle_bytes; // Конец handle в буфере. if (handleEnd < offset + meta.event_len) // Проверка, что за handle есть место для имени.