4#include "ruby/config.h"
7#if defined(__sun) || defined(_AIX)
37# undef HAVE_TYPE_STRUCT_SOCKADDR_DL
40# include <sys/socket.h>
41# include <netinet/in.h>
42# ifdef HAVE_NETINET_IN_SYSTM_H
43# include <netinet/in_systm.h>
45# ifdef HAVE_NETINET_TCP_H
46# include <netinet/tcp.h>
48# ifdef HAVE_NETINET_TCP_FSM_H
49# include <netinet/tcp_fsm.h>
51# ifdef HAVE_NETINET_UDP_H
52# include <netinet/udp.h>
54# ifdef HAVE_ARPA_INET_H
55# include <arpa/inet.h>
60#ifdef HAVE_NETPACKET_PACKET_H
61# include <netpacket/packet.h>
64#ifdef HAVE_NET_ETHERNET_H
65# include <net/ethernet.h>
72#if defined(HAVE_FCNTL)
73# ifdef HAVE_SYS_SELECT_H
74# include <sys/select.h>
76# ifdef HAVE_SYS_TYPES_H
77# include <sys/types.h>
79# ifdef HAVE_SYS_TIME_H
94#ifdef HAVE_SYS_IOCTL_H
95# include <sys/ioctl.h>
98#ifdef HAVE_SYS_SOCKIO_H
99# include <sys/sockio.h>
106#ifdef HAVE_SYS_PARAM_H
107# include <sys/param.h>
110#ifdef HAVE_SYS_UCRED_H
111# include <sys/ucred.h>
118#ifdef HAVE_NET_IF_DL_H
119# include <net/if_dl.h>
126#ifndef HAVE_GETADDRINFO
132#include "internal/error.h"
133#include "internal/gc.h"
143#ifndef HAVE_TYPE_SOCKLEN_T
147#ifdef NEED_IF_INDEXTONAME_DECL
148char *if_indextoname(
unsigned int,
char *);
150#ifdef NEED_IF_NAMETOINDEX_DECL
151unsigned int if_nametoindex(
const char *);
155 (0 < (socklen_t)-1 ? \
157 (((((socklen_t)1) << (sizeof(socklen_t) * CHAR_BIT - 2)) - 1) * 2 + 1))
159#ifndef RSTRING_SOCKLEN
160# define RSTRING_SOCKLEN (socklen_t)RSTRING_LENINT
164# define EWOULDBLOCK EAGAIN
174#define pseudo_AF_FTIP pseudo_AF_RTIP
178# define NI_MAXHOST 1025
181# define NI_MAXSERV 32
185# define IS_IP_FAMILY(af) ((af) == AF_INET || (af) == AF_INET6)
187# define IS_IP_FAMILY(af) ((af) == AF_INET)
190#ifndef IN6_IS_ADDR_UNIQUE_LOCAL
191# define IN6_IS_ADDR_UNIQUE_LOCAL(a) (((a)->s6_addr[0] == 0xfc) || ((a)->s6_addr[0] == 0xfd))
194#ifndef HAVE_TYPE_STRUCT_SOCKADDR_STORAGE
198# define _SS_MAXSIZE 128
199# define _SS_ALIGNSIZE (sizeof(double))
200# define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof(unsigned char) * 2)
201# define _SS_PAD2SIZE (_SS_MAXSIZE - sizeof(unsigned char) * 2 - \
202 _SS_PAD1SIZE - _SS_ALIGNSIZE)
205# ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
206 unsigned char ss_len;
218 struct sockaddr addr;
219 struct sockaddr_in
in;
221 struct sockaddr_in6 in6;
223#ifdef HAVE_TYPE_STRUCT_SOCKADDR_UN
224 struct sockaddr_un un;
226#ifdef HAVE_TYPE_STRUCT_SOCKADDR_DL
227 struct sockaddr_dl dl;
230 char place_holder[2048];
239# undef __DARWIN_ALIGNBYTES
240# define __DARWIN_ALIGNBYTES (sizeof(unsigned int) - 1)
245# define CMSG_SPACE(len) (_CMSG_ALIGN(sizeof(struct cmsghdr)) + _CMSG_ALIGN(len))
248# define CMSG_LEN(len) (_CMSG_ALIGN(sizeof(struct cmsghdr)) + (len))
257#define FMODE_NOREVLOOKUP 0x100
260#define FMODE_UNIX 0x00200000
261#define FMODE_INET 0x00400000
262#define FMODE_INET6 0x00800000
263#define FMODE_SOCK (FMODE_UNIX|FMODE_INET|FMODE_INET6)
271extern VALUE rb_cUNIXSocket;
272extern VALUE rb_cUNIXServer;
281extern VALUE rb_cSOCKSSocket;
290#define BLOCKING_REGION_FD(func, arg) (long)rb_thread_io_blocking_region((func), (arg), (arg)->fd)
292#define SockAddrStringValue(v) rsock_sockaddr_string_value(&(v))
293#define SockAddrStringValuePtr(v) rsock_sockaddr_string_value_ptr(&(v))
294#define SockAddrStringValueWithAddrinfo(v, rai_ret) rsock_sockaddr_string_value_with_addrinfo(&(v), &(rai_ret))
319int rb_getnameinfo(
const struct sockaddr *sa,
socklen_t salen,
char *host,
size_t hostlen,
char *serv,
size_t servlen,
int flags);
383#if defined(HAVE_SENDMSG)
389#define rsock_bsock_sendmsg rb_f_notimplement
390#define rsock_bsock_sendmsg_nonblock rb_f_notimplement
393#if defined(HAVE_RECVMSG)
398ssize_t rsock_recvmsg(
int socket,
struct msghdr *message,
int flags);
400#define rsock_bsock_recvmsg rb_f_notimplement
401#define rsock_bsock_recvmsg_nonblock rb_f_notimplement
404#ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
405void rsock_discard_cmsg_resource(
struct msghdr *mh,
int msg_peek_p);
443#if defined(__linux__)
447# define MSG_DONTWAIT_RELIABLE 1
450# define rsock_maybe_fd_writable(fd) rb_thread_fd_writable((fd))
451# define rsock_maybe_wait_fd(fd) rb_thread_wait_fd((fd))
458#ifndef MSG_DONTWAIT_RELIABLE
459# define MSG_DONTWAIT_RELIABLE 0
467#if !defined HAVE_INET_NTOP && ! defined _WIN32
468const char *
inet_ntop(
int,
const void *,
char *,
size_t);
469#elif defined __MINGW32__
470# define inet_ntop(f,a,n,l) rb_w32_inet_ntop(f,a,n,l)
471#elif defined _MSC_VER && RUBY_MSVCRT_VERSION < 90
472const char *WSAAPI
inet_ntop(
int,
const void *,
char *,
size_t);
char str[HTML_ESCAPE_MAX_LEN+1]
unsigned in(void *in_desc, z_const unsigned char **buf)
Internal header for Array.
Internal header for Thread.
Internal header for RubyVM.
VALUE type(ANYARGS)
ANYARGS-ed function type.
VALUE rsock_sockaddr_string_value_with_addrinfo(volatile VALUE *v, VALUE *ai_ret)
void rb_freeaddrinfo(struct rb_addrinfo *ai)
void rsock_init_udpsocket(void)
VALUE rsock_addrinfo_new(struct sockaddr *addr, socklen_t len, int family, int socktype, int protocol, VALUE canonname, VALUE inspectname)
void rsock_sys_fail_sockaddr(const char *, struct sockaddr *addr, socklen_t len)
VALUE rsock_init_unixsock(VALUE sock, VALUE path, int server)
void rsock_make_fd_nonblock(int fd)
VALUE rsock_addrinfo_inspect_sockaddr(VALUE rai)
VALUE rsock_sendto_blocking(void *data)
VALUE rsock_sockaddr_string_value(volatile VALUE *)
VALUE rsock_init_inetsock(VALUE sock, VALUE remote_host, VALUE remote_serv, VALUE local_host, VALUE local_serv, int type, VALUE resolv_timeout, VALUE connect_timeout)
void rsock_sys_fail_host_port(const char *, VALUE, VALUE)
void rsock_syserr_fail_path(int err, const char *, VALUE)
void rsock_init_tcpserver(void)
char * rsock_sockaddr_string_value_ptr(volatile VALUE *)
VALUE rsock_s_recvfrom_nonblock(VALUE sock, VALUE len, VALUE flg, VALUE str, VALUE ex, enum sock_recv_type from)
void rsock_syserr_fail_host_port(int err, const char *, VALUE, VALUE)
#define rsock_bsock_recvmsg
#define rsock_bsock_sendmsg_nonblock
int rsock_family_arg(VALUE domain)
void rsock_init_sockifaddr(void)
VALUE rb_check_sockaddr_string_type(VALUE)
VALUE rsock_freeaddrinfo(VALUE arg)
void rsock_init_addrinfo(void)
void rsock_syserr_fail_sockaddr(int err, const char *mesg, struct sockaddr *addr, socklen_t len)
void rsock_init_ipsocket(void)
int rsock_shutdown_how_arg(VALUE how)
void rsock_init_ancdata(void)
void rsock_raise_socket_error(const char *, int)
int rsock_cmsg_type_arg(int family, int level, VALUE type)
void rsock_init_socket_constants(void)
struct rb_addrinfo * rsock_getaddrinfo(VALUE host, VALUE port, struct addrinfo *hints, int socktype_hack)
int rsock_getfamily(rb_io_t *fptr)
void rsock_init_sockopt(void)
VALUE rsock_sockaddr_obj(struct sockaddr *addr, socklen_t len)
VALUE rsock_make_hostent(VALUE host, struct rb_addrinfo *addr, VALUE(*ipaddr)(struct sockaddr *, socklen_t))
void rsock_syserr_fail_raddrinfo(int err, const char *mesg, VALUE rai)
#define rsock_bsock_recvmsg_nonblock
VALUE rsock_s_accept_nonblock(VALUE klass, VALUE ex, rb_io_t *fptr, struct sockaddr *sockaddr, socklen_t *len)
int rsock_optname_arg(int family, int level, VALUE optname)
VALUE rsock_s_accept(VALUE klass, int fd, struct sockaddr *sockaddr, socklen_t *len)
int rsock_socket(int domain, int type, int proto)
VALUE rsock_make_ipaddr(struct sockaddr *addr, socklen_t addrlen)
int rsock_detect_cloexec(int fd)
VALUE rsock_init_sock(VALUE sock, int fd)
void rsock_init_sockssocket(void)
int rsock_do_not_reverse_lookup
#define rsock_bsock_sendmsg
VALUE rsock_s_recvfrom(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from)
#define rsock_maybe_fd_writable(fd)
VALUE rsock_write_nonblock(VALUE sock, VALUE buf, VALUE ex)
int rsock_level_arg(int family, VALUE level)
void rsock_init_tcpsocket(void)
VALUE rsock_send_blocking(void *data)
int rsock_revlookup_flag(VALUE revlookup, int *norevlookup)
void rsock_init_unixsocket(void)
void rsock_sys_fail_raddrinfo_or_sockaddr(const char *, VALUE addr, VALUE rai)
VALUE rsock_read_nonblock(VALUE sock, VALUE length, VALUE buf, VALUE ex)
int rb_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct rb_addrinfo **res)
void rsock_syserr_fail_raddrinfo_or_sockaddr(int err, const char *mesg, VALUE addr, VALUE rai)
void rsock_sys_fail_path(const char *, VALUE)
VALUE rsock_sock_listen(VALUE sock, VALUE log)
int rsock_socktype_arg(VALUE type)
void rsock_init_socket_init(void)
struct rb_addrinfo * rsock_addrinfo(VALUE host, VALUE port, int family, int socktype, int flags)
void rsock_init_basicsocket(void)
VALUE rsock_ipaddr(struct sockaddr *sockaddr, socklen_t sockaddrlen, int norevlookup)
int rsock_fd_family(int fd)
int rsock_connect(int fd, const struct sockaddr *sockaddr, int len, int socks, struct timeval *timeout)
const char * inet_ntop(int, const void *, char *, size_t)
VALUE rsock_bsock_send(int argc, VALUE *argv, VALUE sock)
socklen_t rsock_sockaddr_len(struct sockaddr *addr)
int rb_getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags)
#define rsock_maybe_wait_fd(fd)
VALUE rsock_fd_socket_addrinfo(int fd, struct sockaddr *addr, socklen_t len)
VALUE rsock_io_socket_addrinfo(VALUE io, struct sockaddr *addr, socklen_t len)
void rsock_init_unixserver(void)
VALUE rsock_inspect_sockaddr(struct sockaddr *addr, socklen_t socklen, VALUE ret)
VALUE rsock_sockopt_new(int family, int level, int optname, VALUE data)
void rsock_sys_fail_raddrinfo(const char *, VALUE rai)
#define rsock_sock_s_socketpair
char __ss_pad2[_SS_PAD2SIZE]
char __ss_pad1[_SS_PAD1SIZE]