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