Upload files to "/"
This commit is contained in:
78
fastfetch_server.c
Normal file
78
fastfetch_server.c
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
// gcc fastfetch_server.c -o fastfetch_server
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user