From 43cceac785acdae064a6ae380041e994f619dc73 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Fri, 14 Dec 2007 06:42:57 +0000 Subject: [PATCH] (sendcmd): Cope gracefully with short writes and EINTR. Don't just continue after real errors. --- src/client/expect.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/client/expect.c b/src/client/expect.c index 3d1429cc..7ac8008c 100644 --- a/src/client/expect.c +++ b/src/client/expect.c @@ -34,6 +34,7 @@ #include #include +#include #include #include #include @@ -126,7 +127,9 @@ void sendcmd(int s, char *cmd, char *arg) { char buf[128]; - int cc, len; + char *p; + ssize_t n; + int len; len = snprintf(buf, sizeof(buf), "%s %s\n", cmd, arg != NULL ? arg : ""); @@ -134,11 +137,17 @@ sendcmd(int s, char *cmd, char *arg) fprintf(stderr, "%s too long\n", cmd); exit(1); } - cc = write(s, buf, len); - if (cc < 0) { - perror("sendcmd: write"); - } - if (cc != len) { - fprintf(stderr, "sendcmd: short write (%d not %d)\n", cc, len); + p = buf; + while (len > 0) { + n = write(s, buf, len); + if (n < 0) { + if (errno != EINTR) { + perror("sendcmd: write"); + exit(1); + } + n = 0; + } + p += n; + len -= n; } }