37 #include "ruby/config.h"
39 #include RUBY_EXTCONF_H
42 #include <sys/types.h>
44 #if defined(__BEOS__) && !defined(__HAIKU__) && !defined(BONE)
45 # include <net/socket.h>
47 # include <sys/socket.h>
49 #include <netinet/in.h>
50 #if defined(HAVE_ARPA_INET_H)
51 #include <arpa/inet.h>
53 #if defined(HAVE_ARPA_NAMESER_H)
54 #include <arpa/nameser.h>
57 #if defined(HAVE_RESOLV_H)
64 #define snprintf _snprintf
96 {PF_INET6,
sizeof(
struct in6_addr),
97 sizeof(struct sockaddr_in6),
98 offsetof(struct sockaddr_in6, sin6_addr)},
103 {
PF_INET,
sizeof(
struct in_addr),
104 sizeof(struct sockaddr_in),
105 offsetof(struct sockaddr_in, sin_addr)},
109 #define ENI_NOSOCKET 0
110 #define ENI_NOSERVNAME 1
111 #define ENI_NOHOSTNAME 2
117 #ifndef HAVE_INET_NTOP
119 inet_ntop(
int af,
const void *addr,
char *numaddr,
size_t numaddr_len)
121 #ifdef HAVE_INET_NTOA
123 memcpy(&in.s_addr, addr,
sizeof(in.s_addr));
124 snprintf(numaddr, numaddr_len,
"%s", inet_ntoa(in));
126 unsigned long x = ntohl(*(
unsigned long*)addr);
127 snprintf(numaddr, numaddr_len,
"%d.%d.%d.%d",
128 (
int) (x>>24) & 0xff, (
int) (x>>16) & 0xff,
129 (
int) (x>> 8) & 0xff, (
int) (x>> 0) & 0xff);
136 getnameinfo(
const struct sockaddr *sa, socklen_t salen,
char *host, socklen_t hostlen,
char *serv, socklen_t servlen,
int flags)
157 family = sa->sa_family;
159 if (
afdl[i].a_af == family) {
168 port = ((
struct sockinet *)sa)->si_port;
169 addr = (
char *)sa + afd->
a_off;
171 if (serv ==
NULL || servlen == 0) {
174 snprintf(numserv,
sizeof(numserv),
"%d", ntohs(port));
175 if (
strlen(numserv) + 1 > servlen)
177 strcpy(serv, numserv);
179 #if defined(HAVE_GETSERVBYPORT)
180 struct servent *sp = getservbyport(port, (flags &
NI_DGRAM) ?
"udp" :
"tcp");
182 if (
strlen(sp->s_name) + 1 > servlen)
184 strcpy(serv, sp->s_name);
192 switch (sa->sa_family) {
194 v4a = ntohl(((
struct sockaddr_in *)sa)->sin_addr.s_addr);
204 pfx = ((
struct sockaddr_in6 *)sa)->sin6_addr.s6_addr8[0];
206 pfx = ((
struct sockaddr_in6 *)sa)->sin6_addr.s6_addr[0];
208 if (pfx == 0 || pfx == 0xfe || pfx == 0xff)
213 if (host ==
NULL || hostlen == 0) {
219 if (
strlen(numaddr) > hostlen)
221 strcpy(host, numaddr);
224 hp = getipnodebyaddr(addr, afd->
a_addrlen, afd->
a_af, &h_error);
232 p =
strchr(hp->h_name,
'.');
235 if (
strlen(hp->h_name) + 1 > hostlen) {
241 strcpy(host, hp->h_name);
251 if (
strlen(numaddr) > hostlen)
253 strcpy(host, numaddr);
size_t strlen(const char *)
if(len<=MAX_WORD_LENGTH &&len >=MIN_WORD_LENGTH)
#define offsetof(p_type, field)
static const char * inet_ntop(int af, const void *addr, char *numaddr, size_t numaddr_len)
char * strchr(char *, char)
register unsigned int len
#define IN_EXPERIMENTAL(i)
int getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags)