VALUE rsock_init_sock(VALUE sock, int fd) { rb_io_t *fp; #ifndef _WIN32 struct stat sbuf; if (fstat(fd, &sbuf) < 0) rb_sys_fail("fstat(2)"); rb_update_max_fd(fd); if (!S_ISSOCK(sbuf.st_mode)) rb_raise(rb_eArgError, "not a socket file descriptor"); #else rb_update_max_fd(fd); if (!rb_w32_is_socket(fd)) rb_raise(rb_eArgError, "not a socket file descriptor"); #endif MakeOpenFile(sock, fp); fp->fd = fd; fp->mode = FMODE_READWRITE|FMODE_DUPLEX; rb_io_ascii8bit_binmode(sock); if (rsock_do_not_reverse_lookup) { fp->mode |= FMODE_NOREVLOOKUP; } rb_io_synchronized(fp); return sock; }
size_t rb_w32_write(int fd, const void *buf, size_t size) { if (rb_w32_is_socket(fd)) return rb_w32_send(fd, buf, size, 0); return _write(fd,buf,size); }
size_t rb_w32_read(int fd, void *buf, size_t size) { if (rb_w32_is_socket(fd)) return rb_w32_recv(fd, buf, size, 0); return _read(fd,buf,size); }