From dc01bcdb849afc84f87fc1605aeee822dd7783c3 Mon Sep 17 00:00:00 2001 From: SimonFJ20 Date: Tue, 4 Mar 2025 12:01:07 +0100 Subject: [PATCH] runtime: add http server --- slige/runtime/src/http_server.c | 80 +++++++++++++++++++++++++++++++++ slige/runtime/src/http_server.h | 19 ++++++++ slige/runtime/src/main.c | 8 ++++ slige/runtime/src/request.c | 0 slige/runtime/src/request.h | 6 +++ 5 files changed, 113 insertions(+) create mode 100644 slige/runtime/src/http_server.c create mode 100644 slige/runtime/src/http_server.h create mode 100644 slige/runtime/src/request.c create mode 100644 slige/runtime/src/request.h diff --git a/slige/runtime/src/http_server.c b/slige/runtime/src/http_server.c new file mode 100644 index 0000000..e6a5b51 --- /dev/null +++ b/slige/runtime/src/http_server.c @@ -0,0 +1,80 @@ +#include "http_server.h" +#include +#include +#include +#include +#include +#include +#include + +typedef struct sockaddr SockAddr; +typedef struct sockaddr_in AddrIn; + + +struct HttpServer { + int server_fd; + AddrIn server_addr; + thrd_t* worker_threads; +}; + +HttpServer* http_server_new(HttpServerOpts opts) +{ + + int server_fd = socket(AF_INET, SOCK_STREAM, 0); + if (server_fd == -1) { + fprintf(stderr, "error: could not initialize socket\n"); + return NULL; + } + + AddrIn server_addr; + server_addr.sin_family = AF_INET; + server_addr.sin_addr.s_addr = INADDR_ANY; + server_addr.sin_port = htons(opts.port); + + int res = bind(server_fd, (SockAddr*)&server_addr, sizeof(server_addr)); + if (res != 0) { + fprintf(stderr, "error: could not bind socket\n"); + return NULL; + } + + res = listen(server_fd, 16); + if (res != 0) { + fprintf(stderr, "error: could not listen on socket\n"); + return NULL; + } + + thrd_t* worker_threads = malloc(sizeof(thrd_t) * opts.worker_threads); + for (size_t i = 0; i < opts.worker_threads; ++i) { + // worker_threads[i] = thrd_create(thrd_t *thr, thrd_start_t func, void *arg) + } + + HttpServer* server = malloc(sizeof(HttpServer)); + *server = (HttpServer) { + server_fd, + server_addr, + }; + + return server; +} + +void http_server_free(HttpServer* server) +{ + close(server->server_fd); + free(server); +} + +int http_server_listen(HttpServer* server) +{ + while (true) { + AddrIn client_addr; + socklen_t client_addr_size = sizeof(client_addr); + + int res = accept( + server->server_fd, (SockAddr*)&client_addr, &client_addr_size); + if (res == -1) { + fprintf(stderr, "error: could not accept\n"); + return -1; + } + + } +} diff --git a/slige/runtime/src/http_server.h b/slige/runtime/src/http_server.h new file mode 100644 index 0000000..6475141 --- /dev/null +++ b/slige/runtime/src/http_server.h @@ -0,0 +1,19 @@ +#pragma once + +#include +#include + +typedef struct HttpServer HttpServer; + +typedef struct { + uint16_t port; + size_t worker_threads; +} HttpServerOpts; + +/// On error, returns NULL and prints. +HttpServer* http_server_new(HttpServerOpts opts); +void http_server_free(HttpServer* server); + +/// On error, returns -1; +int http_server_listen(HttpServer* server); + diff --git a/slige/runtime/src/main.c b/slige/runtime/src/main.c index 80fe9e8..1039211 100644 --- a/slige/runtime/src/main.c +++ b/slige/runtime/src/main.c @@ -1,6 +1,14 @@ +#include "http_server.h" #include int main(void) { printf("hello world\n"); + + HttpServer* server = http_server_new((HttpServerOpts) { + .port = 8080, + .worker_threads = 8, + }); + + http_server_free(server); } diff --git a/slige/runtime/src/request.c b/slige/runtime/src/request.c new file mode 100644 index 0000000..e69de29 diff --git a/slige/runtime/src/request.h b/slige/runtime/src/request.h new file mode 100644 index 0000000..4eb394a --- /dev/null +++ b/slige/runtime/src/request.h @@ -0,0 +1,6 @@ +#pragma once + +typedef struct { + int v; +} RequestQueue; +