Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #62, ЯНВАРЬ 2006 г.

Ядерная слежка

Alexander S. Salieff

Спецвыпуск: Хакер, номер #062, стр. 062-056-4


FAMConnection fc;

if (FAMOpen(&fc)!=0) exit(1);

В рамках созданного соединения можно создавать запросы на мониторинг. Так как FAM реализован в виде архитектуры клиент-сервер, имена файлов и директорий нужно передавать в абсолютной форме, относительное именование недопустимо:

FAMRequest fr;

FAMMonitorDirectory(&fc, "/home/usr/mydir", &fr, NULL);

FAMMonitorFile(&fc, "/home/usr/mydir", &fr, NULL);

После того как соединение включит в себя хотя бы один запрос на мониторинг, нужно проверять его на предмет появления событий, считывать эти события и обрабатывать:

if (FAMPending(&fc)<=0) break;

FAMEvent fe;

if (FAMNextEvent(&fc, &fe)<=0) break;

MyEventHandle(fe);

Полученное событие оформлено в виде структуры FAMEvent и содержит дескрипторы соединения и запроса, имена хоста и файла, полезную нагрузку (тот самый указатель в четвертом аргументе функция создания запроса) и код, сигнализирующий, что конкретно произошло с объектом наблюдения:

struct FAMEvent {

FAMConnection* fc;

FAMRequest fr;

char *hostname;

char filename[PATH_MAX];

void *userdata;

FAMCodes code;

};

Если не хочется полагаться на FAMPending и требуется создать собственную систему, которая использует демультиплексированный ввод-вывод при общении с сервером, то можно запросить дескриптор соединения с сервером с помощью следующего макроса:

int fam_fd = FAMCONNECTION_GETFD(&fc);

fd_set readfds;

FD_ZERO(&readfds);

FD_SET(fam_fd, &readfds);

while(!break_flag) {

if (select(fam_fd+1, &readfds, NULL, NULL, NULL)<0) exit(1);

if (!FD_ISSET(fam_fd, &readfds)) continue;

if (FAMNextEvent(&fc, &fe) < 0) ...

Получение событий можно приостанавливать и возобновлять либо окончательно завершать избирательно для различных запросов, оперируя дескрипторами, полученными при их создании и общим дескриптором соединения:

FAMSuspendMonitor(&fc, &fr);

FAMResumeMonitor(&fc, &fr);

FAMCancelMonitor(&fc, &fr);

В принципе, описанного вполне достаточно, чтобы создать свою FAM-базированную систему. FAM-демон — это незаметный, но вполне востребованный компонент современного UNIX-дистрибутива. И хотя многие не замечают этого, к его услугам активно прибегает масса софта, в том числе и системно-административные программы, и вполне пользовательские, к примеру, входящие в состав KDE

Маски Inotify

IN_ACCESS — был доступ к файлу

IN_MODIFY — файл модифицирован

Назад на стр. 062-056-3  Содержание  Вперед на стр. 062-056-5