From 5336bf62cc9ce3f2cc65e1a4961611d88f929098 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Fri, 22 Feb 2013 16:18:53 +0900 Subject: [PATCH 1/3] ignore EINVAL on socket.shutdown and comment why --- telnetsrv/telnetsrvlib.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/telnetsrv/telnetsrvlib.py b/telnetsrv/telnetsrvlib.py index 2ed6a3f..1cc6f95 100755 --- a/telnetsrv/telnetsrvlib.py +++ b/telnetsrv/telnetsrvlib.py @@ -524,7 +524,16 @@ def setup(self): def finish(self): "End this session" log.debug("Session disconnected.") - self.sock.shutdown(socket.SHUT_RDWR) + try: + self.sock.shutdown(socket.SHUT_RDWR) + except socket.error as e: + # on some systems shutdown fails with EINVAL. + # http://www.freebsd.org/cgi/query-pr.cgi?pr=31647 + import errno + if e.errno == errno.EINVAL: + pass + else: + raise self.session_end() def session_start(self): From e24904f1850e5d0d86b2ae09744dc623a9b46b62 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Fri, 22 Feb 2013 16:19:35 +0900 Subject: [PATCH 2/3] don't wait on cookedq forever when the connection is closed by the peer. it seems that threaded.py needs a similar fix. --- telnetsrv/green.py | 11 +++++++---- telnetsrv/telnetsrvlib.py | 3 ++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/telnetsrv/green.py b/telnetsrv/green.py index ae461c8..c5d79a8 100644 --- a/telnetsrv/green.py +++ b/telnetsrv/green.py @@ -34,10 +34,13 @@ def finish(self): def getc(self, block=True): """Return one character from the input queue""" - try: - return self.cookedq.get(block) - except gevent.queue.Empty: - return '' + while True: + try: + return self.cookedq.get(block, timeout = 10) + except gevent.queue.Empty: + if block and not self.eof: + continue + return '' def inputcooker_socket_ready(self): """Indicate that the socket is ready to be read""" diff --git a/telnetsrv/telnetsrvlib.py b/telnetsrv/telnetsrvlib.py index 1cc6f95..d5cbe2c 100755 --- a/telnetsrv/telnetsrvlib.py +++ b/telnetsrv/telnetsrvlib.py @@ -674,7 +674,8 @@ def readline(self, echo=None, prompt='', use_history=True): c = self.ansi_to_curses(c) if c == theNULL: continue - + elif c == '': + return 'QUIT' elif c == curses.KEY_LEFT: if insptr > 0: insptr = insptr - 1 From 365e021479debae45c1d570e0e1c2e9ef0c2a020 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Fri, 22 Feb 2013 16:28:01 +0900 Subject: [PATCH 3/3] don't keep a socket open unnecessarily --- telnetsrv/telnetsrvlib.py | 1 + 1 file changed, 1 insertion(+) diff --git a/telnetsrv/telnetsrvlib.py b/telnetsrv/telnetsrvlib.py index d5cbe2c..148d727 100755 --- a/telnetsrv/telnetsrvlib.py +++ b/telnetsrv/telnetsrvlib.py @@ -534,6 +534,7 @@ def finish(self): pass else: raise + self.sock.close() self.session_end() def session_start(self):