45 rb_scan_args(argc, argv,
"21", &domain, &type, &protocol);
57 #if defined HAVE_SOCKETPAIR
77 #if defined HAVE_SOCKETPAIR
80 rsock_socketpair0(
int domain,
int type,
int protocol,
int sv[2])
85 static int try_sock_cloexec = 1;
86 if (try_sock_cloexec) {
87 ret = socketpair(domain, type|SOCK_CLOEXEC, protocol, sv);
88 if (ret == -1 &&
errno == EINVAL) {
90 ret = socketpair(domain, type, protocol, sv);
101 ret = socketpair(domain, type, protocol, sv);
104 ret = socketpair(domain, type, protocol, sv);
118 rsock_socketpair(
int domain,
int type,
int protocol,
int sv[2])
122 ret = rsock_socketpair0(domain, type, protocol, sv);
123 if (ret < 0 && (
errno == EMFILE ||
errno == ENFILE)) {
125 ret = rsock_socketpair0(domain, type, protocol, sv);
160 rb_scan_args(argc, argv,
"21", &domain, &type, &protocol);
166 ret = rsock_socketpair(d, t, p, sp);
182 #define rsock_sock_s_socketpair rb_f_notimplement
554 if (listen(fptr->
fd, backlog) < 0)
759 socklen_t
len = (socklen_t)
sizeof buf;
824 socklen_t
len = (socklen_t)
sizeof buf;
875 socklen_t
len = (socklen_t)
sizeof buf;
883 #ifdef HAVE_GETHOSTNAME
898 #ifndef HOST_NAME_MAX
899 # define HOST_NAME_MAX 1024
901 char buf[HOST_NAME_MAX+1];
904 if (gethostname(buf, (
int)
sizeof buf - 1) < 0)
907 buf[
sizeof buf - 1] =
'\0';
913 #include <sys/utsname.h>
925 #define sock_gethostname rb_f_notimplement
957 switch (addr->sa_family) {
959 ptr = (
char*)&((
struct sockaddr_in*)addr)->sin_addr.s_addr;
960 len =
sizeof(((
struct sockaddr_in*)addr)->sin_addr.s_addr);
964 ptr = (
char*)&((
struct sockaddr_in6*)addr)->sin6_addr.s6_addr;
965 len =
sizeof(((
struct sockaddr_in6*)addr)->sin6_addr.s6_addr);
1011 if (!
NIL_P(family)) {
1021 #ifdef HAVE_HSTRERROR
1032 if (h->h_aliases !=
NULL) {
1033 for (pch = h->h_aliases; *pch; pch++) {
1039 for (pch = h->h_addr_list; *pch; pch++) {
1068 const char *servicename, *protoname =
"tcp";
1075 sp = getservbyname(servicename, protoname);
1077 port = ntohs(sp->s_port);
1082 port =
STRTOUL(servicename, &end, 0);
1109 const char *protoname =
"tcp";
1113 if (portnum != (uint16_t)portnum) {
1114 const char *
s = portnum > 0 ?
"big" :
"small";
1119 sp = getservbyport((
int)htons((uint16_t)portnum), protoname);
1161 VALUE host, port, family, socktype, protocol,
flags,
ret, revlookup;
1165 rb_scan_args(argc, argv,
"25", &host, &port, &family, &socktype, &protocol, &flags, &revlookup);
1170 if (!
NIL_P(socktype)) {
1173 if (!
NIL_P(protocol)) {
1176 if (!
NIL_P(flags)) {
1216 char hbuf[1024], pbuf[1024];
1221 struct sockaddr *sap;
1227 if (!
NIL_P(flags)) {
1240 sap = (
struct sockaddr*)&ss;
1264 #ifdef AI_NUMERICHOST
1279 hbuf[
sizeof(hbuf) - 1] =
'\0';
1293 pbuf[
sizeof(pbuf) - 1] =
'\0';
1300 if (error)
goto error_exit_addr;
1309 pbuf,
sizeof(pbuf), fl);
1310 if (error)
goto error_exit_name;
1313 char hbuf2[1024], pbuf2[1024];
1317 pbuf2,
sizeof(pbuf2), fl);
1318 if (error)
goto error_exit_name;
1319 if (strcmp(hbuf, hbuf2) != 0|| strcmp(pbuf, pbuf2) != 0) {
1382 struct sockaddr_in * sockaddr;
1387 (
char*)&((
struct sockaddr *)sockaddr)->sa_family +
1388 sizeof(((
struct sockaddr *)sockaddr)->sa_family) -
1391 if (((
struct sockaddr *)sockaddr)->sa_family != AF_INET
1393 && ((
struct sockaddr *)sockaddr)->sa_family != AF_INET6
1407 #ifdef HAVE_SYS_UN_H
1422 struct sockaddr_un sockaddr;
1426 MEMZERO(&sockaddr,
struct sockaddr_un, 1);
1427 sockaddr.sun_family = AF_UNIX;
1428 if (
sizeof(sockaddr.sun_path) < (
size_t)
RSTRING_LEN(path)) {
1430 (
size_t)
RSTRING_LEN(path),
sizeof(sockaddr.sun_path));
1433 addr =
rb_str_new((
char*)&sockaddr, rsock_unix_sockaddr_len(path));
1452 sock_s_unpack_sockaddr_un(
VALUE self,
VALUE addr)
1454 struct sockaddr_un * sockaddr;
1459 (
char*)&((
struct sockaddr *)sockaddr)->sa_family +
1460 sizeof(((
struct sockaddr *)sockaddr)->sa_family) -
1463 if (((
struct sockaddr *)sockaddr)->sa_family != AF_UNIX) {
1466 if (
sizeof(
struct sockaddr_un) < (
size_t)
RSTRING_LEN(addr)) {
1468 RSTRING_LEN(addr), (
int)
sizeof(
struct sockaddr_un));
1476 #if defined(HAVE_GETIFADDRS) || defined(SIOCGLIFCONF) || defined(SIOCGIFCONF) || defined(_WIN32)
1478 sockaddr_obj(
struct sockaddr *addr)
1481 #if defined(AF_INET6) && defined(__KAME__)
1482 struct sockaddr_in6 addr6;
1488 switch (addr->sa_family) {
1490 len = (socklen_t)
sizeof(
struct sockaddr_in);
1495 len = (socklen_t)
sizeof(
struct sockaddr_in6);
1500 memcpy(&addr6, addr, len);
1501 addr = (
struct sockaddr *)&addr6;
1502 if (IN6_IS_ADDR_LINKLOCAL(&addr6.sin6_addr) &&
1503 addr6.sin6_scope_id == 0 &&
1504 (addr6.sin6_addr.s6_addr[2] || addr6.sin6_addr.s6_addr[3])) {
1505 addr6.sin6_scope_id = (addr6.sin6_addr.s6_addr[2] << 8) | addr6.sin6_addr.s6_addr[3];
1506 addr6.sin6_addr.s6_addr[2] = 0;
1507 addr6.sin6_addr.s6_addr[3] = 0;
1513 #ifdef HAVE_SYS_UN_H
1515 len = (socklen_t)
sizeof(
struct sockaddr_un);
1520 len = (socklen_t)
sizeof(
struct sockaddr_in);
1524 if (len < (socklen_t)
SA_LEN(addr))
1525 len = (socklen_t)
SA_LEN(addr);
1532 #if defined(HAVE_GETIFADDRS) || (defined(SIOCGLIFCONF) && defined(SIOCGLIFNUM) && !defined(__hpux)) || defined(SIOCGIFCONF) || defined(_WIN32)
1551 #if defined(HAVE_GETIFADDRS)
1552 struct ifaddrs *ifp =
NULL;
1557 ret = getifaddrs(&ifp);
1563 for (p = ifp;
p; p = p->ifa_next) {
1572 #elif defined(SIOCGLIFCONF) && defined(SIOCGLIFNUM) && !defined(__hpux)
1579 char *reason =
NULL;
1586 fd = socket(AF_INET, SOCK_DGRAM, 0);
1590 memset(&ln, 0,
sizeof(ln));
1593 ret =
ioctl(fd, SIOCGLIFNUM, &ln);
1595 reason =
"SIOCGLIFNUM";
1599 memset(&lc, 0,
sizeof(lc));
1602 lc.lifc_len =
sizeof(
struct lifreq) * ln.lifn_count;
1603 lc.lifc_req =
xmalloc(lc.lifc_len);
1605 ret =
ioctl(fd, SIOCGLIFCONF, &lc);
1607 reason =
"SIOCGLIFCONF";
1612 for (i = 0; i < ln.lifn_count; i++) {
1613 struct lifreq *req = &lc.lifc_req[
i];
1615 if (req->lifr_addr.ss_family == AF_INET6 &&
1616 IN6_IS_ADDR_LINKLOCAL(&((
struct sockaddr_in6 *)(&req->lifr_addr))->sin6_addr) &&
1617 ((
struct sockaddr_in6 *)(&req->lifr_addr))->sin6_scope_id == 0) {
1619 memcpy(req2.lifr_name, req->lifr_name, LIFNAMSIZ);
1620 ret =
ioctl(fd, SIOCGLIFINDEX, &req2);
1622 reason =
"SIOCGLIFINDEX";
1625 ((
struct sockaddr_in6 *)(&req->lifr_addr))->sin6_scope_id = req2.lifr_index;
1627 rb_ary_push(list, sockaddr_obj((
struct sockaddr *)&req->lifr_addr));
1633 if (lc.lifc_buf !=
NULL)
1643 #elif defined(SIOCGIFCONF)
1646 #define EXTRA_SPACE (sizeof(struct ifconf) + sizeof(struct sockaddr_storage))
1647 char initbuf[4096+EXTRA_SPACE];
1648 char *buf = initbuf;
1653 const char *reason =
NULL;
1656 fd = socket(AF_INET, SOCK_DGRAM, 0);
1660 bufsize =
sizeof(initbuf);
1665 conf.ifc_req = (
struct ifreq *)buf;
1669 ret =
ioctl(fd, SIOCGIFCONF, &conf);
1671 reason =
"SIOCGIFCONF";
1677 if (bufsize - EXTRA_SPACE < conf.ifc_len) {
1678 if (bufsize < conf.ifc_len) {
1680 bufsize = conf.ifc_len + EXTRA_SPACE;
1683 bufsize = bufsize << 1;
1696 while ((
char*)req < (
char*)conf.ifc_req + conf.ifc_len) {
1697 struct sockaddr *addr = &req->ifr_addr;
1702 # ifndef _SIZEOF_ADDR_IFREQ
1703 # define _SIZEOF_ADDR_IFREQ(r) \
1704 (sizeof(struct ifreq) + \
1705 (sizeof(struct sockaddr) < (r).ifr_addr.sa_len ? \
1706 (r).ifr_addr.sa_len - sizeof(struct sockaddr) : \
1709 req = (
struct ifreq *)((
char*)req + _SIZEOF_ADDR_IFREQ(*req));
1711 req = (
struct ifreq *)((
char*)req +
sizeof(
struct ifreq));
1729 #elif defined(_WIN32)
1730 typedef struct ip_adapter_unicast_address_st {
1731 unsigned LONG_LONG dummy0;
1732 struct ip_adapter_unicast_address_st *
Next;
1734 struct sockaddr *lpSockaddr;
1735 int iSockaddrLength;
1743 } ip_adapter_unicast_address_t;
1744 typedef struct ip_adapter_anycast_address_st {
1745 unsigned LONG_LONG dummy0;
1746 struct ip_adapter_anycast_address_st *
Next;
1748 struct sockaddr *lpSockaddr;
1749 int iSockaddrLength;
1751 } ip_adapter_anycast_address_t;
1752 typedef struct ip_adapter_addresses_st {
1753 unsigned LONG_LONG dummy0;
1754 struct ip_adapter_addresses_st *
Next;
1756 ip_adapter_unicast_address_t *FirstUnicastAddress;
1757 ip_adapter_anycast_address_t *FirstAnycastAddress;
1772 } ip_adapter_addresses_t;
1773 typedef ULONG (WINAPI *GetAdaptersAddresses_t)(
ULONG,
ULONG, PVOID, ip_adapter_addresses_t *, PULONG);
1775 GetAdaptersAddresses_t pGetAdaptersAddresses;
1778 ip_adapter_addresses_t *adapters;
1781 h = LoadLibrary(
"iphlpapi.dll");
1784 pGetAdaptersAddresses = (GetAdaptersAddresses_t)GetProcAddress(h,
"GetAdaptersAddresses");
1785 if (!pGetAdaptersAddresses) {
1791 if (ret != ERROR_SUCCESS && ret != ERROR_BUFFER_OVERFLOW) {
1796 adapters = (ip_adapter_addresses_t *)
ALLOCA_N(BYTE, len);
1797 ret = pGetAdaptersAddresses(
AF_UNSPEC, 0,
NULL, adapters, &len);
1798 if (ret != ERROR_SUCCESS) {
1805 for (; adapters; adapters = adapters->Next) {
1806 ip_adapter_unicast_address_t *uni;
1807 ip_adapter_anycast_address_t *any;
1808 if (adapters->OperStatus != 1)
1810 for (uni = adapters->FirstUnicastAddress; uni; uni = uni->Next) {
1812 if (uni->Address.lpSockaddr->sa_family == AF_INET)
1816 rb_ary_push(list, sockaddr_obj(uni->Address.lpSockaddr));
1818 for (any = adapters->FirstAnycastAddress; any; any = any->Next) {
1820 if (any->Address.lpSockaddr->sa_family == AF_INET)
1824 rb_ary_push(list, sockaddr_obj(any->Address.lpSockaddr));
1833 #define socket_s_ip_address_list rb_f_notimplement
1984 #ifdef HAVE_SYS_UN_H
struct addrinfo * rsock_addrinfo(VALUE host, VALUE port, int socktype, int flags)
static VALUE sock_s_getservbyport(int argc, VALUE *argv)
VALUE rb_ary_entry(VALUE ary, long offset)
void rb_io_set_nonblock(rb_io_t *fptr)
#define rb_tainted_str_new2
#define SockAddrStringValue(v)
static VALUE io_call_close(VALUE io)
static VALUE sock_initialize(int argc, VALUE *argv, VALUE sock)
void rb_define_singleton_method(VALUE obj, const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a singleton method for obj.
VALUE rsock_sock_listen(VALUE sock, VALUE log)
int rsock_socktype_arg(VALUE type)
VALUE rsock_ipaddr(struct sockaddr *sockaddr, int norevlookup)
VALUE rb_ary_push(VALUE ary, VALUE item)
VALUE rsock_init_sock(VALUE sock, int fd)
static VALUE sock_s_getaddrinfo(int argc, VALUE *argv)
VALUE rb_funcall(VALUE, ID, int,...)
Calls a method.
void rb_raise(VALUE exc, const char *fmt,...)
VALUE rsock_s_accept(VALUE klass, int fd, struct sockaddr *sockaddr, socklen_t *len)
VALUE rb_check_sockaddr_string_type(VALUE val)
static VALUE sock_accept(VALUE sock)
#define STRTOUL(str, endptr, base)
int rb_w32_map_errno(DWORD)
#define GetOpenFile(obj, fp)
static const unsigned char dv[]
static VALUE sock_s_unpack_sockaddr_in(VALUE self, VALUE addr)
VALUE rsock_make_ipaddr(struct sockaddr *addr)
VALUE rsock_io_socket_addrinfo(VALUE io, struct sockaddr *addr, socklen_t len)
void rb_fd_fix_cloexec(int fd)
RUBY_EXTERN VALUE rb_mWaitWritable
VALUE rsock_make_hostent(VALUE host, struct addrinfo *addr, VALUE(*ipaddr)(struct sockaddr *, size_t))
#define MEMZERO(p, type, n)
static VALUE sock_s_getnameinfo(int argc, VALUE *argv)
static VALUE sock_connect_nonblock(VALUE sock, VALUE addr)
VALUE rsock_addrinfo_new(struct sockaddr *addr, socklen_t len, int family, int socktype, int protocol, VALUE canonname, VALUE inspectname)
static VALUE sock_recvfrom(int argc, VALUE *argv, VALUE sock)
memset(y->frac+ix+1, 0,(y->Prec-(ix+1))*sizeof(BDIGIT))
VALUE rb_rescue(VALUE(*b_proc)(ANYARGS), VALUE data1, VALUE(*r_proc)(ANYARGS), VALUE data2)
int rb_block_given_p(void)
static VALUE sock_sockaddr(struct sockaddr *addr, size_t len)
int rsock_family_arg(VALUE domain)
#define StringValuePtr(v)
static VALUE sock_sysaccept(VALUE sock)
#define StringValueCStr(v)
int rsock_socket(int domain, int type, int proto)
VALUE rb_define_class(const char *name, VALUE super)
Defines a top-level class.
unsigned char buf[MIME_BUF_SIZE]
void rsock_init_socket_init()
#define ALLOCA_N(type, n)
#define SockAddrStringValuePtr(v)
VALUE rsock_s_recvfrom(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from)
static VALUE io_close(VALUE io)
static void setup_domain_and_type(VALUE domain, int *dv, VALUE type, int *tv)
void freeaddrinfo(struct addrinfo *ai)
static VALUE sock_s_pack_sockaddr_in(VALUE self, VALUE port, VALUE host)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
VALUE rb_assoc_new(VALUE car, VALUE cdr)
void rsock_init_basicsocket(void)
int rsock_do_not_reverse_lookup
static VALUE make_addrinfo(struct addrinfo *res0, int norevlookup)
VALUE rb_ensure(VALUE(*b_proc)(ANYARGS), VALUE data1, VALUE(*e_proc)(ANYARGS), VALUE data2)
static VALUE sock_connect(VALUE sock, VALUE addr)
void rb_sys_fail(const char *mesg)
int rb_getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags)
int rsock_revlookup_flag(VALUE revlookup, int *norevlookup)
void rb_mod_sys_fail(VALUE mod, const char *mesg)
VALUE rb_check_array_type(VALUE ary)
void rsock_raise_socket_error(const char *reason, int error)
int rsock_connect(int fd, const struct sockaddr *sockaddr, int len, int socks)
struct addrinfo * rsock_getaddrinfo(VALUE host, VALUE port, struct addrinfo *hints, int socktype_hack)
struct rb_encoding_entry * list
static VALUE sock_bind(VALUE sock, VALUE addr)
void rb_notimplement(void)
VALUE rsock_s_accept_nonblock(VALUE klass, rb_io_t *fptr, struct sockaddr *sockaddr, socklen_t *len)
struct addrinfo * ai_next
#define RSTRING_LENINT(str)
VALUE rb_str_new(const char *, long)
VALUE rb_obj_alloc(VALUE)
static VALUE sock_s_getservbyname(int argc, VALUE *argv)
#define rsock_sock_s_socketpair
static VALUE sock_s_gethostbyaddr(int argc, VALUE *argv)
VALUE rsock_s_recvfrom_nonblock(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from)
int rb_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res)
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
static ULONG(STDMETHODCALLTYPE AddRef)(IDispatch __RPC_FAR *This)
struct sockaddr * ai_addr
static VALUE sock_s_gethostbyname(VALUE obj, VALUE host)
static VALUE sock_recvfrom_nonblock(int argc, VALUE *argv, VALUE sock)
static VALUE sock_accept_nonblock(VALUE sock)
#define socket_s_ip_address_list