Loop the app.

This commit is contained in:
2025-09-13 20:29:45 +03:00
parent 172665ed4d
commit 61936504bc
2 changed files with 28 additions and 7 deletions

View File

@@ -19,16 +19,24 @@ struct {
{ "PATCH", PATCH } { "PATCH", PATCH }
}; };
static volatile sig_atomic_t stop = 0;
void handle_sigint(const int _)
{
stop = 1;
printf("Caught SIGINT!\n");
}
void start_http_server(http_server_t* http_server, const char *addr, const short port) void start_http_server(http_server_t* http_server, const char *addr, const short port)
{ {
const int server_fd = socket(AF_INET, SOCK_STREAM, 0); const int server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == -1) if (server_fd == -1)
{ {
perror("Failed to create new socket.\n"); perror("Failed to create new socket");
return; return;
} }
int opt = 1; const int opt = 1;
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) { if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
perror("setsockopt(SO_REUSEADDR) failed"); perror("setsockopt(SO_REUSEADDR) failed");
} }
@@ -41,21 +49,31 @@ void start_http_server(http_server_t* http_server, const char *addr, const short
const int bind_c = bind(server_fd, (struct sockaddr*)&address, sizeof(address)); const int bind_c = bind(server_fd, (struct sockaddr*)&address, sizeof(address));
if (bind_c == -1) if (bind_c == -1)
{ {
perror("Failed to bind address.\n"); perror("Failed to bind address");
return; return;
} }
const int listen_c = listen(server_fd, 3); const int listen_c = listen(server_fd, 3);
if (listen_c == -1) if (listen_c == -1)
{ {
perror("Failed to begin listening.\n"); perror("Failed to begin listening");
return; return;
} }
struct sigaction sa;
sa.sa_handler = handle_sigint;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGINT, &sa, nullptr);
printf("Server is listening on %s:%d...\n", addr, port); printf("Server is listening on %s:%d...\n", addr, port);
size_t addr_len = sizeof(address); size_t addr_len = sizeof(address);
while (!stop)
{
process_conn(http_server, server_fd, (struct sockaddr*)&address, (socklen_t*)&addr_len); process_conn(http_server, server_fd, (struct sockaddr*)&address, (socklen_t*)&addr_len);
}
close(server_fd); close(server_fd);
} }
@@ -65,7 +83,7 @@ void process_conn(const http_server_t* http_server, const int server_fd, struct
const int socket_d = accept(server_fd, address, addr_len); const int socket_d = accept(server_fd, address, addr_len);
if (socket_d == -1) if (socket_d == -1)
{ {
perror("Failed to accept connection.\n"); perror("Failed to accept connection");
return; return;
} }
@@ -74,7 +92,7 @@ void process_conn(const http_server_t* http_server, const int server_fd, struct
const ssize_t bytes_read = read(socket_d, buffer, 1024); const ssize_t bytes_read = read(socket_d, buffer, 1024);
if (bytes_read == -1) if (bytes_read == -1)
{ {
perror("Failed white reading socket."); perror("Failed while reading socket");
return; return;
} }
@@ -109,6 +127,8 @@ void process_conn(const http_server_t* http_server, const int server_fd, struct
http_request.http_content = nullptr; http_request.http_content = nullptr;
http_request.http_content_len = 0; http_request.http_content_len = 0;
// TODO: Needs functionality to continue reading the request if didn't receive the whole thing,
// and figuring when there are two requests read at once. Boring packet stuff basically.
for (int i = 0; i < bytes_read; i++) for (int i = 0; i < bytes_read; i++)
{ {
bool drop = false; bool drop = false;

View File

@@ -7,6 +7,7 @@
#define SIMPLEHTTPSERVER_H #define SIMPLEHTTPSERVER_H
#include <netdb.h> #include <netdb.h>
#include <signal.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>