From fcbf63e62c627deae76c1b8cb8c0876c536ed811 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Mon, 16 Mar 2020 18:49:26 +0900 Subject: Fresh start --- jni/ruby/ext/socket/sockssocket.c | 68 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 jni/ruby/ext/socket/sockssocket.c (limited to 'jni/ruby/ext/socket/sockssocket.c') diff --git a/jni/ruby/ext/socket/sockssocket.c b/jni/ruby/ext/socket/sockssocket.c new file mode 100644 index 0000000..81f77a6 --- /dev/null +++ b/jni/ruby/ext/socket/sockssocket.c @@ -0,0 +1,68 @@ +/************************************************ + + 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; + + 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 +} -- cgit v1.2.3