gethostbyaddr(p1, p2 = v2)
public
Obtains the host information for address.
p Socket.gethostbyaddr([221,186,184,68].pack("CCCC"))
Show source
static VALUE
sock_s_gethostbyaddr(int argc, VALUE *argv)
{
VALUE addr, family;
struct hostent *h;
struct sockaddr *sa;
char **pch;
VALUE ary, names;
int t = AF_INET;
rb_scan_args(argc, argv, "11", &addr, &family);
sa = (struct sockaddr*)StringValuePtr(addr);
if (!NIL_P(family)) {
t = rsock_family_arg(family);
}
else if (RSTRING_LEN(addr) == 16) {
t = AF_INET6;
}
h = gethostbyaddr(RSTRING_PTR(addr), RSTRING_LENINT(addr), t);
if (h == NULL) {
extern int h_errno;
rb_raise(rb_eSocket, "%s", (char*)hstrerror(h_errno));
rb_raise(rb_eSocket, "host not found");
}
ary = rb_ary_new();
rb_ary_push(ary, rb_str_new2(h->h_name));
names = rb_ary_new();
rb_ary_push(ary, names);
if (h->h_aliases != NULL) {
for (pch = h->h_aliases; *pch; pch++) {
rb_ary_push(names, rb_str_new2(*pch));
}
}
rb_ary_push(ary, INT2NUM(h->h_addrtype));
for (pch = h->h_addr_list; *pch; pch++) {
rb_ary_push(ary, rb_str_new(*pch, h->h_length));
}
rb_ary_push(ary, rb_str_new(h->h_addr, h->h_length));
return ary;
}