Cvičení č. 5 -- DNS

Napište program, který zadaný seznam IP adres převede na seznam jejich doménových jmen. Protože však překlad IP adresy na jméno bývá pomalý (v případě exotických jmen to může trvat i několik sekund), použijte paralelního zpracování několika podprocesy.

Řídící proces po startu pomocí příkazu fork(2) spustí několik svých podprocesů, které si propojí pomocí pipe(2). Poté čte standardní vstup, IP adresu na řádku pomocí funkce inet_pton převede na strukturu struct in_addr, dále zavolá select(2), kterým zjistí, který podproces je ochotný požadavek zpracovat, a tomu pomocí write(2) pošle in_addr strukturu.

Dítě, operující nad daným filedescriptorem, čte v cyklu pomocí read(2), dokud nenarazí na konec vstupu (read(2) vrátí 0) a zadanou in_addr strukturu převede na DNS jméno pomocí volání gethostbyaddr. IP adresu a DNS jméno (případně chybu) poté vypíše na standardní výstup.

Řídící program po dočtení vstupu uzavře všechny otevřené filedescriptory a poté počká na korektní ukončení každého podprocesu pomocí funkce wait(2).

Poznámky

Bonus

Dva kladné body získáte, pokud bude zdrojový kód kratší než 100 řádků. Vzorové řešení má 60 řádků (bez komentářů) a je vám k dispozici ve spustitelné podobě pro nymfy a aisu.

[Čt 31.3.] Omluva

"Vzorové" řešení jsem omylem zkompilovat s příliš velkou konstantou POOL, čímž program z jakýchsi bezpečnostních důvodů na školních počítačích nefungoval.

Na stejných adresách jsou nyní uloženy opravené binárky.

Poučení: Kontrolovat, kontrolovat, kontrolovat! ;-)