diff options
Diffstat (limited to 'ext/socket/sockssocket.c')
-rw-r--r-- | ext/socket/sockssocket.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/ext/socket/sockssocket.c b/ext/socket/sockssocket.c new file mode 100644 index 0000000000..640ddd2f4d --- /dev/null +++ b/ext/socket/sockssocket.c @@ -0,0 +1,65 @@ +/************************************************ + + sockssocket.c - + + created at: Thu Mar 31 12:21:29 JST 1994 + + Copyright (C) 1993-2007 Yukihiro Matsumoto + +************************************************/ + +#include "rubysocket.h" + +#if defined(SOCKS) && !defined(SOCKS5) +static VALUE +socks_connect_blocking(void *data) +{ + struct connect_arg *arg = data; + return (VALUE)Rconnect(arg->fd, arg->sockaddr, arg->len); +} +#endif + +#ifdef SOCKS +static VALUE +socks_init(VALUE sock, VALUE host, VALUE serv) +{ + static init = 0; + + if (init == 0) { + SOCKSinit("ruby"); + init = 1; + } + + return init_inetsock(sock, host, serv, Qnil, Qnil, INET_SOCKS); +} + +#ifdef SOCKS5 +static VALUE +socks_s_close(VALUE sock) +{ + rb_io_t *fptr; + + if (rb_safe_level() >= 4 && !OBJ_TAINTED(sock)) { + rb_raise(rb_eSecurityError, "Insecure: can't close socket"); + } + GetOpenFile(sock, fptr); + shutdown(fptr->fd, 2); + return rb_io_close(sock); +} +#endif +#endif + +/* + * SOCKSSocket class + */ +void +Init_sockssocket(void) +{ +#ifdef SOCKS + rb_cSOCKSSocket = rb_define_class("SOCKSSocket", rb_cTCPSocket); + rb_define_method(rb_cSOCKSSocket, "initialize", socks_init, 2); +#ifdef SOCKS5 + rb_define_method(rb_cSOCKSSocket, "close", socks_s_close, 0); +#endif +#endif +} |