kgio 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  #!/bin/sh
2
2
 
3
3
  GVF=GIT-VERSION-FILE
4
- DEF_VER=v1.0.1.GIT
4
+ DEF_VER=v1.1.0.GIT
5
5
 
6
6
  LF='
7
7
  '
@@ -32,6 +32,8 @@ static int accept4_flags = A4_SOCK_CLOEXEC;
32
32
  static int accept4_flags = A4_SOCK_CLOEXEC | A4_SOCK_NONBLOCK;
33
33
  #endif /* ! linux */
34
34
 
35
+ static VALUE cClientSocket;
36
+ static VALUE mSocketMethods;
35
37
  static VALUE cSocket;
36
38
  static VALUE localhost;
37
39
  static VALUE mKgio_WaitReadable, mKgio_WaitWritable;
@@ -533,7 +535,7 @@ retry:
533
535
  rb_sys_fail("accept");
534
536
  }
535
537
  }
536
- return sock_for_fd(cSocket, client);
538
+ return sock_for_fd(cClientSocket, client);
537
539
  }
538
540
 
539
541
  static void in_addr_set(VALUE io, struct sockaddr_in *addr)
@@ -950,10 +952,34 @@ static VALUE kgio_start(VALUE klass, VALUE addr)
950
952
  return stream_connect(klass, addr, 0);
951
953
  }
952
954
 
955
+ static VALUE set_accepted(VALUE klass, VALUE aclass)
956
+ {
957
+ VALUE tmp;
958
+
959
+ if (NIL_P(aclass))
960
+ aclass = cSocket;
961
+
962
+ tmp = rb_funcall(aclass, rb_intern("included_modules"), 0, 0);
963
+ tmp = rb_funcall(tmp, rb_intern("include?"), 1, mSocketMethods);
964
+
965
+ if (tmp != Qtrue)
966
+ rb_raise(rb_eTypeError,
967
+ "class must include Kgio::SocketMethods");
968
+
969
+ cClientSocket = aclass;
970
+
971
+ return aclass;
972
+ }
973
+
974
+ static VALUE get_accepted(VALUE klass)
975
+ {
976
+ return cClientSocket;
977
+ }
978
+
953
979
  void Init_kgio_ext(void)
954
980
  {
955
981
  VALUE mKgio = rb_define_module("Kgio");
956
- VALUE mPipeMethods, mSocketMethods;
982
+ VALUE mPipeMethods;
957
983
  VALUE cUNIXServer, cTCPServer, cUNIXSocket, cTCPSocket;
958
984
 
959
985
  rb_require("socket");
@@ -967,6 +993,7 @@ void Init_kgio_ext(void)
967
993
  */
968
994
  cSocket = rb_const_get(rb_cObject, rb_intern("Socket"));
969
995
  cSocket = rb_define_class_under(mKgio, "Socket", cSocket);
996
+ cClientSocket = cSocket;
970
997
 
971
998
  localhost = rb_str_new2("127.0.0.1");
972
999
 
@@ -1001,6 +1028,8 @@ void Init_kgio_ext(void)
1001
1028
  rb_define_singleton_method(mKgio, "accept_cloexec=", set_cloexec, 1);
1002
1029
  rb_define_singleton_method(mKgio, "accept_nonblock?", get_nonblock, 0);
1003
1030
  rb_define_singleton_method(mKgio, "accept_nonblock=", set_nonblock, 1);
1031
+ rb_define_singleton_method(mKgio, "accept_class=", set_accepted, 1);
1032
+ rb_define_singleton_method(mKgio, "accept_class", get_accepted, 0);
1004
1033
 
1005
1034
  /*
1006
1035
  * Document-module: Kgio::PipeMethods
@@ -0,0 +1,52 @@
1
+ require 'test/unit'
2
+ require 'io/nonblock'
3
+ $-w = true
4
+ require 'kgio'
5
+
6
+ class TestAcceptClass < Test::Unit::TestCase
7
+ def setup
8
+ assert_equal Kgio::Socket, Kgio.accept_class
9
+ end
10
+
11
+ def teardown
12
+ assert_nothing_raised { Kgio.accept_class = nil }
13
+ assert_equal Kgio::Socket, Kgio.accept_class
14
+ end
15
+
16
+ def test_tcp_socket
17
+ assert_nothing_raised { Kgio.accept_class = Kgio::TCPSocket }
18
+ assert_equal Kgio::TCPSocket, Kgio.accept_class
19
+ end
20
+
21
+ def test_invalid
22
+ assert_raises(TypeError) { Kgio.accept_class = TCPSocket }
23
+ assert_equal Kgio::Socket, Kgio.accept_class
24
+ end
25
+
26
+ def test_accepted_class
27
+ @host = ENV["TEST_HOST"] || '127.0.0.1'
28
+ @srv = Kgio::TCPServer.new(@host, 0)
29
+ @port = @srv.addr[1]
30
+
31
+ assert_nothing_raised { Kgio.accept_class = Kgio::TCPSocket }
32
+ client = TCPSocket.new(@host, @port)
33
+ assert_instance_of Kgio::TCPSocket, @srv.kgio_accept
34
+ client = TCPSocket.new(@host, @port)
35
+ IO.select([@srv])
36
+ assert_instance_of Kgio::TCPSocket, @srv.kgio_tryaccept
37
+
38
+ assert_nothing_raised { Kgio.accept_class = nil }
39
+ client = TCPSocket.new(@host, @port)
40
+ assert_instance_of Kgio::Socket, @srv.kgio_accept
41
+ client = TCPSocket.new(@host, @port)
42
+ IO.select([@srv])
43
+ assert_instance_of Kgio::Socket, @srv.kgio_tryaccept
44
+
45
+ assert_nothing_raised { Kgio.accept_class = Kgio::UNIXSocket }
46
+ client = TCPSocket.new(@host, @port)
47
+ assert_instance_of Kgio::UNIXSocket, @srv.kgio_accept
48
+ client = TCPSocket.new(@host, @port)
49
+ IO.select([@srv])
50
+ assert_instance_of Kgio::UNIXSocket, @srv.kgio_tryaccept
51
+ end
52
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kgio
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
- - 0
9
8
  - 1
10
- version: 1.0.1
9
+ - 0
10
+ version: 1.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - kgio hackers
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-28 00:00:00 +00:00
18
+ date: 2010-09-29 00:00:00 +00:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -67,6 +67,7 @@ files:
67
67
  - setup.rb
68
68
  - test/lib_read_write.rb
69
69
  - test/lib_server_accept.rb
70
+ - test/test_accept_class.rb
70
71
  - test/test_connect_fd_leak.rb
71
72
  - test/test_pipe_popen.rb
72
73
  - test/test_pipe_read_write.rb
@@ -128,3 +129,4 @@ test_files:
128
129
  - test/test_unix_client_read_server_write.rb
129
130
  - test/test_tcp_client_read_server_write.rb
130
131
  - test/test_pipe_popen.rb
132
+ - test/test_accept_class.rb