diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2026-07-22 22:40:37 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2026-07-22 22:51:44 +0300 |
| commit | a6bec2df944d344f1e38e4be5ea4a3dcd9819158 (patch) | |
| tree | b514b0820beec906bc9479c6d7ad9f9827241896 /src/client.c | |
| parent | dd6314503f02dde966adce06e27105f547300077 (diff) | |
| download | lark-a6bec2df944d344f1e38e4be5ea4a3dcd9819158.tar.gz lark-a6bec2df944d344f1e38e4be5ea4a3dcd9819158.zip | |
write simple kv-parser for headers
Diffstat (limited to 'src/client.c')
| -rw-r--r-- | src/client.c | 56 |
1 files changed, 46 insertions, 10 deletions
diff --git a/src/client.c b/src/client.c index 5b87c37..45a3c39 100644 --- a/src/client.c +++ b/src/client.c @@ -1,7 +1,10 @@ #include <err.h> #include <string.h> +#include <errno.h> #include <stdio.h> +#include <fcntl.h> #include <stdlib.h> +#include <poll.h> #include <unistd.h> #include <netinet/in.h> #include <sys/socket.h> @@ -44,29 +47,62 @@ int main() return -1; } - int c; - while ((c = fgetc(stdin)) != EOF) { - char cb = c; - int ret = write(tcp_sock, &cb, 1); - if (ret == -1) { - err(EXIT_FAILURE, "failed writing to socket"); + ret = fcntl(tcp_sock, F_SETFL, O_NONBLOCK); + if (ret == -1) { + close(tcp_sock); + return ret; + } + + struct pollfd polls[2] = {{ + .fd = STDIN_FILENO, + .events = POLLIN + }, { + .fd = tcp_sock, + .events = POLLIN } + }; - if (cb == '\n') { - char buf[4096]; - ret = read(tcp_sock, buf, 4096); + while (poll(polls, 2, -1)) { + if (polls[0].revents) { + char cb = 'a'; + + int ret = read(STDIN_FILENO, &cb, 1); if (ret == -1) { - printf("Error\n"); + err(EXIT_FAILURE, "failed reading from stdio"); + } + + if (ret == 0) { break; } + ret = write(tcp_sock, &cb, 1); + if (ret == -1) { + err(EXIT_FAILURE, "failed writing to socket"); + } + } + + if (polls[1].revents) { + if (polls[1].revents & POLLHUP) { + printf("Closed socket\n"); + break; + } + + char buf[4096]; + int ret = read(tcp_sock, buf, 4096 - 1); + if (ret == -1 && errno != EWOULDBLOCK) { + err(EXIT_FAILURE, "failed reading from socket"); + } + if (ret == 0) { printf("Closed socket\n"); break; } + + buf[ret] = '\0'; printf("%s\n", buf); } } + close(tcp_sock); } |
