summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAvery Pennarun <apenwarr@gmail.com>2011-01-12 09:19:43 -0800
committerAvery Pennarun <apenwarr@gmail.com>2011-01-12 09:19:43 -0800
commit38bb7f3c2159e7d2b154cf30ae2884a3261a7482 (patch)
tree6d67490b12fec4e194525d70d9ddd0150b16d268
parentb7f1530aefc6272d02a9a1d7e9ccfc393089a01c (diff)
If we get EPIPE on uwrite(), don't close, just do nowrite().
EPIPE doesn't mean the whole socket is dead, it just means we can't write to it. Maybe there's still data waiting to be read, though.
-rw-r--r--ssnet.py11
1 files changed, 8 insertions, 3 deletions
diff --git a/ssnet.py b/ssnet.py
index b5723bf..b52df4c 100644
--- a/ssnet.py
+++ b/ssnet.py
@@ -163,9 +163,14 @@ class SockWrapper:
try:
return _nb_clean(os.write, self.wsock.fileno(), buf)
except OSError, e:
- # unexpected error... stream is dead
- self.seterr('uwrite: %s' % e)
- return 0
+ if e.errno == errno.EPIPE:
+ debug1('%r: uwrite: got EPIPE\n' % self)
+ self.nowrite()
+ return 0
+ else:
+ # unexpected error... stream is dead
+ self.seterr('uwrite: %s' % e)
+ return 0
def write(self, buf):
assert(buf)