The Grande 'sendall()' patch, copied from release21-maint. Fixes #516715.
Replaces calls to socket.send() (which isn't guaranteed to send all data)
with the new socket.sendall() method.
diff --git a/Lib/ftplib.py b/Lib/ftplib.py
index 6234f7f..cad7a5b 100644
--- a/Lib/ftplib.py
+++ b/Lib/ftplib.py
@@ -168,7 +168,7 @@
     def putline(self, line):
         line = line + CRLF
         if self.debugging > 1: print '*put*', self.sanitize(line)
-        self.sock.send(line)
+        self.sock.sendall(line)
 
     # Internal: send one command to the server (through putline())
     def putcmd(self, line):
@@ -231,7 +231,7 @@
         tried.  Instead, just send the ABOR command as OOB data.'''
         line = 'ABOR' + CRLF
         if self.debugging > 1: print '*put urgent*', self.sanitize(line)
-        self.sock.send(line, MSG_OOB)
+        self.sock.sendall(line, MSG_OOB)
         resp = self.getmultiline()
         if resp[:3] not in ('426', '226'):
             raise error_proto, resp
@@ -417,7 +417,7 @@
         while 1:
             buf = fp.read(blocksize)
             if not buf: break
-            conn.send(buf)
+            conn.sendall(buf)
         conn.close()
         return self.voidresp()
 
@@ -431,7 +431,7 @@
             if buf[-2:] != CRLF:
                 if buf[-1] in CRLF: buf = buf[:-1]
                 buf = buf + CRLF
-            conn.send(buf)
+            conn.sendall(buf)
         conn.close()
         return self.voidresp()
 
diff --git a/Lib/gopherlib.py b/Lib/gopherlib.py
index 8dea566..03d12ec 100644
--- a/Lib/gopherlib.py
+++ b/Lib/gopherlib.py
@@ -66,7 +66,7 @@
         port = int(port)
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     s.connect((host, port))
-    s.send(selector + CRLF)
+    s.sendall(selector + CRLF)
     s.shutdown(1)
     return s.makefile('rb')
 
diff --git a/Lib/httplib.py b/Lib/httplib.py
index cd0bdb9..04cfca6 100644
--- a/Lib/httplib.py
+++ b/Lib/httplib.py
@@ -403,7 +403,7 @@
         if self.debuglevel > 0:
             print "send:", repr(str)
         try:
-            self.sock.send(str)
+            self.sock.sendall(str)
         except socket.error, v:
             if v[0] == 32:      # Broken pipe
                 self.close()
diff --git a/Lib/imaplib.py b/Lib/imaplib.py
index 04d4d87..03513a3 100644
--- a/Lib/imaplib.py
+++ b/Lib/imaplib.py
@@ -222,14 +222,7 @@
 
     def send(self, data):
         """Send data to remote."""
-        bytes = len(data)
-        while bytes > 0:
-            sent = self.sock.send(data)
-            if sent == bytes:
-                break   # avoid copy
-            data = data[sent:]
-            bytes = bytes - sent
-
+        self.sock.sendall(data)
 
     def shutdown(self):
         """Close I/O established in "open"."""
diff --git a/Lib/nntplib.py b/Lib/nntplib.py
index fad6b08..21faab1 100644
--- a/Lib/nntplib.py
+++ b/Lib/nntplib.py
@@ -179,7 +179,7 @@
         """Internal: send one line to the server, appending CRLF."""
         line = line + CRLF
         if self.debugging > 1: print '*put*', `line`
-        self.sock.send(line)
+        self.sock.sendall(line)
 
     def putcmd(self, line):
         """Internal: send one command to the server (through putline())."""
diff --git a/Lib/poplib.py b/Lib/poplib.py
index 23c0b46..0525043 100644
--- a/Lib/poplib.py
+++ b/Lib/poplib.py
@@ -97,7 +97,7 @@
 
     def _putline(self, line):
         if self._debugging > 1: print '*put*', `line`
-        self.sock.send('%s%s' % (line, CRLF))
+        self.sock.sendall('%s%s' % (line, CRLF))
 
 
     # Internal: send one command to the server (through _putline())
diff --git a/Lib/smtplib.py b/Lib/smtplib.py
index cb15de2..f024bff 100755
--- a/Lib/smtplib.py
+++ b/Lib/smtplib.py
@@ -290,9 +290,7 @@
         if self.debuglevel > 0: print 'send:', `str`
         if self.sock:
             try:
-                sendptr = 0
-                while sendptr < len(str):
-                    sendptr = sendptr + self.sock.send(str[sendptr:])
+                self.sock.sendall(str)
             except socket.error:
                 self.close()
                 raise SMTPServerDisconnected('Server not connected')
diff --git a/Lib/socket.py b/Lib/socket.py
index c460c5f..45131ce 100644
--- a/Lib/socket.py
+++ b/Lib/socket.py
@@ -185,7 +185,7 @@
 
     def flush(self):
         if self._wbuf:
-            self._sock.send(self._wbuf)
+            self._sock.sendall(self._wbuf)
             self._wbuf = ""
 
     def fileno(self):
@@ -201,7 +201,7 @@
                 self.flush()
 
     def writelines(self, list):
-        filter(self._sock.send, list)
+        filter(self._sock.sendall, list)
         self.flush()
 
     def read(self, n=-1):
diff --git a/Lib/telnetlib.py b/Lib/telnetlib.py
index 15721c6..cdbbd9f 100644
--- a/Lib/telnetlib.py
+++ b/Lib/telnetlib.py
@@ -269,7 +269,7 @@
         if IAC in buffer:
             buffer = buffer.replace(IAC, IAC+IAC)
         self.msg("send %s", `buffer`)
-        self.sock.send(buffer)
+        self.sock.sendall(buffer)
 
     def read_until(self, match, timeout=None):
         """Read until a given string is encountered or until timeout.
@@ -411,7 +411,7 @@
                     if self.option_callback:
                         self.option_callback(self.sock, c, opt)
                     else:
-                        self.sock.send(IAC + WONT + opt)
+                        self.sock.sendall(IAC + WONT + opt)
                 elif c in (WILL, WONT):
                     opt = self.rawq_getchar()
                     self.msg('IAC %s %d',
@@ -419,7 +419,7 @@
                     if self.option_callback:
                         self.option_callback(self.sock, c, opt)
                     else:
-                        self.sock.send(IAC + DONT + opt)
+                        self.sock.sendall(IAC + DONT + opt)
                 else:
                     self.msg('IAC %d not recognized' % ord(opt))
         except EOFError: # raised by self.rawq_getchar()