summaryrefslogtreecommitdiff
path: root/ruby_1_9_3/ext/socket/sockssocket.c
diff options
context:
space:
mode:
Diffstat (limited to 'ruby_1_9_3/ext/socket/sockssocket.c')
-rw-r--r--ruby_1_9_3/ext/socket/sockssocket.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/ruby_1_9_3/ext/socket/sockssocket.c b/ruby_1_9_3/ext/socket/sockssocket.c
new file mode 100644
index 0000000000..48be4fcf99
--- /dev/null
+++ b/ruby_1_9_3/ext/socket/sockssocket.c
@@ -0,0 +1,71 @@
+/************************************************
+
+ sockssocket.c -
+
+ created at: Thu Mar 31 12:21:29 JST 1994
+
+ Copyright (C) 1993-2007 Yukihiro Matsumoto
+
+************************************************/
+
+#include "rubysocket.h"
+
+#ifdef SOCKS
+/*
+ * call-seq:
+ * SOCKSSocket.new(host, serv) => socket
+ *
+ * Opens a SOCKS connection to +host+ via the SOCKS server +serv+.
+ *
+ */
+static VALUE
+socks_init(VALUE sock, VALUE host, VALUE serv)
+{
+ static int init = 0;
+
+ if (init == 0) {
+ SOCKSinit("ruby");
+ init = 1;
+ }
+
+ return rsock_init_inetsock(sock, host, serv, Qnil, Qnil, INET_SOCKS);
+}
+
+#ifdef SOCKS5
+/*
+ * Closes the SOCKS connection.
+ *
+ */
+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
+
+void
+rsock_init_sockssocket(void)
+{
+#ifdef SOCKS
+ /*
+ * Document-class: SOCKSSocket < TCPSocket
+ *
+ * SOCKS is an Internet protocol that routes packets between a client and
+ * a server through a proxy server. SOCKS5, if supported, additionally
+ * provides authentication so only authorized users may access a server.
+ */
+ 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
+}