Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
На этом функция main() завершается:
return (0);
}
Процесс-демон
Весь код, отвечающий за запуск, функционирование и остановку процесса-демона, разместим в файле sf_daemon.c. По сути, этот файл будет представлять собой набор функций.
Заголовочные файлы и переменные
Вначале, как всегда, определимся с заголовочными файлами и переменными. Нам понадобятся:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <time.h>
#include <signal.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/in.h>
#include "sf_daemon.h"
Файл sf_daemon.h имеет следующее содержание:
#include <linux/types.h>
#include <linux/ip.h>
Имя log-файла:
#define LOG "/var/log/daemon"
struct data_log {
__u32 addr;
int action;
int ready;
};
В этом файле определено имя log-файла и структура data_log, в которой хранятся данные для заполнения log-файла. Назначение полей структуры следующее:
n __u32 – IP-адрес хоста (в сетевом формате), от которого поступил пакет;
n int action – выполняемое действие (1 – разрешить прохождение пакета, 0 – отбросить пакет);
n int ready – флаг готовности данных в устройстве для считывания.
Поскольку наш демон работает с двумя файлами (файл устройства /dev/firewall и log-файл), то необходимо определить две переменные для хранения дескрипторов этих файлов:
int fddev=0; - дескриптор файла устройства;
int f; - дескриптор log-файла.
Функции
Первая функция, которую мы рассмотрим, останавливает выполнение процесса-демона. Вот что она из себя представляет:
void stop_daemon()
{
close(fddev);
stop_log(f);
exit(0);
}
Функция закрывает устройство, завершает ведение log-файла и осуществляет выход из программы.
Следующую функцию можно назвать центральной частью процесса-демона. Эта функция осуществляет непосредственный обмен данными с модулем ядра и заполняет log-файл. Главной особенностью данной функции является выполнение в бесконечном цикле, который прерывается только при поступлении сигнала SIGINT.
void packet_loop(void)
{
Структура для информационного обмена с модулем:
struct data_log data;
Размер блока данных, считанного из модуля:
int count;
Запускаем цикл:
for (;;) {