2 #define RUBY_SOCKET_H 1
10 #include <sys/types.h>
26 #if defined(__BEOS__) && !defined(__HAIKU__) && !defined(BONE)
27 # include <net/socket.h>
29 # include <sys/socket.h>
31 #include <netinet/in.h>
32 #ifdef HAVE_NETINET_IN_SYSTM_H
33 # include <netinet/in_systm.h>
35 #ifdef HAVE_NETINET_TCP_H
36 # include <netinet/tcp.h>
38 #ifdef HAVE_NETINET_UDP_H
39 # include <netinet/udp.h>
41 #ifdef HAVE_ARPA_INET_H
42 # include <arpa/inet.h>
51 #if defined(HAVE_FCNTL)
52 #ifdef HAVE_SYS_SELECT_H
53 #include <sys/select.h>
55 #ifdef HAVE_SYS_TYPES_H
56 #include <sys/types.h>
58 #ifdef HAVE_SYS_TIME_H
69 #ifdef HAVE_SYS_IOCTL_H
70 #include <sys/ioctl.h>
72 #ifdef HAVE_SYS_SOCKIO_H
73 #include <sys/sockio.h>
79 #ifdef HAVE_SYS_PARAM_H
80 #include <sys/param.h>
82 #ifdef HAVE_SYS_UCRED_H
83 #include <sys/ucred.h>
90 #define EWOULDBLOCK EAGAIN
100 #define pseudo_AF_FTIP pseudo_AF_RTIP
102 #ifndef HAVE_GETADDRINFO
108 # define NI_MAXHOST 1025
111 # define NI_MAXSERV 32
115 # define IS_IP_FAMILY(af) ((af) == AF_INET || (af) == AF_INET6)
117 # define IS_IP_FAMILY(af) ((af) == AF_INET)
120 #ifndef IN6_IS_ADDR_UNIQUE_LOCAL
121 # define IN6_IS_ADDR_UNIQUE_LOCAL(a) (((a)->s6_addr[0] == 0xfc) || ((a)->s6_addr[0] == 0xfd))
124 #ifndef HAVE_SOCKADDR_STORAGE
128 #define _SS_MAXSIZE 128
129 #define _SS_ALIGNSIZE (sizeof(double))
130 #define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof(unsigned char) * 2)
131 #define _SS_PAD2SIZE (_SS_MAXSIZE - sizeof(unsigned char) * 2 - \
132 _SS_PAD1SIZE - _SS_ALIGNSIZE)
136 unsigned char ss_len;
153 #undef __DARWIN_ALIGNBYTES
154 #define __DARWIN_ALIGNBYTES (sizeof(unsigned int) - 1)
159 # define CMSG_SPACE(len) (_CMSG_ALIGN(sizeof(struct cmsghdr)) + _CMSG_ALIGN(len))
162 # define CMSG_LEN(len) (_CMSG_ALIGN(sizeof(struct cmsghdr)) + (len))
168 #define close closesocket
171 #define INET_CLIENT 0
172 #define INET_SERVER 1
176 #define FMODE_NOREVLOOKUP 0x100
184 extern VALUE rb_cUNIXSocket;
185 extern VALUE rb_cUNIXServer;
194 extern VALUE rb_cSOCKSSocket;
203 #include "constdefs.h"
205 #define BLOCKING_REGION(func, arg) (long)rb_thread_blocking_region((func), (arg), RUBY_UBF_IO, 0)
206 #define BLOCKING_REGION_FD(func, arg) (long)rb_thread_io_blocking_region((func), (arg), (arg)->fd)
208 #define SockAddrStringValue(v) rsock_sockaddr_string_value(&(v))
209 #define SockAddrStringValuePtr(v) rsock_sockaddr_string_value_ptr(&(v))
226 int rb_getnameinfo(
const struct sockaddr *sa, socklen_t salen,
char *host,
size_t hostlen,
char *serv,
size_t servlen,
int flags);
241 VALUE rsock_unixpath_str(
struct sockaddr_un *sockaddr, socklen_t len);
242 VALUE rsock_unixaddr(
struct sockaddr_un *sockaddr, socklen_t len);
243 socklen_t rsock_unix_sockaddr_len(
VALUE path);
273 int rsock_connect(
int fd,
const struct sockaddr *sockaddr,
int len,
int socks);
281 #if defined(HAVE_SENDMSG)
285 #define rsock_bsock_sendmsg rb_f_notimplement
286 #define rsock_bsock_sendmsg_nonblock rb_f_notimplement
288 #if defined(HAVE_RECVMSG)
291 ssize_t rsock_recvmsg(
int socket,
struct msghdr *message,
int flags);
293 #define rsock_bsock_recvmsg rb_f_notimplement
294 #define rsock_bsock_recvmsg_nonblock rb_f_notimplement
297 #ifdef HAVE_ST_MSG_CONTROL
298 void rsock_discard_cmsg_resource(
struct msghdr *mh,
int msg_peek_p);
int rsock_optname_arg(int family, int level, VALUE optname)
VALUE rsock_init_unixsock(VALUE sock, VALUE path, int server)
VALUE rsock_init_inetsock(VALUE sock, VALUE remote_host, VALUE remote_serv, VALUE local_host, VALUE local_serv, int type)
int rsock_shutdown_how_arg(VALUE how)
void rsock_init_basicsocket(void)
int rsock_do_not_reverse_lookup
int rsock_level_arg(int family, VALUE level)
VALUE rsock_sock_listen(VALUE sock, VALUE log)
VALUE rsock_bsock_send(int argc, VALUE *argv, VALUE sock)
VALUE rsock_send_blocking(void *data)
int rb_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res)
VALUE rsock_io_socket_addrinfo(VALUE io, struct sockaddr *addr, socklen_t len)
void rsock_init_unixsocket(void)
void rsock_init_socket_init(void)
void rsock_init_tcpserver(void)
#define rsock_bsock_sendmsg
char __ss_pad2[_SS_PAD2SIZE]
VALUE rsock_ipaddr(struct sockaddr *sockaddr, int norevlookup)
void rsock_init_socket_constants(void)
VALUE rsock_sockaddr_string_value(volatile VALUE *)
VALUE rsock_sock_s_socketpair(int argc, VALUE *argv, VALUE klass)
void rsock_init_tcpsocket(void)
struct addrinfo * rsock_addrinfo(VALUE host, VALUE port, int socktype, int flags)
#define rsock_bsock_sendmsg_nonblock
VALUE rsock_addrinfo_new(struct sockaddr *addr, socklen_t len, int family, int socktype, int protocol, VALUE canonname, VALUE inspectname)
void rsock_init_sockssocket(void)
void rsock_init_sockopt(void)
#define rsock_bsock_recvmsg_nonblock
VALUE rsock_s_recvfrom(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from)
struct addrinfo * rsock_getaddrinfo(VALUE host, VALUE port, struct addrinfo *hints, int socktype_hack)
VALUE rb_check_sockaddr_string_type(VALUE)
VALUE rsock_sockopt_new(int family, int level, int optname, VALUE data)
NORETURN(void rsock_raise_socket_error(const char *, int))
VALUE rsock_init_sock(VALUE sock, int fd)
void rsock_init_udpsocket(void)
void rsock_init_ipsocket(void)
int rsock_socket(int domain, int type, int proto)
int rsock_revlookup_flag(VALUE revlookup, int *norevlookup)
int rsock_connect(int fd, const struct sockaddr *sockaddr, int len, int socks)
VALUE rsock_make_hostent(VALUE host, struct addrinfo *addr, VALUE(*ipaddr)(struct sockaddr *, size_t))
int rb_getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags)
VALUE rsock_s_recvfrom_nonblock(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from)
int rsock_socktype_arg(VALUE type)
int rsock_getfamily(int sockfd)
void rsock_raise_socket_error(const char *reason, int error)
void rsock_init_ancdata(void)
char __ss_pad1[_SS_PAD1SIZE]
VALUE rsock_s_accept(VALUE klass, int fd, struct sockaddr *sockaddr, socklen_t *len)
void rsock_init_unixserver(void)
VALUE rsock_s_accept_nonblock(VALUE klass, rb_io_t *fptr, struct sockaddr *sockaddr, socklen_t *len)
int rsock_family_arg(VALUE domain)
VALUE rsock_make_ipaddr(struct sockaddr *addr)
char * rsock_sockaddr_string_value_ptr(volatile VALUE *)
#define rsock_bsock_recvmsg
void rsock_init_addrinfo(void)
VALUE rsock_sendto_blocking(void *data)
int rsock_cmsg_type_arg(int family, int level, VALUE type)
VALUE rsock_fd_socket_addrinfo(int fd, struct sockaddr *addr, socklen_t len)