Correct handle the value return from mgmt socket read and write (#6220)
diff --git a/mgmt/utils/MgmtUtils.cc b/mgmt/utils/MgmtUtils.cc
index aa007af..010fc7b 100644
--- a/mgmt/utils/MgmtUtils.cc
+++ b/mgmt/utils/MgmtUtils.cc
@@ -70,11 +70,7 @@
         break;
       }
     } else if (rc == 0) {
-      if (n == 1) { /* EOF */
-        return 0;
-      } else {
-        break;
-      }
+      return n;
     } else { /* Error */
       if (errno == ECONNRESET || errno == EPIPE) {
         return n ? n : 0;
@@ -105,24 +101,39 @@
 int
 mgmt_writeline(int soc, const char *data, int nbytes)
 {
-  int nleft, n;
+  int nleft, n = 0;
   const char *tmp = data;
 
   nleft = nbytes;
   while (nleft > 0) {
     int nwritten = write_socket(soc, tmp, nleft);
-    if (nwritten <= 0) { /* Error or nothing written */
+    if (nwritten == 0) { // Nothing written
+      mgmt_sleep_msec(1);
+      continue;
+    } else if (nwritten < 0) { // Error
+      if (mgmt_transient_error()) {
+        mgmt_sleep_msec(1);
+        continue;
+      }
+
       return nwritten;
     }
     nleft -= nwritten;
     tmp += nwritten;
   }
 
-  if ((n = write_socket(soc, "\n", 1)) <= 0) { /* Terminating newline */
-    if (n < 0) {
+  while (n != 1) {
+    n = write_socket(soc, "\n", 1); /* Terminating newline */
+    if (n == 0) {
+      mgmt_sleep_msec(1);
+      continue;
+    } else if (n < 0) { // Error
+      if (mgmt_transient_error()) {
+        mgmt_sleep_msec(1);
+        continue;
+      }
+
       return n;
-    } else {
-      return (nbytes - nleft);
     }
   }
 
@@ -147,6 +158,7 @@
   while (bytes_to_read > 0) {
     int err = read_socket(fd, p, bytes_to_read);
     if (err == 0) {
+      // return 0 if partial read.
       return err;
     } else if (err < 0) {
       // Turn ECONNRESET into EOF.
@@ -188,7 +200,10 @@
   while (bytes_to_write > 0) {
     int err = write_socket(fd, p, bytes_to_write);
     if (err == 0) {
-      return err;
+      // Where this volume of IEEE Std 1003.1-2001 requires -1 to be returned and errno set to [EAGAIN],
+      // most historical implementations return zero for write(2)
+      mgmt_sleep_msec(1);
+      continue;
     } else if (err < 0) {
       if (mgmt_transient_error()) {
         mgmt_sleep_msec(1);