From 1776e2edccf5f26d1d869791e19442ea35876bb1 Mon Sep 17 00:00:00 2001
From: Anton Ryzhov <anton@ryzhov.me>
Date: Thu, 20 Jun 2013 15:30:51 +0400
Subject: Skip EINTR errors on raw sockets

---
 sleekxmpp/xmlstream/filesocket.py | 9 ++++++++-
 sleekxmpp/xmlstream/xmlstream.py  | 6 ++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/sleekxmpp/xmlstream/filesocket.py b/sleekxmpp/xmlstream/filesocket.py
index d4537998..53b83bc7 100644
--- a/sleekxmpp/xmlstream/filesocket.py
+++ b/sleekxmpp/xmlstream/filesocket.py
@@ -13,6 +13,7 @@
 """
 
 from socket import _fileobject
+import errno
 import socket
 
 
@@ -29,7 +30,13 @@ class FileSocket(_fileobject):
         """Read data from the socket as if it were a file."""
         if self._sock is None:
             return None
-        data = self._sock.recv(size)
+        while True:
+            try:
+                data = self._sock.recv(size)
+                break
+            except socket.error as serr:
+                if serr.errno != errno.EINTR:
+                    raise
         if data is not None:
             return data
 
diff --git a/sleekxmpp/xmlstream/xmlstream.py b/sleekxmpp/xmlstream/xmlstream.py
index 478bd9c0..6de19482 100644
--- a/sleekxmpp/xmlstream/xmlstream.py
+++ b/sleekxmpp/xmlstream/xmlstream.py
@@ -1294,6 +1294,9 @@ class XMLStream(object):
                         try:
                             sent += self.socket.send(data[sent:])
                             count += 1
+                        except Socket.error as serr:
+                            if serr.errno != errno.EINTR:
+                                raise
                         except ssl.SSLError as serr:
                             if tries >= self.ssl_retry_max:
                                 log.debug('SSL error: max retries reached')
@@ -1715,6 +1718,9 @@ class XMLStream(object):
                             try:
                                 sent += self.socket.send(enc_data[sent:])
                                 count += 1
+                            except Socket.error as serr:
+                                if serr.errno != errno.EINTR:
+                                    raise
                             except ssl.SSLError as serr:
                                 if tries >= self.ssl_retry_max:
                                     log.debug('SSL error: max retries reached')
-- 
cgit v1.2.3