[#7785] rb2c — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

28 messages 1999/09/02

[#7845] [Q] irb and SizedQueue — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

14 messages 1999/09/15

[ruby-dev:7940] Re: SOCKS5

From: とみたまさひろ <tommy@...>
Date: 1999-09-28 09:05:28 UTC
List: ruby-dev #7940
とみたです。

At Wed, 22 Sep 1999 10:39:21 +0900,
とみたまさひろ <tommy@tmtm.org> 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 経由でド
メイン名が引けます(といっても <socks.h> を include しただけ)。

ということで新たにパッチを添付します。ruby 1.4.2 のオリジナルに対するパッ
チになっています。

--
とみたまさひろ <tommy@tmtm.org>


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 <stddef.h>
  #include <ctype.h>
  
+ #ifdef SOCKS5
+ #include <socks.h>
+ #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 <string.h>
  #include <stddef.h>
  
+ #ifdef SOCKS5
+ #include <socks.h>
+ #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 <socks.h>
+ #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);

In This Thread