summaryrefslogtreecommitdiff
path: root/lib/lwip-connect.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2020-11-14 10:45:41 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2020-11-14 10:45:41 -0500
commit596cc59770618c20874cd73a9002f76c4d8f25cc (patch)
tree2931133b625bbf82d75e407343fdb81581f17005 /lib/lwip-connect.c
parente0df917b79b7cf4d6b5cff00fc7e69e220414743 (diff)
Improve lwip connect
It was going into an infinite loop (due to short writes?)
Diffstat (limited to 'lib/lwip-connect.c')
-rw-r--r--lib/lwip-connect.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/lib/lwip-connect.c b/lib/lwip-connect.c
index 04e6404..b6a08fb 100644
--- a/lib/lwip-connect.c
+++ b/lib/lwip-connect.c
@@ -75,7 +75,7 @@ int main(int argc, char **argv)
while (1) {
char buf[4096];
fd_set fds;
- int n;
+ int r, w, wrote;
FD_ZERO(&fds);
FD_SET(STDIN_FILENO, &fds);
@@ -83,18 +83,33 @@ int main(int argc, char **argv)
lwip_select(fd + 1, &fds, NULL, &fds, NULL);
- while ((n = lwip_read(fd, buf, sizeof(buf))) > 0)
- write(STDOUT_FILENO, buf, n);
- if (!n)
+ while ((r = lwip_read(fd, buf, sizeof(buf))) > 0) {
+ wrote = 0;
+
+ while (wrote < r) {
+ w = write(STDOUT_FILENO, buf + wrote, r - wrote);
+ if (w < 0)
+ die("error writing to stdout");
+ wrote += w;
+ }
+ }
+ if (!r)
exit(EXIT_SUCCESS);
- if (n < 0 && errno != EAGAIN)
+ if (r < 0 && errno != EAGAIN)
die("error reading from socket");
- while ((n = read(STDIN_FILENO, buf, sizeof(buf))) > 0)
- lwip_write(fd, buf, n);
- if (!n)
+ while ((r = read(STDIN_FILENO, buf, sizeof(buf))) > 0) {
+ wrote = 0;
+ while (wrote < r) {
+ w = lwip_write(fd, buf + wrote, r - wrote);
+ if (w < 0)
+ die("error writing to socket");
+ wrote += w;
+ }
+ }
+ if (!r)
exit(EXIT_SUCCESS);
- if (n < 0 && errno != EAGAIN)
+ if (r < 0 && errno != EAGAIN)
die("error reading from stdin");
}
}