1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/ext/socket/sockport.h
akr 2e6b97a45d * ext/socket: Bypass getaddrinfo() if node and serv are numeric.
Reporeted by Naotoshi Seo.  [ruby-core:60801] [Bug ]

* ext/socket/extconf.rb: Detect struct sockaddr_in6.sin6_len.

* ext/socket/sockport.h (SET_SIN6_LEN): New macro.
  (INIT_SOCKADDR_IN6): Ditto.

* ext/socket/rubysocket.h (struct rb_addrinfo): Add
  allocated_by_malloc field.

* ext/socket/raddrinfo.c (numeric_getaddrinfo): New function.
  (rb_getaddrinfo): Call numeric_getaddrinfo at first.
  (rb_freeaddrinfo): Free struct addrinfo properly when it is
  allocated by numeric_getaddrinfo.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45047 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2014-02-19 10:37:43 +00:00

116 lines
3.1 KiB
C

/************************************************
sockport.h -
$Author$
created at: Fri Apr 30 23:19:34 JST 1999
************************************************/
#ifndef SOCKPORT_H
#define SOCKPORT_H
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
# define VALIDATE_SOCKLEN(addr, len) ((addr)->sa_len == (len))
#else
# define VALIDATE_SOCKLEN(addr, len) ((void)(addr), (void)(len), 1)
#endif
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
# define SET_SA_LEN(sa, len) (void)((sa)->sa_len = (len))
#else
# define SET_SA_LEN(sa, len) (void)(len)
#endif
/* for strict-aliasing rule */
#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
# define SET_SIN_LEN(sa, len) (void)((sa)->sin_len = (len))
#else
# define SET_SIN_LEN(sa, len) SET_SA_LEN((struct sockaddr *)(sa), (len))
#endif
#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN
# define SET_SIN6_LEN(sa, len) (void)((sa)->sin6_len = (len))
#else
# define SET_SIN6_LEN(sa, len) SET_SA_LEN((struct sockaddr *)(sa), (len))
#endif
#define INIT_SOCKADDR(addr, family, len) \
do { \
struct sockaddr *init_sockaddr_ptr = (addr); \
socklen_t init_sockaddr_len = (len); \
memset(init_sockaddr_ptr, 0, init_sockaddr_len); \
init_sockaddr_ptr->sa_family = (family); \
SET_SA_LEN(init_sockaddr_ptr, init_sockaddr_len); \
} while (0)
#define INIT_SOCKADDR_IN(addr, len) \
do { \
struct sockaddr_in *init_sockaddr_ptr = (addr); \
socklen_t init_sockaddr_len = (len); \
memset(init_sockaddr_ptr, 0, init_sockaddr_len); \
init_sockaddr_ptr->sin_family = AF_INET; \
SET_SIN_LEN(init_sockaddr_ptr, init_sockaddr_len); \
} while (0)
#define INIT_SOCKADDR_IN6(addr, len) \
do { \
struct sockaddr_in6 *init_sockaddr_ptr = (addr); \
socklen_t init_sockaddr_len = (len); \
memset(init_sockaddr_ptr, 0, init_sockaddr_len); \
init_sockaddr_ptr->sin6_family = AF_INET6; \
SET_SIN6_LEN(init_sockaddr_ptr, init_sockaddr_len); \
} while (0)
/* for strict-aliasing rule */
#ifdef HAVE_TYPE_STRUCT_SOCKADDR_UN
# ifdef HAVE_STRUCT_SOCKADDR_IN_SUN_LEN
# define SET_SUN_LEN(sa, len) (void)((sa)->sun_len = (len))
# else
# define SET_SUN_LEN(sa, len) SET_SA_LEN((struct sockaddr *)(sa), (len))
# endif
# define INIT_SOCKADDR_UN(addr, len) \
do { \
struct sockaddr_un *init_sockaddr_ptr = (addr); \
socklen_t init_sockaddr_len = (len); \
memset(init_sockaddr_ptr, 0, init_sockaddr_len); \
init_sockaddr_ptr->sun_family = AF_UNIX; \
SET_SUN_LEN(init_sockaddr_ptr, init_sockaddr_len); \
} while (0)
#endif
#ifndef IN_MULTICAST
# define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000)
# define IN_MULTICAST(i) IN_CLASSD(i)
#endif
#ifndef IN_EXPERIMENTAL
# define IN_EXPERIMENTAL(i) ((((long)(i)) & 0xe0000000) == 0xe0000000)
#endif
#ifndef IN_CLASSA_NSHIFT
# define IN_CLASSA_NSHIFT 24
#endif
#ifndef IN_LOOPBACKNET
# define IN_LOOPBACKNET 127
#endif
#ifndef AF_UNSPEC
# define AF_UNSPEC 0
#endif
#ifndef PF_UNSPEC
# define PF_UNSPEC AF_UNSPEC
#endif
#ifndef PF_INET
# define PF_INET AF_INET
#endif
#if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
extern int h_errno;
#endif
#endif