28 VALUE rb_cSOCKSSocket;
49 if (
fstat(fd, &sbuf) < 0)
52 if (!S_ISSOCK(sbuf.st_mode))
126 arg.
alen = (socklen_t)
sizeof(arg.
buf);
129 klass =
RBASIC(str)->klass;
143 RBASIC(str)->klass = klass;
153 if (arg.
alen !=
sizeof(
struct sockaddr_in)) {
169 rb_bug(
"rsock_s_recvfrom called with bad value");
179 socklen_t alen = (socklen_t)
sizeof buf;
188 if (flg ==
Qnil) flags = 0;
195 flags |= MSG_DONTWAIT;
208 slen = recvfrom(fd,
RSTRING_PTR(str), buflen, flags, (
struct sockaddr*)&buf, &alen);
213 #if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
229 if (alen && alen !=
sizeof(buf))
238 rb_bug(
"rsock_s_recvfrom_nonblock called with bad value");
249 static int try_sock_cloexec = 1;
250 if (try_sock_cloexec) {
251 ret = socket(domain, type|SOCK_CLOEXEC, proto);
252 if (ret == -1 &&
errno == EINVAL) {
254 ret = socket(domain, type, proto);
256 try_sock_cloexec = 0;
261 ret = socket(domain, type, proto);
264 ret = socket(domain, type, proto);
296 socklen_t sockerrlen;
308 sockerrlen = (socklen_t)
sizeof(sockerr);
309 ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, (
void *)&sockerr, &sockerrlen);
340 #define WAIT_IN_PROGRESS 10
343 #define WAIT_IN_PROGRESS 10
347 #define WAIT_IN_PROGRESS 0
349 #ifndef WAIT_IN_PROGRESS
351 #define WAIT_IN_PROGRESS 1
367 #if defined(SOCKS) && !defined(SOCKS5)
369 socks_connect_blocking(
void *data)
382 #if WAIT_IN_PROGRESS > 0
383 int wait_in_progress = -1;
385 socklen_t sockerrlen;
391 #if defined(SOCKS) && !defined(SOCKS5)
392 if (socks) func = socks_connect_blocking;
399 #if defined(ERESTART)
408 #if WAIT_IN_PROGRESS > 0
409 sockerrlen = (socklen_t)
sizeof(sockerr);
410 status = getsockopt(fd, SOL_SOCKET, SO_ERROR, (
void *)&sockerr, &sockerrlen);
421 #if WAIT_IN_PROGRESS > 0
431 #if WAIT_IN_PROGRESS > 0
433 if (wait_in_progress-- > 0) {
439 sockerrlen = (socklen_t)
sizeof(sockerr);
440 status = getsockopt(fd, SOL_SOCKET, SO_ERROR, (
void *)&sockerr, &sockerrlen);
441 if (!status && !sockerr) {
442 struct timeval tv = {0, 100000};
471 flags =
fcntl(fd, F_GETFL);
490 static int try_accept4 = 1;
492 if (address_len) len0 = *address_len;
497 flags |= SOCK_CLOEXEC;
499 ret = accept4(socket, address, address_len, flags);
504 if (address_len && len0 < *address_len) *address_len = len0;
507 if (
errno != ENOSYS) {
513 ret = accept(socket, address, address_len);
514 if (ret == -1)
return -1;
515 if (address_len && len0 < *address_len) *address_len = len0;
532 #if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
591 if (!klass)
return INT2NUM(fd2);
599 socklen_t sslen = (socklen_t)
sizeof(ss);
602 if (getsockname(sockfd, (
struct sockaddr*)&ss, &sslen) < 0)
struct sockaddr * sockaddr
void rb_bug(const char *fmt,...)
VALUE rsock_sendto_blocking(void *data)
void rb_update_max_fd(int fd)
void rb_io_set_nonblock(rb_io_t *fptr)
void rb_io_synchronized(rb_io_t *)
VALUE rsock_init_sock(VALUE sock, int fd)
void rsock_init_unixsocket(void)
void rb_str_set_len(VALUE, long)
void rsock_init_tcpserver(void)
void rb_raise(VALUE exc, const char *fmt,...)
VALUE rsock_s_accept(VALUE klass, int fd, struct sockaddr *sockaddr, socklen_t *len)
#define FMODE_NOREVLOOKUP
void rsock_init_socket_constants(void)
static void make_fd_nonblock(int fd)
VALUE rsock_ipaddr(struct sockaddr *sockaddr, socklen_t sockaddrlen, int norevlookup)
int rsock_getfamily(int sockfd)
#define GetOpenFile(obj, fp)
void rsock_init_addrinfo(void)
VALUE rsock_io_socket_addrinfo(VALUE io, struct sockaddr *addr, socklen_t len)
int rb_w32_is_socket(int)
RUBY_EXTERN VALUE rb_mWaitReadable
void rsock_init_tcpsocket(void)
VALUE rb_obj_taint(VALUE)
void rsock_init_sockssocket(void)
VALUE rsock_send_blocking(void *data)
int rsock_socket(int domain, int type, int proto)
VALUE rb_define_class(const char *name, VALUE super)
Defines a top-level class.
void rsock_init_ancdata(void)
static int wait_connectable(int fd)
VALUE rb_obj_alloc(VALUE)
void rsock_init_socket_init()
char * gai_strerror(int ecode)
SSL_METHOD *(* func)(void)
VALUE rsock_s_recvfrom(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from)
static int rsock_socket0(int domain, int type, int proto)
static int cloexec_accept(int socket, struct sockaddr *address, socklen_t *address_len)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
VALUE rb_assoc_new(VALUE car, VALUE cdr)
void rb_thread_wait_fd(int)
void rsock_init_udpsocket(void)
int rsock_do_not_reverse_lookup
int rb_wait_for_single_fd(int fd, int events, struct timeval *tv)
VALUE rb_blocking_function_t(void *)
void rb_sys_fail(const char *mesg)
const struct sockaddr * sockaddr
void rb_thread_wait_for(struct timeval)
int rb_io_read_pending(rb_io_t *)
struct sockaddr_storage buf
void rb_mod_sys_fail(VALUE mod, const char *mesg)
void rb_fd_fix_cloexec(int fd)
void rsock_raise_socket_error(const char *reason, int error)
VALUE rb_io_ascii8bit_binmode(VALUE)
int rsock_connect(int fd, const struct sockaddr *sockaddr, int len, int socks)
static VALUE connect_blocking(void *data)
VALUE rsock_s_accept_nonblock(VALUE klass, rb_io_t *fptr, struct sockaddr *sockaddr, socklen_t *len)
static VALUE accept_blocking(void *data)
void rsock_init_ipsocket(void)
void rsock_init_unixserver(void)
RUBY_EXTERN VALUE rb_eIOError
#define MakeOpenFile(obj, fp)
static VALUE recvfrom_blocking(void *data)
void rsock_init_sockopt(void)
VALUE rb_tainted_str_new(const char *, long)
VALUE rsock_s_recvfrom_nonblock(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from)
int rb_io_wait_readable(int)
void rb_io_check_closed(rb_io_t *)
#define BLOCKING_REGION_FD(func, arg)
void rb_maygvl_fd_fix_cloexec(int fd)