Дано: FreeBSD 6.2 c PF в качестве фаервола. В pf.conf есть таблицаtable <test> persist
на все попытки сделать
ioctl(dev_pf, DIOCRADDADDRS, &io)
ioctl возвращает -1 а в errno пишет ENODEV - Operation not supported by device.
Беглый осмотр внутренностей pfctl ответа не дал, а после изучения spamd закралось смутное сомнение, что во FreeBSD действительно нельзя выполнить DIOCRADDADDRS из пользовательской программы.
Может кто сталкивался с этим ? Поиск в google ничего вразумительного не дал :(
if (io->pfrio_esize != sizeof(struct pfr_addr)) {
error = ENODEV;
break;
}
Уверены, что в структуре io, которую передаете, все правильно выставлено?
>if (io->pfrio_esize != sizeof(struct pfr_addr)) {
>
>
> error = ENODEV;
>
>
> break;
>
> }
>Уверены, что в структуре io, которую передаете, все правильно выставлено?Да. Это, в исходниках pf_ioctl.c, я видел. Пробегался дебагером по своему коду
io->pfrio_esize == sizeof(addr);Конечно есть вероятность того, что я чего-то не учёл :) , но в исходниках spamd это реализовано через
execvp("/sbin/pfctl", ....)
Вот и думаю. Оставить костыль в виде exec, или же копать дальше.
>execvp("/sbin/pfctl", ....)
>
>Вот и думаю. Оставить костыль в виде exec, или же копать дальше.
>
Ну, не такой уж и костыль, скорее unix way в действии. Да и на мой взгляд понадежней, ибо у утилит обычно флаги и параметры редко меняются, только дополняются новыми, а вот смена API, к примеру кодов ioctl происходит все-таки чаще от версии к версии.
>Ну, не такой уж и костыль, скорее unix way в действии. Да
>и на мой взгляд понадежней, ибо у утилит обычно флаги и
>параметры редко меняются, только дополняются новыми, а вот смена API, к
>примеру кодов ioctl происходит все-таки чаще от версии к версии.Просто хотел обойтись без
if(!fork())
{
execvp(...);
}или создания нового thread-а, а просто послать сигнал из демона в /dev/pf :)