From 35a613d31ed4a6ff92ef8fb74f019953509014cd Mon Sep 17 00:00:00 2001 From: akr Date: Sat, 17 Jan 2009 04:11:27 +0000 Subject: * ext/socket: split files for each class. * ext/socket/rubysocket.h: common header. * ext/socket/basicsocket.c: new file for BasicSocket. * ext/socket/ipsocket.c: new file for IPSocket. * ext/socket/tcpsocket.c: new file for TCPSocket. * ext/socket/tcpserver.c: new file for TCPServer. * ext/socket/sockssocket.c: new file for SOCKSSocket. * ext/socket/udpsocket.c: new file for UDPSocket. * ext/socket/unixsocket.c: new file for UNIXSocket. * ext/socket/unixserver.c: new file for UNIXServer. * ext/socket/socket.c: now for Socket. * ext/socket/raddrinfo.c: new file for AddrInfo and name resolution. * ext/socket/constants.c: new file for constants. * ext/socket/init.c: new file for utilities. * ext/socket/mkconstants.rb: export *_to_int. * ext/socket/extconf.rb: add new object files. * ext/socket/depend: add dependencies for new files. * ext/.document: add new files. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@21619 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/socket/sockssocket.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 ext/socket/sockssocket.c (limited to 'ext/socket/sockssocket.c') diff --git a/ext/socket/sockssocket.c b/ext/socket/sockssocket.c new file mode 100644 index 000000000..640ddd2f4 --- /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 +} -- cgit