Добавлены проверки
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",
|
||||
"targetType": "executable",
|
||||
"dependencies": {
|
||||
"fanotify": {
|
||||
"repository": "git+https://git.zhirov.kz/dlang/fanotify.git",
|
||||
"version": "97edc0d795c93ef773ff60d260951e5ff6ae6215"
|
||||
}
|
||||
"fanotify": "~>0.1.0"
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
{
|
||||
"fileVersion": 1,
|
||||
"versions": {
|
||||
"fanotify": "0.1.0"
|
||||
}
|
||||
}
|
||||
|
|
16
source/app.d
16
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".
|
||||
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..."); // Вывод сообщения о старте мониторинга.
|
||||
|
||||
|
|
|
@ -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 есть место для имени.
|
Loading…
Add table
Add a link
Reference in a new issue