Ruby  1.9.3p551(2014-11-13revision48407)
rubysocket.h
Go to the documentation of this file.
1 #ifndef RUBY_SOCKET_H
2 #define RUBY_SOCKET_H 1
3 
4 #include "ruby/ruby.h"
5 #include "ruby/io.h"
6 #include "ruby/util.h"
7 #include "internal.h"
8 #include <stdio.h>
9 #include <sys/types.h>
10 #include <sys/stat.h>
11 
12 #ifdef HAVE_UNISTD_H
13 #include <unistd.h>
14 #endif
15 
16 #ifdef HAVE_SYS_UIO_H
17 #include <sys/uio.h>
18 #endif
19 
20 #ifdef HAVE_XTI_H
21 #include <xti.h>
22 #endif
23 
24 #ifndef _WIN32
25 #if defined(__BEOS__) && !defined(__HAIKU__) && !defined(BONE)
26 # include <net/socket.h>
27 #else
28 # include <sys/socket.h>
29 #endif
30 #include <netinet/in.h>
31 #ifdef HAVE_NETINET_IN_SYSTM_H
32 # include <netinet/in_systm.h>
33 #endif
34 #ifdef HAVE_NETINET_TCP_H
35 # include <netinet/tcp.h>
36 #endif
37 #ifdef HAVE_NETINET_UDP_H
38 # include <netinet/udp.h>
39 #endif
40 #ifdef HAVE_ARPA_INET_H
41 # include <arpa/inet.h>
42 #endif
43 #include <netdb.h>
44 #endif
45 #include <errno.h>
46 #ifdef HAVE_SYS_UN_H
47 #include <sys/un.h>
48 #endif
49 
50 #if defined(HAVE_FCNTL)
51 #ifdef HAVE_SYS_SELECT_H
52 #include <sys/select.h>
53 #endif
54 #ifdef HAVE_SYS_TYPES_H
55 #include <sys/types.h>
56 #endif
57 #ifdef HAVE_SYS_TIME_H
58 #include <sys/time.h>
59 #endif
60 #ifdef HAVE_FCNTL_H
61 #include <fcntl.h>
62 #endif
63 #endif
64 
65 #ifdef HAVE_IFADDRS_H
66 #include <ifaddrs.h>
67 #endif
68 #ifdef HAVE_SYS_IOCTL_H
69 #include <sys/ioctl.h>
70 #endif
71 #ifdef HAVE_SYS_SOCKIO_H
72 #include <sys/sockio.h>
73 #endif
74 #ifdef HAVE_NET_IF_H
75 #include <net/if.h>
76 #endif
77 
78 #ifdef HAVE_SYS_PARAM_H
79 #include <sys/param.h>
80 #endif
81 #ifdef HAVE_SYS_UCRED_H
82 #include <sys/ucred.h>
83 #endif
84 #ifdef HAVE_UCRED_H
85 #include <ucred.h>
86 #endif
87 
88 #ifndef EWOULDBLOCK
89 #define EWOULDBLOCK EAGAIN
90 #endif
91 
92 /*
93  * workaround for NetBSD, OpenBSD and etc.
94  * The problem is since 4.4BSD-Lite.
95  * FreeBSD fix the problem at FreeBSD 2.2.0.
96  * NetBSD fix the problem at NetBSD 3.0 by kern/29624.
97  * OpenBSD fix the problem at OpenBSD 3.8.
98  */
99 #define pseudo_AF_FTIP pseudo_AF_RTIP
100 
101 #ifndef HAVE_GETADDRINFO
102 #include "addrinfo.h"
103 #endif
104 #include "sockport.h"
105 
106 #ifndef NI_MAXHOST
107 # define NI_MAXHOST 1025
108 #endif
109 #ifndef NI_MAXSERV
110 # define NI_MAXSERV 32
111 #endif
112 
113 #ifdef AF_INET6
114 # define IS_IP_FAMILY(af) ((af) == AF_INET || (af) == AF_INET6)
115 #else
116 # define IS_IP_FAMILY(af) ((af) == AF_INET)
117 #endif
118 
119 #ifndef HAVE_SOCKADDR_STORAGE
120 /*
121  * RFC 2553: protocol-independent placeholder for socket addresses
122  */
123 #define _SS_MAXSIZE 128
124 #define _SS_ALIGNSIZE (sizeof(double))
125 #define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof(unsigned char) * 2)
126 #define _SS_PAD2SIZE (_SS_MAXSIZE - sizeof(unsigned char) * 2 - \
127  _SS_PAD1SIZE - _SS_ALIGNSIZE)
128 
130 #ifdef HAVE_SA_LEN
131  unsigned char ss_len; /* address length */
132  unsigned char ss_family; /* address family */
133 #else
134  unsigned short ss_family;
135 #endif
137  double __ss_align; /* force desired structure storage alignment */
139 };
140 #endif
141 
142 #if defined __APPLE__ && defined __MACH__
143 /*
144  * CMSG_ macros are broken on 64bit darwin, because __DARWIN_ALIGN
145  * aligns up to __darwin_size_t which is 64bit, but CMSG_DATA is
146  * 32bit-aligned.
147  */
148 #undef __DARWIN_ALIGNBYTES
149 #define __DARWIN_ALIGNBYTES (sizeof(unsigned int) - 1)
150 #endif
151 
152 #if defined(_AIX)
153 #ifndef CMSG_SPACE
154 # define CMSG_SPACE(len) (_CMSG_ALIGN(sizeof(struct cmsghdr)) + _CMSG_ALIGN(len))
155 #endif
156 #ifndef CMSG_LEN
157 # define CMSG_LEN(len) (_CMSG_ALIGN(sizeof(struct cmsghdr)) + (len))
158 #endif
159 #endif
160 
161 #ifdef __BEOS__
162 #undef close
163 #define close closesocket
164 #endif
165 
166 #define INET_CLIENT 0
167 #define INET_SERVER 1
168 #define INET_SOCKS 2
169 
170 extern int rsock_do_not_reverse_lookup;
171 #define FMODE_NOREVLOOKUP 0x100
172 
173 extern VALUE rb_cBasicSocket;
174 extern VALUE rb_cIPSocket;
175 extern VALUE rb_cTCPSocket;
176 extern VALUE rb_cTCPServer;
177 extern VALUE rb_cUDPSocket;
178 #ifdef HAVE_SYS_UN_H
179 extern VALUE rb_cUNIXSocket;
180 extern VALUE rb_cUNIXServer;
181 #endif
182 extern VALUE rb_cSocket;
183 extern VALUE rb_cAddrinfo;
184 extern VALUE rb_cSockOpt;
185 
186 extern VALUE rb_eSocket;
187 
188 #ifdef SOCKS
189 extern VALUE rb_cSOCKSSocket;
190 #ifdef SOCKS5
191 #include <socks.h>
192 #else
193 void SOCKSinit();
194 int Rconnect();
195 #endif
196 #endif
197 
198 #include "constdefs.h"
199 
200 #define BLOCKING_REGION(func, arg) (long)rb_thread_blocking_region((func), (arg), RUBY_UBF_IO, 0)
201 #define BLOCKING_REGION_FD(func, arg) (long)rb_thread_io_blocking_region((func), (arg), (arg)->fd)
202 
203 #define SockAddrStringValue(v) rsock_sockaddr_string_value(&(v))
204 #define SockAddrStringValuePtr(v) rsock_sockaddr_string_value_ptr(&(v))
206 char *rsock_sockaddr_string_value_ptr(volatile VALUE *);
208 
209 NORETURN(void rsock_raise_socket_error(const char *, int));
210 
211 int rsock_family_arg(VALUE domain);
213 int rsock_level_arg(int family, VALUE level);
214 int rsock_optname_arg(int family, int level, VALUE optname);
215 int rsock_cmsg_type_arg(int family, int level, VALUE type);
217 
218 int rsock_getfamily(int sockfd);
219 
220 int rb_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);
221 int rb_getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags);
222 struct addrinfo *rsock_addrinfo(VALUE host, VALUE port, int socktype, int flags);
223 struct addrinfo *rsock_getaddrinfo(VALUE host, VALUE port, struct addrinfo *hints, int socktype_hack);
224 VALUE rsock_fd_socket_addrinfo(int fd, struct sockaddr *addr, socklen_t len);
225 VALUE rsock_io_socket_addrinfo(VALUE io, struct sockaddr *addr, socklen_t len);
226 
227 VALUE rsock_addrinfo_new(struct sockaddr *addr, socklen_t len, int family, int socktype, int protocol, VALUE canonname, VALUE inspectname);
228 
229 VALUE rsock_make_ipaddr(struct sockaddr *addr);
230 VALUE rsock_ipaddr(struct sockaddr *sockaddr, int norevlookup);
231 VALUE rsock_make_hostent(VALUE host, struct addrinfo *addr, VALUE (*ipaddr)(struct sockaddr *, size_t));
232 
233 int rsock_revlookup_flag(VALUE revlookup, int *norevlookup);
234 
235 #ifdef HAVE_SYS_UN_H
236 VALUE rsock_unixpath_str(struct sockaddr_un *sockaddr, socklen_t len);
237 VALUE rsock_unixaddr(struct sockaddr_un *sockaddr, socklen_t len);
238 socklen_t rsock_unix_sockaddr_len(VALUE path);
239 #endif
240 
241 int rsock_socket(int domain, int type, int proto);
242 VALUE rsock_init_sock(VALUE sock, int fd);
244 VALUE rsock_init_inetsock(VALUE sock, VALUE remote_host, VALUE remote_serv, VALUE local_host, VALUE local_serv, int type);
245 VALUE rsock_init_unixsock(VALUE sock, VALUE path, int server);
246 
248  int fd, flags;
250  struct sockaddr *to;
251  socklen_t tolen;
252 };
253 
257 
259  RECV_RECV, /* BasicSocket#recv(no from) */
260  RECV_IP, /* IPSocket#recvfrom */
261  RECV_UNIX, /* UNIXSocket#recvfrom */
262  RECV_SOCKET /* Socket#recvfrom */
263 };
264 
266 VALUE rsock_s_recvfrom(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from);
267 
268 int rsock_connect(int fd, const struct sockaddr *sockaddr, int len, int socks);
269 
270 VALUE rsock_s_accept(VALUE klass, int fd, struct sockaddr *sockaddr, socklen_t *len);
271 VALUE rsock_s_accept_nonblock(VALUE klass, rb_io_t *fptr, struct sockaddr *sockaddr, socklen_t *len);
273 
274 VALUE rsock_sockopt_new(int family, int level, int optname, VALUE data);
275 
276 #if defined(HAVE_SENDMSG)
279 #else
280 #define rsock_bsock_sendmsg rb_f_notimplement
281 #define rsock_bsock_sendmsg_nonblock rb_f_notimplement
282 #endif
283 #if defined(HAVE_RECVMSG)
286 #else
287 #define rsock_bsock_recvmsg rb_f_notimplement
288 #define rsock_bsock_recvmsg_nonblock rb_f_notimplement
289 #endif
290 
291 #ifdef HAVE_ST_MSG_CONTROL
292 void rsock_discard_cmsg_resource(struct msghdr *mh, int msg_peek_p);
293 #endif
294 
295 void rsock_init_basicsocket(void);
296 void rsock_init_ipsocket(void);
297 void rsock_init_tcpsocket(void);
298 void rsock_init_tcpserver(void);
299 void rsock_init_sockssocket(void);
300 void rsock_init_udpsocket(void);
301 void rsock_init_unixsocket(void);
302 void rsock_init_unixserver(void);
303 void rsock_init_socket_constants(void);
304 void rsock_init_ancdata(void);
305 void rsock_init_addrinfo(void);
306 void rsock_init_sockopt(void);
307 void rsock_init_socket_init(void);
308 
309 #endif
VALUE rsock_init_unixsock(VALUE sock, VALUE path, int server)
struct addrinfo * rsock_addrinfo(VALUE host, VALUE port, int socktype, int flags)
Definition: raddrinfo.c:379
socklen_t tolen
Definition: rubysocket.h:251
VALUE rsock_sendto_blocking(void *data)
Definition: init.c:72
VALUE rb_cBasicSocket
Definition: init.c:13
VALUE rsock_sock_listen(VALUE sock, VALUE log)
Definition: socket.c:498
Definition: io.h:53
int rsock_socktype_arg(VALUE type)
Definition: constants.c:50
Definition: win32.h:223
VALUE rsock_ipaddr(struct sockaddr *sockaddr, int norevlookup)
Definition: raddrinfo.c:391
unsigned long VALUE
Definition: ruby.h:88
VALUE rsock_init_sock(VALUE sock, int fd)
Definition: init.c:43
gz path
Definition: zlib.c:2040
void rsock_init_unixsocket(void)
Definition: unixsocket.c:504
void rsock_init_tcpserver(void)
Definition: tcpserver.c:132
VALUE rb_cIPSocket
Definition: init.c:14
struct sockaddr * to
Definition: rubysocket.h:250
VALUE rsock_s_accept(VALUE klass, int fd, struct sockaddr *sockaddr, socklen_t *len)
Definition: init.c:499
sock_recv_type
Definition: rubysocket.h:258
#define rsock_bsock_sendmsg
Definition: rubysocket.h:280
char __ss_pad2[_SS_PAD2SIZE]
Definition: rubysocket.h:138
VALUE rb_check_sockaddr_string_type(VALUE val)
Definition: raddrinfo.c:2131
void rsock_init_socket_constants(void)
Definition: constants.c:141
int rsock_getfamily(int sockfd)
Definition: init.c:533
void rsock_init_addrinfo(void)
Definition: raddrinfo.c:2182
VALUE rb_cTCPSocket
Definition: init.c:15
VALUE rsock_make_ipaddr(struct sockaddr *addr)
Definition: raddrinfo.c:251
VALUE rsock_io_socket_addrinfo(VALUE io, struct sockaddr *addr, socklen_t len)
Definition: raddrinfo.c:2158
VALUE rsock_bsock_send(int argc, VALUE *argv, VALUE sock)
Definition: basicsocket.c:544
#define NORETURN(x)
Definition: ruby.h:31
VALUE rsock_make_hostent(VALUE host, struct addrinfo *addr, VALUE(*ipaddr)(struct sockaddr *, size_t))
Definition: raddrinfo.c:532
VALUE rsock_addrinfo_new(struct sockaddr *addr, socklen_t len, int family, int socktype, int protocol, VALUE canonname, VALUE inspectname)
Definition: raddrinfo.c:629
void * data
Definition: yaml2byte.c:131
VALUE rsock_sock_s_socketpair(int argc, VALUE *argv, VALUE klass)
void rsock_init_tcpsocket(void)
Definition: tcpsocket.c:59
int rsock_family_arg(VALUE domain)
Definition: constants.c:43
VALUE rsock_sockopt_new(int family, int level, int optname, VALUE data)
Definition: option.c:62
#define rsock_bsock_sendmsg_nonblock
Definition: rubysocket.h:281
void rsock_init_sockssocket(void)
Definition: sockssocket.c:55
VALUE rsock_send_blocking(void *data)
Definition: init.c:81
int flags
Definition: tcltklib.c:3012
int rsock_socket(int domain, int type, int proto)
Definition: init.c:243
int rsock_level_arg(int family, VALUE level)
Definition: constants.c:57
#define _SS_PAD2SIZE
Definition: rubysocket.h:126
void rsock_init_ancdata(void)
Definition: ancdata.c:1776
#define rsock_bsock_recvmsg_nonblock
Definition: rubysocket.h:288
void rsock_init_socket_init()
Definition: init.c:546
unsigned short ss_family
Definition: rubysocket.h:134
VALUE rb_cSocket
Definition: init.c:22
gz level
Definition: zlib.c:2025
VALUE * argv
Definition: tcltklib.c:1962
char * rsock_sockaddr_string_value_ptr(volatile VALUE *v)
Definition: raddrinfo.c:2124
VALUE rsock_s_recvfrom(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from)
Definition: init.c:105
VALUE rsock_fd_socket_addrinfo(int fd, struct sockaddr *addr, socklen_t len)
Definition: raddrinfo.c:2139
void rsock_init_udpsocket(void)
Definition: udpsocket.c:250
void rsock_init_basicsocket(void)
Definition: basicsocket.c:744
VALUE rb_cTCPServer
Definition: init.c:16
int rsock_do_not_reverse_lookup
Definition: init.c:31
int type
Definition: tcltklib.c:107
int argc
Definition: tcltklib.c:1961
register unsigned int len
Definition: name2ctype.h:22210
int rb_getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags)
Definition: raddrinfo.c:218
VALUE rb_eSocket
Definition: init.c:25
int rsock_revlookup_flag(VALUE revlookup, int *norevlookup)
Definition: ipsocket.c:140
#define proto(p)
Definition: sdbm.h:60
void rsock_raise_socket_error(const char *reason, int error)
Definition: init.c:34
int rsock_connect(int fd, const struct sockaddr *sockaddr, int len, int socks)
Definition: init.c:344
VALUE rb_cAddrinfo
Definition: init.c:23
struct addrinfo * rsock_getaddrinfo(VALUE host, VALUE port, struct addrinfo *hints, int socktype_hack)
Definition: raddrinfo.c:351
klass
Definition: tcltklib.c:3493
char __ss_pad1[_SS_PAD1SIZE]
Definition: rubysocket.h:136
int rsock_optname_arg(int family, int level, VALUE optname)
Definition: constants.c:69
#define _SS_PAD1SIZE
Definition: rubysocket.h:125
gz io
Definition: zlib.c:2024
VALUE rsock_s_accept_nonblock(VALUE klass, rb_io_t *fptr, struct sockaddr *sockaddr, socklen_t *len)
Definition: init.c:452
VALUE rsock_init_inetsock(VALUE sock, VALUE remote_host, VALUE remote_serv, VALUE local_host, VALUE local_serv, int type)
Definition: ipsocket.c:120
VALUE rb_cSockOpt
Definition: option.c:3
void rsock_init_ipsocket(void)
Definition: ipsocket.c:292
Real * res
Definition: bigdecimal.c:1189
void rsock_init_unixserver(void)
Definition: unixserver.c:139
void rsock_init_sockopt(void)
Definition: option.c:892
#define rsock_bsock_recvmsg
Definition: rubysocket.h:287
int rsock_shutdown_how_arg(VALUE how)
Definition: constants.c:131
VALUE rsock_s_recvfrom_nonblock(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from)
Definition: init.c:173
int rb_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res)
Definition: raddrinfo.c:175
int rsock_cmsg_type_arg(int family, int level, VALUE type)
Definition: constants.c:100
VALUE rsock_sockaddr_string_value(volatile VALUE *v)
Definition: raddrinfo.c:2113
VALUE rb_cUDPSocket
Definition: init.c:17