Index: socket.py =================================================================== --- socket.py (revision 6185) +++ socket.py (working copy) @@ -269,7 +269,7 @@ (IPPROTO_TCP, TCP_NODELAY): 'TcpNoDelay', } - def __init__(self, socket=None): + def __init__(self, socket=None, pending_options=None): if socket: self.jchannel = socket.getChannel() self.host = socket.getInetAddress().getHostAddress() @@ -279,7 +279,10 @@ self.host = None self.port = None self.jsocket = self.jchannel.socket() - self.socketio = org.python.core.io.SocketIO(self.jchannel, 'rw') + self.socketio = org.python.core.io.SocketIO(self.jchannel, 'rw') + if pending_options: + for level, optname in pending_options.keys(): + self.setsockopt(level, optname, pending_options[ (level, optname) ]) def bind(self, host, port, reuse_addr): self.jsocket.setReuseAddress(reuse_addr) @@ -339,8 +342,9 @@ (SOL_SOCKET, SO_REUSEADDR): 'ReuseAddress', (SOL_SOCKET, SO_TIMEOUT): 'SoTimeout', } - + def __init__(self, host, port, backlog, reuse_addr): + self.pending_client_options = {} self.jchannel = java.nio.channels.ServerSocketChannel.open() self.jsocket = self.jchannel.socket() if host: @@ -355,14 +359,30 @@ if self.mode in (MODE_BLOCKING, MODE_NONBLOCKING): new_cli_chan = self.jchannel.accept() if new_cli_chan != None: - return _client_socket_impl(new_cli_chan.socket()) + return _client_socket_impl(new_cli_chan.socket(), self.pending_client_options) else: return None else: # In timeout mode now new_cli_sock = self.jsocket.accept() - return _client_socket_impl(new_cli_sock) + return _client_socket_impl(new_cli_sock, self.pending_client_options) + def getsockopt(self, level, option): + if self.options.has_key( (level, option) ): + return _nio_impl.getsockopt(self, level, option) + elif _client_socket_impl.options.has_key( (level, option) ): + return self.pending_client_options.get( (level, option), None) + else: + raise error(errno.ENOPROTOOPT, "Level %d option not supported on socket(%s): %d" % (level, str(self.jsocket), option)) + + def setsockopt(self, level, option, value): + if self.options.has_key( (level, option) ): + _nio_impl.setsockopt(self, level, option, value) + elif _client_socket_impl.options.has_key( (level, option) ): + self.pending_client_options[ (level, option) ] = value + else: + raise error(errno.ENOPROTOOPT, "Level %d option not supported on socket(%s): %d" % (level, str(self.jsocket), option)) + def shutdown(self, how): # This is no-op on java, for server sockets. # What the user wants to achieve is achieved by calling close() on