From 3324cc2e236b70d453adc0baa44b2bc95b62d603 Mon Sep 17 00:00:00 2001
From: Mark Somerville <mark@scottishclimbs.com>
Date: Wed, 14 May 2008 11:23:00 +0100
Subject: [PATCH] Moved the listen and accept methods from TCPServer to BasicSocket as protected methods. Now, TCPServer and UNIXServer can both call these protected methods.
---
lib/socket.rb | 79 ++++++++++++++++++++++++++++++++++++++------------------
1 files changed, 53 insertions(+), 26 deletions(-)
diff --git a/lib/socket.rb b/lib/socket.rb
index 2b55882..e902ed8 100644
--- a/lib/socket.rb
+++ b/lib/socket.rb
@@ -41,6 +41,39 @@ class BasicSocket < IO
return 0
end
+
+ # TCPServer and UNIXServer can both accept connections.
+ def accept_connection
+ return if closed?
+ wait_til_readable
+
+ fd = nil
+ sockaddr = nil
+
+ MemoryPointer.new 1024 do |sockaddr_p| # HACK from MRI
+ MemoryPointer.new :int do |size_p|
+ fd = Socket::Foreign.accept descriptor, sockaddr_p, size_p
+ end
+ end
+
+ Errno.handle 'accept(2)' if fd < 0
+
+ socket = self.class.superclass.allocate
+ socket.send :from_descriptor, fd
+ end
+ protected :accept_connection
+
+ # TCPServer and UNIXServer can both listen for connections.
+ def listen_for_connections(backlog)
+ backlog = Type.coerce_to backlog, Fixnum, :to_int
+
+ err = Socket::Foreign.listen descriptor, backlog
+
+ Errno.handle 'listen(2)' unless err == 0
+
+ err
+ end
+ protected :listen_for_connections
end
class Socket < BasicSocket
@@ -468,6 +501,14 @@ class UNIXSocket < BasicSocket
end
private :initialize
+ def listen(backlog)
+ listen_for_connections(backlog)
+ end
+
+ def accept
+ accept_connection
+ end
+
def unix_setup(server = false)
syscall = 'socket(2)'
status = nil
@@ -514,6 +555,14 @@ class UNIXSocket < BasicSocket
_, sock_path = sockaddr.unpack('SZ*')
["AF_UNIX", sock_path]
end
+
+ def from_descriptor(descriptor)
+ setup descriptor
+
+ self
+ end
+ private :from_descriptor
+
end
class UNIXServer < UNIXSocket
@@ -702,34 +751,12 @@ class TCPServer < TCPSocket
tcp_setup @host, @port, nil, nil, true
end
- def accept
- return if closed?
- wait_til_readable
-
- fd = nil
- sockaddr = nil
-
- MemoryPointer.new 1024 do |sockaddr_p| # HACK from MRI
- MemoryPointer.new :int do |size_p|
- fd = Socket::Foreign.accept descriptor, sockaddr_p, size_p
- end
- end
-
- Errno.handle 'accept(2)' if fd < 0
-
- socket = TCPSocket.allocate
- socket.send :from_descriptor, fd
- end
-
def listen(backlog)
- backlog = Type.coerce_to backlog, Fixnum, :to_int
-
- err = Socket::Foreign.listen descriptor, backlog
-
- Errno.handle 'listen(2)' unless err == 0
-
- err
+ listen_for_connections(backlog)
end
+ def accept
+ accept_connection
+ end
end
--
1.5.4.1