pvl.socket: Raise EOFError on write() EPIPE, fix socket_str when not connected
authorTero Marttila <terom@paivola.fi>
Sun, 20 Jan 2013 15:39:44 +0200
changeset 144 9966d35a63df
parent 143 fb48ba17ae3e
child 145 a72b6aca2619
pvl.socket: Raise EOFError on write() EPIPE, fix socket_str when not connected
pvl/socket.py
--- a/pvl/socket.py	Sun Jan 20 15:37:59 2013 +0200
+++ b/pvl/socket.py	Sun Jan 20 15:39:44 2013 +0200
@@ -125,7 +125,13 @@
     return socket.getnameinfo(sockaddr, flags)
 
 def socket_str (sock) :
-    peer = sock.getpeername()
+    # get connected peer
+    try :
+        peer = sock.getpeername()
+
+    except socket.error as ex :
+        # fails if socket is not connected XXX: even after EOF on read..?
+        return str(ex)
     
     # lookup scheme
     for scheme, (family, socktype) in URL :
@@ -145,10 +151,13 @@
     else :
         return "{host}:{port}".format(host=host, port=port)
 
-# XXX: SIGPIPE
 def nonblocking (call, *args, **kwargs) :
     """
         Call the given function, which read/writes on a nonblocking file, and return None if it would have blocked.
+
+        Raises EOFError on SIGPIPE/EPIPE.
+
+        # XXX: does python handle SIGPIPE for us?
     """
 
     try :
@@ -159,6 +168,10 @@
         if ex.errno == errno.EAGAIN or ex.errno == errno.EWOULDBLOCK:
             # empty
             return None
+        
+        elif ex.errno == errno.EPIPE :
+            # XXX: write-eof?
+            raise EOFError()
 
         else :
             raise