/* * Document-method: gethostbyname * call-seq: Socket.gethostbyname(host) => hostent * * Resolve +host+ and return name and address information for it, similarly to * gethostbyname(3). +host+ can be a domain name or the presentation format of * an address. * * Returns an array of information similar to that found in a +struct hostent+: * - cannonical name: the cannonical name for host in the DNS, or a * string representing the address * - aliases: an array of aliases for the canonical name, there may be no aliases * - address family: usually one of Socket::AF_INET or Socket::AF_INET6 * - address: a string, the binary value of the +struct sockaddr+ for this name, in * the indicated address family * - ...: if there are multiple addresses for this host, a series of * strings/+struct sockaddr+s may follow, not all necessarily in the same * address family. Note that the fact that they may not be all in the same * address family is a departure from the behaviour of gethostbyname(3). * * Note: I believe that the fact that the multiple addresses returned are not * necessarily in the same address family may be a bug, since if this function * actually called gethostbyname(3), ALL the addresses returned in the trailing * address list (h_addr_list from struct hostent) would be of the same address * family! Examples from my system, OS X 10.3: * * ["localhost", [], 30, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001", "\177\000\000\001"] * and * ["ensemble.local", [], 30, "\376\200\000\004\000\000\000\000\002\003\223\377\376\255\010\214", "\300\250{\232" ] * * Similar information can be returned by Socket.getaddrinfo if called as: * * Socket.getaddrinfo(+host+, 0, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME) * * == Examples * * Socket.gethostbyname "example.com" * => ["example.com", [], 2, "\300\000\"\246"] * * This name has no DNS aliases, and a single IPv4 address. * * Socket.gethostbyname "smtp.telus.net" * => ["smtp.svc.telus.net", ["smtp.telus.net"], 2, "\307\271\334\371"] * * This name is an an alias so the canonical name is returned, as well as the * alias and a single IPv4 address. * * Socket.gethostbyname "localhost" * => ["localhost", [], 30, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001", "\177\000\000\001"] * * This machine has no aliases, returns an IPv6 address, and has an additional IPv4 address. * * +host+ can also be an IP address in presentation format, in which case a * reverse lookup is done on the address: * * Socket.gethostbyname("127.0.0.1") * => ["localhost", [], 2, "\177\000\000\001"] * * Socket.gethostbyname("192.0.34.166") * => ["www.example.com", [], 2, "\300\000\"\246"] * * * == See * See: Socket.getaddrinfo */ static VALUE sock_s_gethostbyname(obj, host) VALUE obj, host; { rb_secure(3); return make_hostent(host, sock_addrinfo(host, Qnil, SOCK_STREAM, AI_CANONNAME), sock_sockaddr); }