2009-01-16 23:11:27 -05:00
|
|
|
/************************************************
|
|
|
|
|
|
|
|
sockssocket.c -
|
|
|
|
|
|
|
|
created at: Thu Mar 31 12:21:29 JST 1994
|
|
|
|
|
|
|
|
Copyright (C) 1993-2007 Yukihiro Matsumoto
|
|
|
|
|
|
|
|
************************************************/
|
|
|
|
|
|
|
|
#include "rubysocket.h"
|
|
|
|
|
|
|
|
#ifdef SOCKS
|
2011-08-15 19:08:39 -04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
2019-10-07 23:12:17 -04:00
|
|
|
* SOCKSSocket.new(host, port) => socket
|
2011-08-15 19:08:39 -04:00
|
|
|
*
|
2019-10-07 23:12:17 -04:00
|
|
|
* Opens a SOCKS connection to +host+ via the SOCKS server.
|
|
|
|
*
|
|
|
|
* The SOCKS server configuration varies by implementation
|
|
|
|
*
|
|
|
|
* When using the Dante libsocks/libsocksd implementation it is configured as SOCKS_SERVER env var.
|
|
|
|
*
|
|
|
|
* See: https://manpages.debian.org/testing/dante-client/socksify.1.en.html for full env variable support.
|
2011-08-15 19:08:39 -04:00
|
|
|
*
|
|
|
|
*/
|
2009-01-16 23:11:27 -05:00
|
|
|
static VALUE
|
2019-10-07 23:12:17 -04:00
|
|
|
socks_init(VALUE sock, VALUE host, VALUE port)
|
2009-01-16 23:11:27 -05:00
|
|
|
{
|
2009-01-27 06:07:41 -05:00
|
|
|
static int init = 0;
|
2009-01-16 23:11:27 -05:00
|
|
|
|
|
|
|
if (init == 0) {
|
2022-07-21 12:23:58 -04:00
|
|
|
SOCKSinit("ruby");
|
|
|
|
init = 1;
|
2009-01-16 23:11:27 -05:00
|
|
|
}
|
|
|
|
|
2020-12-29 01:40:08 -05:00
|
|
|
return rsock_init_inetsock(sock, host, port, Qnil, Qnil, INET_SOCKS, Qnil, Qnil);
|
2009-01-16 23:11:27 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef SOCKS5
|
2011-08-15 19:08:39 -04:00
|
|
|
/*
|
|
|
|
* Closes the SOCKS connection.
|
|
|
|
*
|
|
|
|
*/
|
2009-01-16 23:11:27 -05:00
|
|
|
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
|
2010-03-22 12:15:21 -04:00
|
|
|
rsock_init_sockssocket(void)
|
2009-01-16 23:11:27 -05:00
|
|
|
{
|
|
|
|
#ifdef SOCKS
|
2011-08-15 19:08:39 -04:00
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*/
|
2009-01-16 23:11:27 -05:00
|
|
|
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
|
|
|
|
}
|