diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2020-11-14 10:45:41 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2020-11-14 10:45:41 -0500 |
commit | 596cc59770618c20874cd73a9002f76c4d8f25cc (patch) | |
tree | 2931133b625bbf82d75e407343fdb81581f17005 /lib/lwip-connect.c | |
parent | e0df917b79b7cf4d6b5cff00fc7e69e220414743 (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.c | 33 |
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"); } } |