Добавлены проверки
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"
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										18
									
								
								source/app.d
									
										
									
									
									
								
							
							
						
						
									
										18
									
								
								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..."); // Вывод сообщения о старте мониторинга.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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