From b043e7a7b6c0c3a621ea95c6cff6fe39060ee4a5 Mon Sep 17 00:00:00 2001 From: tema5002 Date: Sun, 24 May 2026 21:01:21 +0200 Subject: [PATCH] Upload files to "/" --- fastfetch_server.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 fastfetch_server.c diff --git a/fastfetch_server.c b/fastfetch_server.c new file mode 100644 index 0000000..b495413 --- /dev/null +++ b/fastfetch_server.c @@ -0,0 +1,78 @@ +// gcc fastfetch_server.c -o fastfetch_server +#include +#include +#include +#include +#include + +#define BUFFER_SIZE 0x10000 + +void handle_client(int client_fd) { + char output[BUFFER_SIZE]; + + FILE *fp = popen("fastfetch --pipe false 2>/dev/null", "r"); + size_t n = fp ? fread(output, 1, BUFFER_SIZE - 1, fp) : 0; + if (fp) pclose(fp); + output[n] = '\0'; + + dprintf(client_fd, + "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain\r\n" + "Content-Length: %zu\r\n" + "Connection: close\r\n" + "\r\n" + "%s", + n, output); + + shutdown(client_fd, SHUT_WR); + + char discard[1024]; + while (recv(client_fd, discard, sizeof(discard), 0) > 0) {} + + close(client_fd); + exit(0); +} + +int main(int argc, char *argv[]) { + const int port = argc > 1 ? atoi(argv[1]) : 80; + + const int server_fd = socket(AF_INET6, SOCK_STREAM, 0); + if (server_fd < 0) return perror("socket"), 1; + + int opt = 0; + setsockopt(server_fd, IPPROTO_IPV6, IPV6_V6ONLY, &opt, sizeof(opt)); + opt = 1; + setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + + const struct sockaddr_in6 addr = { + .sin6_family = AF_INET6, + .sin6_addr = in6addr_any, + .sin6_port = htons(port) + }; + + if (bind(server_fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) return perror("bind"), 1; + if (listen(server_fd, 128) < 0) return perror("listen"), 1; + + printf("listening on port %d\n", port); + + for (;;) { + struct sockaddr_in6 client_addr; + socklen_t addrlen = sizeof(client_addr); + int client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &addrlen); + + if (client_fd < 0) continue; + + pid_t pid = fork(); + if (pid == 0) { + close(server_fd); + handle_client(client_fd); + } + else if (pid > 0) { + close(client_fd); + } + else { + perror("fork"); + close(client_fd); + } + } +} \ No newline at end of file