From: "とみたまさひろ" Date: 1999-09-28T18:05:28+09:00 Subject: [ruby-dev:7940] Re: SOCKS5 とみたです。 At Wed, 22 Sep 1999 10:39:21 +0900, とみたまさひろ wrote: > 私の手元にあった socks5 ライブラリでは、ruby の socket モジュールがうま > く動かなかったので、パッチを作りました。 > > 一応動くようになってますし、socks5 ライブラリがなければ今まで通りの動作 > をするはずですが、socks については全然詳しくないので、変なことをやってい > るかもしれません (__; やはり不十分でした。うまくいかなくて4日ほど、socks ライブラリと rftp と ruby のソースと格闘してました。 socks を使った場合 close() も socks ライブラリの close() を使わないとい けなかったんですが、close() は io.c にあるため socks ライブラリのを使え ていなかったのが原因でした。 io.c の close() をいじるのはイヤだったので、苦肉の策で shutdown() してか ら rb_io_close を呼ぶようにしました。動いてるからまあいいでしょう (^^; gethostbyname も SOCKS ライブラリのを使うようにしたので、SOCKS 経由でド メイン名が引けます(といっても を include しただけ)。 ということで新たにパッチを添付します。ruby 1.4.2 のオリジナルに対するパッ チになっています。 -- とみたまさひろ diff -rc socket.orig/extconf.rb socket/extconf.rb *** socket.orig/extconf.rb Tue Aug 24 12:39:14 1999 --- socket/extconf.rb Tue Sep 28 16:01:38 1999 *************** *** 271,277 **** have_func("uname") end if ENV["SOCKS_SERVER"] or enable_config("socks", false) ! if have_library("socks", "Rconnect") $CFLAGS="-DSOCKS" end end --- 271,279 ---- have_func("uname") end if ENV["SOCKS_SERVER"] or enable_config("socks", false) ! if have_library("socks5", "SOCKSinit") ! $CFLAGS="-DSOCKS5 -DSOCKS" ! elsif have_library("socks", "Rconnect") $CFLAGS="-DSOCKS" end end diff -rc socket.orig/getaddrinfo.c socket/getaddrinfo.c *** socket.orig/getaddrinfo.c Fri Aug 13 14:37:50 1999 --- socket/getaddrinfo.c Tue Sep 28 16:15:30 1999 *************** *** 67,72 **** --- 67,76 ---- #include #include + #ifdef SOCKS5 + #include + #endif + #include "config.h" #include "addrinfo.h" #include "sockport.h" diff -rc socket.orig/getnameinfo.c socket/getnameinfo.c *** socket.orig/getnameinfo.c Fri Aug 13 14:37:50 1999 --- socket/getnameinfo.c Tue Sep 28 16:02:55 1999 *************** *** 56,61 **** --- 56,65 ---- #include #include + #ifdef SOCKS5 + #include + #endif + #include "config.h" #include "addrinfo.h" #include "sockport.h" diff -rc socket.orig/socket.c socket/socket.c *** socket.orig/socket.c Fri Aug 13 14:37:50 1999 --- socket/socket.c Tue Sep 28 16:22:04 1999 *************** *** 63,71 **** --- 63,75 ---- #ifdef SOCKS VALUE rb_cSOCKSSocket; + #ifdef SOCKS5 + #include + #else void SOCKSinit(); int Rconnect(); #endif + #endif #define INET_CLIENT 0 #define INET_SERVER 1 *************** *** 631,641 **** # define NONBLOCKING O_NONBLOCK #endif #endif fcntl(fd, F_SETFL, mode|NONBLOCKING); #endif /* HAVE_FCNTL */ for (;;) { ! #ifdef SOCKS if (socks) { status = Rconnect(fd, sockaddr, len); } --- 635,648 ---- # define NONBLOCKING O_NONBLOCK #endif #endif + #ifdef SOCKS5 + if (!socks) + #endif fcntl(fd, F_SETFL, mode|NONBLOCKING); #endif /* HAVE_FCNTL */ for (;;) { ! #if defined(SOCKS) && !defined(SOCKS5) if (socks) { status = Rconnect(fd, sockaddr, len); } *************** *** 773,778 **** --- 780,799 ---- Check_SafeStr(host); return open_inet(class, host, serv, INET_SOCKS); } + + #ifdef SOCKS5 + static VALUE + socks_s_close(sock) + VALUE sock; + { + OpenFile *fptr; + + GetOpenFile(sock, fptr); + shutdown(fileno(fptr->f), 2); + shutdown(fileno(fptr->f2), 2); + return rb_io_close(sock); + } + #endif #endif /* *************** *** 1869,1874 **** --- 1890,1898 ---- rb_define_global_const("SOCKSsocket", rb_cSOCKSSocket); rb_define_singleton_method(rb_cSOCKSSocket, "open", socks_s_open, 2); rb_define_singleton_method(rb_cSOCKSSocket, "new", socks_s_open, 2); + #ifdef SOCKS5 + rb_define_method(rb_cSOCKSSocket, "close", socks_s_close, 0); + #endif #endif rb_cTCPServer = rb_define_class("TCPServer", rb_cTCPSocket);