THRIFT-4386 Add Lua 5.3/5.4 support
Clint: lua
Patch: Thomas Bruggink

This closes #3012
diff --git a/lib/lua/src/usocket.c b/lib/lua/src/usocket.c
index 21c0bac..27103a0 100644
--- a/lib/lua/src/usocket.c
+++ b/lib/lua/src/usocket.c
@@ -205,21 +205,35 @@
   return socket_wait(sock, WAIT_MODE_C, timeout);
 }
 
+#define SEND_RETRY_COUNT 5
 T_ERRCODE socket_send(
   p_socket sock, const char *data, size_t len, int timeout) {
   int err, put = 0;
   if (*sock < 0) {
     return CLOSED;
   }
-  do {
-    put = send(*sock, data, len, 0);
-    if (put > 0) {
-      return SUCCESS;
-    }
-  } while ((err = errno) == EINTR);
+  for(int i = 0; i < SEND_RETRY_COUNT; i++) {
+    do {
+      size_t l = len - put;
+      put = send(*sock, data + put, l, 0);
+      if (put > 0) {
+        if(put == l) {
+          return SUCCESS;
+        }
+        // Not all data was delivered, we need to try again.
+        err = EAGAIN;
+        break;
+      }
+    } while ((err = errno) == EINTR);
 
-  if (err == EAGAIN) {
-    return socket_wait(sock, WAIT_MODE_W, timeout);
+    if (err == EAGAIN) {
+      err = socket_wait(sock, WAIT_MODE_W, timeout);
+      // Check if the socket is available again and try to resend.
+      if(err == SUCCESS) {
+        continue;
+      }
+    }
+    break;
   }
 
   return err;