From 3324cc2e236b70d453adc0baa44b2bc95b62d603 Mon Sep 17 00:00:00 2001
From: Mark Somerville 
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