diff options
| author | Tomoyuki Sahara <[email protected]> | 2014-06-17 15:41:42 +0900 |
|---|---|---|
| committer | Tomoyuki Sahara <[email protected]> | 2014-06-17 15:41:42 +0900 |
| commit | 376af5bac31f1b38554a72d879972d45dfe7cdb7 (patch) | |
| tree | c9ef92a238730fb0390d41d376025ad8f257d467 /mrblib | |
| parent | cb84ce30e7a8fabf930b8fc2bcf910da1cdcbd00 (diff) | |
| download | mruby-376af5bac31f1b38554a72d879972d45dfe7cdb7.tar.gz mruby-376af5bac31f1b38554a72d879972d45dfe7cdb7.zip | |
re-implement TCPServer.accept. fixes #12.
Diffstat (limited to 'mrblib')
| -rw-r--r-- | mrblib/socket.rb | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/mrblib/socket.rb b/mrblib/socket.rb index b8c8b4c18..732a6db8e 100644 --- a/mrblib/socket.rb +++ b/mrblib/socket.rb @@ -224,7 +224,7 @@ end class TCPSocket def initialize(host, service, local_host=nil, local_service=nil) - if self.is_a? TCPServer + if @init_with_fd super(host, service) else s = nil @@ -243,12 +243,20 @@ class TCPSocket end end + def self.new_with_prelude pre, *args + o = self._allocate + o.instance_eval(&pre) + o.initialize(*args) + o + end + #def self.gethostbyname(host) end class TCPServer def initialize(host=nil, service) ai = Addrinfo.getaddrinfo(host, service, nil, nil, nil, Socket::AI_PASSIVE)[0] + @init_with_fd = true super(Socket._socket(ai.afamily, Socket::SOCK_STREAM, 0), "r+") Socket._bind(self.fileno, ai.to_sockaddr) listen(5) @@ -256,7 +264,13 @@ class TCPServer end def accept - TCPSocket.for_fd(self.sysaccept) + fd = self.sysaccept + begin + TCPSocket.new_with_prelude(proc { @init_with_fd = true }, fd, "r+") + rescue + IO._sysclose(fd) rescue nil + raise + end end def accept_nonblock |
