#define _POSIX_C_SOURCE 200809L #include /* assert */ #include /* memcmp */ /* Systém WHOIS udržuje administrativní metadata o jménech vedených * ve veřejném systému DNS. Tato data nemají (globálně) žádný pevný * formát, z pohledu protokolu se jedná o volný text. * * Vaším úkolem je napsat proceduru ‹whois›, která: * * 1. získá adresu příslušného WHOIS serveru (jeho hostitelské * jméno je ‹tld.whois-servers.net›, kde se za ‹tld› doplní * příslušná doména nejvyšší úrovně, * 2. připojit se k tomuto serveru na port TCP 43, * 3. zjistit informace o zadané doméně ‹domain›. * * Samotný protokol je velmi jednoduchý – klient odešle doménové jméno * a konec řádku (CRLF, jak je na internetu běžné), server poté odešle * veškerá data o doméně a spojení ukončí. Pro jednoduchost odpověď * nijak neinterpretujte, pouze zkopírujte prvních ‹len› bajtů * odpovědi do předaného pole. * * Výsledek je 0 v případě úspěchu a -1 v případě chyby. */ int whois( const char *domain, char *buffer, int len ); /* ┄┄┄┄┄┄┄ %< ┄┄┄┄┄┄┄┄┄┄ následují testy ┄┄┄┄┄┄┄┄┄┄ %< ┄┄┄┄┄┄┄ */ int main( void ) { char buf[ 512 ] = { 0 }; assert( whois( "example.com", buf, 512 ) == 0 ); assert( memcmp( buf, " Domain Name: EXAMPLE.COM\r\n" " Registry Domain ID: 2336799_DOMAIN_COM-VRSN\r\n", 77 ) == 0 ); assert( whois( "vim.org", buf, 512 ) == 0 ); assert( memcmp( buf, "Domain Name: vim.org\r\n" "Registry Domain ID: 0fa5cba7e79a4325b8b47076eee87248-LROR\r\n", 81 ) == 0 ); assert( whois( "third.example.com", buf, 512 ) == 0 ); assert( memcmp( buf, "No match for \"THIRD.EXAMPLE.COM\".\r\n>>> Last update", 50 ) == 0 ); assert( whois( "this-domain-is.bad", buf, 512 ) == -1 ); assert( whois( "this-domain-is-tld-only", buf, 512 ) == -1 ); return 0; }