Всем привет. Подскажите как в ядре линукс преобразовать имя хоста в структуру sockaddr_in, ну я миею ввиду айпишник преобразовать. Мне надо что то на подобии функции gethostbyname из пользовательского пространства.
трюк с использованием какой-либо стандартной пользовательской программы, решающей задачу (типа ping, traceroute)
смысл состоит в создании процесса ядра и запуске в его контексте нужного пользовательского приложения
интерфейсом ядра является экспортируемая функция call_usermodhelper_pipe()
одним из ее параметров является struct file**
после завершения выполнения функции мы получим в распоряжение канал (struct file), через который мы можем прочитать вывод пользовательского приложения (через vfs_read())
request_module - это прямо скажем из другой оперы и в случае с request_module другой вменяемый механизм придумать достаточно сложно.
в случае же с gethostbyname() куда как проще и надёжнее действительно реализовать свой простенький клиент к DNS. другой вопрос - зачем в ядре ресолвить сетевые имена.
> в случае же с gethostbyname() куда как проще и надёжнее действительно > реализовать свой простенький клиент к DNS
вы шутите?
это будет проще?
по-моему это будет в _разы_ сложнее и уж тем более менее надежно
кстати, никакого DNS в сетевой подсистеме нет
протокол DNS реализуется на обычных сокетах UDP
процесс же создания сокетов в нулевом кольце (и работа с ними) трудоемок и сложен
> про негра можно поподробнее
создать 2 файла в /proc
один для чтения запросов модуля, второй для получения ответов от процесса DNS
процесс DNS выполняет нечто наподобие этого
struct sockaddr address;
while (read(r_fd, &request, sizeof(request_t)) > 0) {
resolve(&request, &address);
write(w_fd, &address, sizeof(struct sockaddr));
}
в модуле определяем обработчики чтения/записи созданных файлов /proc
управление ожиданием процессов организуем через schedule(), wake_up() и очереди ожидания