LINUX.ORG.RU

kernel socket


0

0

Всем привет. Подскажите как в ядре линукс преобразовать имя хоста в структуру sockaddr_in, ну я миею ввиду айпишник преобразовать. Мне надо что то на подобии функции gethostbyname из пользовательского пространства.

anonymous

Ответ на: комментарий от anonymous

> как решить задачу

Ты хоть задачу сформулируй нормально. Так, как ты ее уже сформулировал, ответ один - руками реализовать резольвер DNS в ядре.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

трюк с использованием какой-либо стандартной пользовательской программы, решающей задачу (типа ping, traceroute)

смысл состоит в создании процесса ядра и запуске в его контексте нужного пользовательского приложения
интерфейсом ядра является экспортируемая функция call_usermodhelper_pipe()
одним из ее параметров является struct file**
после завершения выполнения функции мы получим в распоряжение канал (struct file), через который мы можем прочитать вывод пользовательского приложения (через vfs_read())

rei3er
()
Ответ на: комментарий от rei3er

> смысл состоит в создании процесса ядра и запуске в его контексте нужного пользовательского приложения

ужоснахтунг

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

request_module()

тоже "ужоснахтунг"?

во всяком случае, реализация требуемой функциональности таким способом не будет _велосипедом_

rei3er
()
Ответ на: комментарий от rei3er

> request_module() тоже "ужоснахтунг"?

request_module - это прямо скажем из другой оперы и в случае с request_module другой вменяемый механизм придумать достаточно сложно.

в случае же с gethostbyname() куда как проще и надёжнее действительно реализовать свой простенький клиент к DNS. другой вопрос - зачем в ядре ресолвить сетевые имена.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

> другой вопрос - зачем в ядре ресолвить сетевые имена.

и почему нельзя просто передать туда IP-адрес.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

> как решить задачу

НЕ ДЕЛАТЬ ЭТОГО! руки б поотрывал, й, тот факт что в ядро _можно_ залезть, не значит что туда _нужно_ лезть немытыми руками.

Всё что можно сделать в юзерспейсе (а тут наверняка всё можно сделать в юзерспейсе) должно быть сделано в юзерспейсе. Точка.

anonymous
()
Ответ на: комментарий от klalafuda

> в случае же с gethostbyname() куда как проще и надёжнее действительно > реализовать свой простенький клиент к DNS

вы шутите?
это будет проще?
по-моему это будет в _разы_ сложнее и уж тем более менее надежно

rei3er
()
Ответ на: комментарий от klalafuda

кстати, никакого DNS в сетевой подсистеме нет
протокол DNS реализуется на обычных сокетах UDP
процесс же создания сокетов в нулевом кольце (и работа с ними) трудоемок и сложен

rei3er
()
Ответ на: комментарий от klalafuda

можем даже эксперимент провести, вы реализуете функциональность так, как вы хотите, а я - так, как я предложил ;)

rei3er
()
Ответ на: комментарий от rei3er

> можем даже эксперимент провести, вы реализуете функциональность так, как вы хотите, а я - так, как я предложил ;)

я бы сперва дождался комментариев от оригинального автора. что ему на самом деле хочется сделать и нужна ли вся эта кухня вообще.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от anonymous

> а что можно тогда в этом случае сделать, как решить задачу

Заведи себе негра в userspace, и отдавай ему грязную работу.

fmj
()
Ответ на: комментарий от anonymous

> про негра можно поподробнее

создать 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() и очереди ожидания

rei3er
()
Ответ на: комментарий от rei3er

>> про негра можно поподробнее

> создать 2 файла в /proc

Уж лучше call_usermodehelper* использовать.

> управление ожиданием процессов организуем через schedule(), wake_up() и очереди ожидания

"Ох уж эти хирурги, всё бы им резать" (с) анекдот

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Уж лучше call_usermodehelper* использовать.

Как я понимаю, он exec по сути делает, из ядра? Если да, то можно поспорить -- все зависит от того, как часто нужно что-то резолвить.

fmj
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.