From a6bec2df944d344f1e38e4be5ea4a3dcd9819158 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Wed, 22 Jul 2026 22:40:37 +0300 Subject: write simple kv-parser for headers --- src/client.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 10 deletions(-) (limited to 'src/client.c') 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 #include +#include #include +#include #include +#include #include #include #include @@ -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); } -- cgit v1.3