36static VALUE sym_wait_readable;
58#define is_socket(fd) rb_w32_is_socket(fd)
65 if (
fstat(fd, &sbuf) < 0)
67 return S_ISSOCK(sbuf.st_mode);
72# define do_write_retry(code) do {ret = code;} while (ret == -1 && errno == EPROTOTYPE)
74# define do_write_retry(code) ret = code
130recvfrom_blocking(
void *data)
137 if (ret != -1 && len0 < arg->
alen)
161recvfrom_locktmp(
VALUE v)
183 str = rsock_strbuf(
str, buflen);
210 if (arg.
alen !=
sizeof(
struct sockaddr_in)) {
226 rb_bug(
"rsock_s_recvfrom called with bad value");
245 str = rsock_strbuf(
str, buflen);
250 flags |= MSG_DONTWAIT;
266 if (slen != -1 && len0 <
alen)
273#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
277 return sym_wait_readable;
299 rb_bug(
"rsock_s_recvfrom_nonblock called with bad value");
304#if MSG_DONTWAIT_RELIABLE
305static VALUE sym_wait_writable;
311 int n = fptr->
rbuf.len;
313 if (n <= 0)
return 0;
339 n = read_buffered_data(
ptr,
len, fptr);
345 if (ex ==
Qfalse)
return sym_wait_readable;
347 e,
"read would block");
383 if (fptr->
wbuf.len > 0) {
400 if (ex ==
Qfalse)
return sym_wait_writable;
402 "write would block");
412rsock_socket0(
int domain,
int type,
int proto)
415 type |= SOCK_CLOEXEC;
419 type |= SOCK_NONBLOCK;
422 int result = socket(domain,
type, proto);
441 fd = rsock_socket0(domain,
type, proto);
444 fd = rsock_socket0(domain,
type, proto);
454wait_connectable(
int fd,
struct timeval *timeout)
456 int sockerr, revents;
460 if (getsockopt(
fd, SOL_SOCKET, SO_ERROR, (
void *)&sockerr, &sockerrlen) < 0)
497 if (getsockopt(
fd, SOL_SOCKET, SO_ERROR, (
void *)&sockerr, &sockerrlen) < 0)
508 if (timeout && revents == 0) {
543connect_blocking(
void *data)
549#if defined(SOCKS) && !defined(SOCKS5)
551socks_connect_blocking(
void *data)
568#if defined(SOCKS) && !defined(SOCKS5)
569 if (socks) func = socks_connect_blocking;
583 return wait_connectable(
fd, timeout);
615 if (address_len) len0 = *address_len;
618 int flags = SOCK_CLOEXEC;
621 flags |= SOCK_NONBLOCK;
624 int result = accept4(socket, address, address_len, flags);
625 if (result == -1)
return -1;
631 int result = accept(socket, address, address_len);
632 if (result == -1)
return -1;
638 if (address_len && len0 < *address_len) *address_len = len0;
654#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
662 return sym_wait_readable;
678accept_blocking(
void *data)
715 if (!klass)
return INT2NUM(fd2);
737 if (getsockname(fptr->
fd, &ss.
addr, &sslen) < 0)
740 switch (ss.
addr.sa_family) {
748 return ss.
addr.sa_family;
774#if MSG_DONTWAIT_RELIABLE
void rsock_init_ancdata(void)
VALUE rb_assoc_new(VALUE car, VALUE cdr)
void rsock_init_socket_constants(void)
rb_encoding * rb_default_internal_encoding(void)
char str[HTML_ESCAPE_MAX_LEN+1]
#define RSTRING_LEN(string)
#define RSTRING_PTR(string)
char * gai_strerror(int ecode)
VALUE rb_define_class(const char *name, VALUE super)
Defines a top-level class.
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
void rb_syserr_fail(int e, const char *mesg)
void rb_raise(VALUE exc, const char *fmt,...)
void rb_exc_raise(VALUE mesg)
Raises an exception in the current thread.
void rb_bug(const char *fmt,...)
VALUE rb_exc_new_str(VALUE etype, VALUE str)
void rb_sys_fail(const char *mesg)
VALUE rb_obj_alloc(VALUE)
Allocates an instance of klass.
void rsock_init_sockifaddr(void)
void rb_readwrite_syserr_fail(enum rb_io_wait_readwrite, int, const char *)
#define RB_IO_WAIT_WRITABLE
#define RB_IO_WAIT_READABLE
VALUE rb_io_ascii8bit_binmode(VALUE)
void rb_update_max_fd(int fd)
int rb_reserved_fd_p(int fd)
void rb_fd_fix_cloexec(int fd)
VALUE rb_str_concat(VALUE, VALUE)
#define rb_str_new(str, len)
void rb_str_set_len(VALUE, long)
void rb_str_modify(VALUE)
void rb_str_modify_expand(VALUE, long)
VALUE rb_obj_as_string(VALUE)
VALUE rb_blocking_function_t(void *)
ID rb_intern(const char *)
int rb_wait_for_single_fd(int fd, int events, struct timeval *tv)
void rb_io_check_closed(rb_io_t *)
void rb_io_check_writable(rb_io_t *)
int rb_io_read_pending(rb_io_t *)
VALUE rb_io_get_write_io(VALUE io)
void rb_io_set_nonblock(rb_io_t *fptr)
void rb_io_synchronized(rb_io_t *)
int rb_io_wait_readable(int fd)
void rsock_raise_socket_error(const char *reason, int error)
void rsock_make_fd_nonblock(int fd)
VALUE rsock_sendto_blocking(void *data)
#define do_write_retry(code)
VALUE rsock_s_recvfrom_nonblock(VALUE sock, VALUE len, VALUE flg, VALUE str, VALUE ex, enum sock_recv_type from)
int rsock_getfamily(rb_io_t *fptr)
VALUE rsock_s_accept_nonblock(VALUE klass, VALUE ex, rb_io_t *fptr, struct sockaddr *sockaddr, socklen_t *len)
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_init_sock(VALUE sock, int fd)
int rsock_do_not_reverse_lookup
VALUE rsock_s_recvfrom(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from)
VALUE rsock_send_blocking(void *data)
void rsock_init_socket_init(void)
int rsock_connect(int fd, const struct sockaddr *sockaddr, int len, int socks, struct timeval *timeout)
#define rb_syserr_fail_path(err, path)
void rb_maygvl_fd_fix_cloexec(int fd)
int rb_gc_for_fd(int err)
VALUE rb_str_locktmp_ensure(VALUE str, VALUE(*func)(VALUE), VALUE arg)
VALUE rb_thread_io_blocking_region(rb_blocking_function_t *func, void *data1, int fd)
#define is_socket(fd, path)
typedef long(ZCALLBACK *tell_file_func) OF((voidpf opaque
typedef int(ZCALLBACK *close_file_func) OF((voidpf opaque
void rsock_init_ipsocket(void)
#define MEMMOVE(p1, p2, type, n)
VALUE type(ANYARGS)
ANYARGS-ed function type.
void rsock_init_sockopt(void)
void rsock_init_addrinfo(void)
VALUE rsock_ipaddr(struct sockaddr *sockaddr, socklen_t sockaddrlen, int norevlookup)
VALUE rsock_io_socket_addrinfo(VALUE io, struct sockaddr *addr, socklen_t len)
void rsock_init_udpsocket(void)
void rsock_init_tcpserver(void)
void rsock_init_sockssocket(void)
VALUE rsock_write_nonblock(VALUE sock, VALUE buf, VALUE ex)
void rsock_init_tcpsocket(void)
#define MSG_DONTWAIT_RELIABLE
void rsock_init_unixsocket(void)
VALUE rsock_read_nonblock(VALUE sock, VALUE length, VALUE buf, VALUE ex)
#define BLOCKING_REGION_FD(func, arg)
#define rsock_maybe_wait_fd(fd)
void rsock_init_unixserver(void)
#define FMODE_NOREVLOOKUP
VALUE rb_sprintf(const char *,...)
struct sockaddr * sockaddr
const struct sockaddr * sockaddr
void error(const char *msg)
VALUE rb_w32_conv_from_wchar(const WCHAR *wstr, rb_encoding *enc)