Fix compiler errors

This commit is contained in:
2025-07-20 23:53:23 +02:00
parent 3b196546da
commit c3bfb86707
18 changed files with 895 additions and 145 deletions
+23 -1
View File
@@ -1,12 +1,19 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef HTTPS_ENABLED
#include <openssl/pem.h>
#include <openssl/conf.h>
#include <openssl/x509v3.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/bn.h>
#endif
#include "cert.h"
#ifdef HTTPS_ENABLED
static EVP_PKEY *generate_rsa_key_pair(int key_bits)
{
@@ -137,4 +144,19 @@ int http_create_test_certificate(HTTP_String C, HTTP_String O, HTTP_String CN,
X509_free(x509);
EVP_PKEY_free(pkey);
return 0;
}
}
#else
int http_create_test_certificate(HTTP_String C, HTTP_String O, HTTP_String CN,
HTTP_String cert_file, HTTP_String key_file)
{
(void) C;
(void) O;
(void) CN;
(void) cert_file;
(void) key_file;
return -1;
}
#endif
+17 -12
View File
@@ -1,14 +1,22 @@
#include <stdint.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#define POLL WSAPoll
#endif
#ifdef __linux__
#include <poll.h>
#define POLL poll
#endif
#include "client.h"
#include "socket.h"
#include "engine.h"
#include <stdint.h>
#include <stdbool.h>
#include <assert.h>
#include <stdlib.h>
// TODO
#include <stdio.h>
#define ERROR printf("error at %s:%d\n", __FILE__, __LINE__);
#define CLIENT_MAX_CONNS 256
@@ -200,7 +208,7 @@ int http_client_wait(HTTP_Client *client, HTTP_RequestHandle *handle)
if (num_polled == 0)
return -1;
poll(polled, num_polled, -1);
POLL(polled, num_polled, -1);
for (int i = 0; i < num_polled; i++) {
@@ -275,7 +283,6 @@ void http_request_line(HTTP_RequestHandle handle, HTTP_Method method, HTTP_Strin
int ret = http_parse_url(url.ptr, url.len, &parsed_url);
if (ret != url.len) {
// TODO
ERROR;
return;
}
@@ -284,7 +291,6 @@ void http_request_line(HTTP_RequestHandle handle, HTTP_Method method, HTTP_Strin
secure = true;
} else if (!http_streq(parsed_url.scheme, HTTP_STR("http"))) {
// TODO
ERROR;
return;
}
@@ -304,7 +310,6 @@ void http_request_line(HTTP_RequestHandle handle, HTTP_Method method, HTTP_Strin
case HTTP_HOST_MODE_VOID:
// TODO
ERROR;
return;
}
+2 -2
View File
@@ -1,16 +1,16 @@
#include <stdio.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include <stdarg.h>
#include <assert.h> // TODO: remove some of these headers
#include <stdio.h>
#include <stddef.h>
#include <limits.h>
#include <stdint.h>
#include <string.h>
#include "basic.h"
#include "engine.h"
#include "byte_queue.h"
// This is the implementation of a byte queue useful
// for systems that need to process engs of bytes.
+17 -2
View File
@@ -1,15 +1,30 @@
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include "router.h"
#ifndef _WIN32
#ifdef _WIN32
#include <windows.h>
#endif
#ifdef __linux__
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#endif
#include "router.h"
bool is_alpha(char c)
{
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
bool is_digit(char c)
{
return c >= '0' && c <= '9';
}
typedef enum {
ROUTE_STATIC_DIR,
ROUTE_DYNAMIC,
+33 -23
View File
@@ -1,8 +1,20 @@
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#define POLL WSAPoll
#define CLOSE_SOCKET closesocket
#endif
#ifdef __linux__
#include <sys/socket.h>
#include <poll.h>
#include <stdlib.h>
#define CLOSE_SOCKET close
#endif
#include "engine.h"
#include "socket.h"
#include "server.h"
@@ -39,12 +51,12 @@ static int listen_socket(HTTP_String addr, uint16_t port, bool reuse_addr, int b
{
int flags = fcntl(listen_fd, F_GETFL, 0);
if (flags < 0) {
close(listen_fd);
CLOSE_SOCKET(listen_fd);
return -1;
}
if (fcntl(listen_fd, F_SETFL, flags | O_NONBLOCK) < 0) {
close(listen_fd);
CLOSE_SOCKET(listen_fd);
return -1;
}
}
@@ -61,7 +73,7 @@ static int listen_socket(HTTP_String addr, uint16_t port, bool reuse_addr, int b
_Static_assert(sizeof(struct in_addr) == sizeof(HTTP_IPv4));
if (http_parse_ipv4(addr.ptr, addr.len, (HTTP_IPv4*) &addr_buf) < 0) {
close(listen_fd);
CLOSE_SOCKET(listen_fd);
return -1;
}
}
@@ -71,12 +83,12 @@ static int listen_socket(HTTP_String addr, uint16_t port, bool reuse_addr, int b
bind_buf.sin_addr = addr_buf;
bind_buf.sin_port = htons(port);
if (bind(listen_fd, (struct sockaddr*) &bind_buf, sizeof(bind_buf)) < 0) {
close(listen_fd);
CLOSE_SOCKET(listen_fd);
return -1;
}
if (listen(listen_fd, backlog) < 0) {
close(listen_fd);
CLOSE_SOCKET(listen_fd);
return -1;
}
@@ -119,7 +131,7 @@ HTTP_Server *http_server_init_ex(HTTP_String addr, uint16_t port,
else {
if (socket_group_init_server(&server->group, cert_key, private_key) < 0) {
close(server->listen_fd);
CLOSE_SOCKET(server->listen_fd);
free(server);
return NULL;
}
@@ -127,7 +139,7 @@ HTTP_Server *http_server_init_ex(HTTP_String addr, uint16_t port,
server->secure_fd = listen_socket(addr, secure_port, reuse_addr, backlog);
if (server->secure_fd < 0) {
socket_group_free(&server->group);
close(server->listen_fd);
CLOSE_SOCKET(server->listen_fd);
free(server);
return NULL;
}
@@ -156,14 +168,14 @@ void http_server_free(HTTP_Server *server)
// TODO
}
close(server->secure_fd);
close(server->listen_fd);
CLOSE_SOCKET(server->secure_fd);
CLOSE_SOCKET(server->listen_fd);
if (server->secure_fd != -1)
socket_group_free(&server->group);
free(server);
}
int http_server_website(HTTP_Server *server, HTTP_String domain, HTTP_String cert_file, HTTP_String key_file)
int http_server_add_website(HTTP_Server *server, HTTP_String domain, HTTP_String cert_file, HTTP_String key_file)
{
return socket_group_add_domain(&server->group, domain, cert_file, key_file);
}
@@ -209,24 +221,21 @@ int http_server_wait(HTTP_Server *server, HTTP_Request **req, HTTP_ResponseHandl
for (int i = 0, j = 0; i < server->num_conns; i++) {
if (!server->conns[i].used)
Connection *conn = &server->conns[i];
if (!conn->used)
continue;
j++;
int events = 0;
if (server->conns[i].socket.ssl_ctx)
events = server->conns[i].socket.event;
else {
switch (http_engine_state(&server->conns[i].engine)) {
case HTTP_ENGINE_STATE_SERVER_RECV_BUF: events = POLLIN; break;
case HTTP_ENGINE_STATE_SERVER_SEND_BUF: events = POLLOUT; break;
default:break;
}
switch (conn->socket.event) {
case SOCKET_WANT_NONE: events = 0; break;
case SOCKET_WANT_READ: events = POLLIN; break;
case SOCKET_WANT_WRITE: events = POLLOUT; break;
}
if (events) {
polled[num_polled].fd = server->conns[i].socket.fd;
polled[num_polled].fd = conn->socket.fd;
polled[num_polled].events = events;
polled[num_polled].revents = 0;
indices[num_polled] = i;
@@ -235,7 +244,7 @@ int http_server_wait(HTTP_Server *server, HTTP_Request **req, HTTP_ResponseHandl
}
int timeout = -1;
poll(polled, num_polled, timeout);
POLL(polled, num_polled, timeout);
for (int i = 0; i < num_polled; i++) {
@@ -255,6 +264,7 @@ int http_server_wait(HTTP_Server *server, HTTP_Request **req, HTTP_ResponseHandl
server->conns[k].used = true;
socket_accept(&server->conns[k].socket, secure ? &server->group : NULL, new_fd);
http_engine_init(&server->conns[k].engine, 0, server_memfunc, NULL);
server->num_conns++;
}
+129 -27
View File
@@ -1,16 +1,17 @@
#include <poll.h>
#include <assert.h>
#include <assert.h> // TODO: organize these includes
#include "socket.h"
#ifdef HTTPS_ENABLED
#include <openssl/pem.h>
#include <openssl/conf.h>
#include <openssl/x509v3.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/bn.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
@@ -18,22 +19,34 @@
#include <fcntl.h>
#include <errno.h>
#ifdef _WIN32
#include <winsock2.h>
#endif
#ifdef __linux__
#include <netdb.h>
#endif
void socket_global_init(void)
{
#ifdef HTTPS_ENABLED
SSL_library_init();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
#endif
}
void socket_global_free(void)
{
#ifdef HTTPS_ENABLED
EVP_cleanup();
ERR_free_strings();
#endif
}
int socket_group_init(SocketGroup *group)
{
#ifdef HTTPS_ENABLED
SSL_CTX *ssl_ctx = SSL_CTX_new(TLS_client_method());
if (!ssl_ctx) {
fprintf(stderr, "Unable to create SSL context\n");
@@ -59,9 +72,13 @@ int socket_group_init(SocketGroup *group)
group->domains = NULL;
group->num_domains = 0;
group->max_domains = 0;
#else
(void) group;
#endif
return 0;
}
#ifdef HTTPS_ENABLED
static int servername_callback(SSL *ssl, int *ad, void *arg)
{
SocketGroup *group = arg;
@@ -80,9 +97,11 @@ static int servername_callback(SSL *ssl, int *ad, void *arg)
return SSL_TLSEXT_ERR_NOACK;
}
#endif
int socket_group_init_server(SocketGroup *group, HTTP_String cert_file, HTTP_String key_file)
{
#ifdef HTTPS_ENABLED
SSL_CTX *ssl_ctx = SSL_CTX_new(TLS_server_method());
if (!ssl_ctx) {
fprintf(stderr, "Unable to create server SSL context\n");
@@ -143,16 +162,27 @@ int socket_group_init_server(SocketGroup *group, HTTP_String cert_file, HTTP_Str
group->domains = NULL;
group->num_domains = 0;
group->max_domains = 0;
#else
(void) group;
if (cert_file.len > 0 || key_file.len > 0)
return -1;
#endif
return 0;
}
void socket_group_free(SocketGroup *group)
{
#ifdef HTTPS_ENABLED
SSL_CTX_free(group->ssl_ctx);
#else
(void) group;
#endif
}
int socket_group_add_domain(SocketGroup *group, HTTP_String domain, HTTP_String cert_file, HTTP_String key_file)
{
#ifdef HTTPS_ENABLED
if (group->num_domains == group->max_domains) {
int new_max_domains = 2 * group->max_domains;
@@ -236,6 +266,13 @@ int socket_group_add_domain(SocketGroup *group, HTTP_String domain, HTTP_String
domain_info->ssl_ctx = ssl_ctx;
group->num_domains++;
return 0;
#else
(void) group;
(void) domain;
(void) cert_file;
(void) key_file;
return -1;
#endif
}
SocketState socket_state(Socket *sock)
@@ -245,12 +282,20 @@ SocketState socket_state(Socket *sock)
void socket_accept(Socket *sock, SocketGroup *group, int fd)
{
#ifdef HTTPS_ENABLED
sock->ssl = NULL;
sock->ssl_ctx = group ? group->ssl_ctx : NULL;
#else
if (group) {
sock->state = SOCKET_STATE_DIED;
return;
}
#endif
// Initialize socket for server-side TLS handshake
sock->state = SOCKET_STATE_ACCEPTED; // TCP connection already established
sock->event = SOCKET_WANT_NONE;
sock->fd = fd;
sock->ssl = NULL;
sock->ssl_ctx = group ? group->ssl_ctx : NULL;
sock->addr_list = NULL;
sock->addr_count = 0;
sock->addr_cursor = 0;
@@ -258,7 +303,7 @@ void socket_accept(Socket *sock, SocketGroup *group, int fd)
sock->port = 0;
// Set non-blocking mode for the accepted socket
int flags = fcntl(fd, F_GETFL, 0);
int flags = fcntl(fd, F_GETFL, 0); // TODO: fail on error
if (flags >= 0) {
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
}
@@ -267,12 +312,20 @@ void socket_accept(Socket *sock, SocketGroup *group, int fd)
socket_update(sock);
}
void socket_connect(Socket *sock, SocketGroup *group, HTTP_String host, uint16_t port) {
void socket_connect(Socket *sock, SocketGroup *group, HTTP_String host, uint16_t port)
{
#ifdef HTTPS_ENABLED
sock->ssl = NULL;
sock->ssl_ctx = group ? group->ssl_ctx : NULL;
#else
if (group) {
sock->state = SOCKET_STATE_DIED;
return;
}
#endif
sock->state = SOCKET_STATE_PENDING;
sock->event = SOCKET_WANT_NONE;
sock->fd = -1;
sock->ssl = NULL;
sock->ssl_ctx = group ? group->ssl_ctx : NULL;
sock->addr_list = NULL;
sock->addr_count = 0;
sock->addr_cursor = 0;
@@ -322,12 +375,20 @@ void socket_connect(Socket *sock, SocketGroup *group, HTTP_String host, uint16_t
socket_update(sock);
}
void socket_connect_ipv4(Socket *sock, SocketGroup *group, HTTP_IPv4 addr, uint16_t port) {
void socket_connect_ipv4(Socket *sock, SocketGroup *group, HTTP_IPv4 addr, uint16_t port)
{
#ifdef HTTPS_ENABLED
sock->ssl = NULL;
sock->ssl_ctx = group ? group->ssl_ctx : NULL;
#else
if (group) {
sock->state = SOCKET_STATE_DIED;
return;
}
#endif
sock->state = SOCKET_STATE_PENDING;
sock->event = SOCKET_WANT_NONE;
sock->fd = -1;
sock->ssl = NULL;
sock->ssl_ctx = group ? group->ssl_ctx : NULL;
sock->addr_list = NULL;
sock->addr_count = 0;
sock->addr_cursor = 0;
@@ -343,12 +404,20 @@ void socket_connect_ipv4(Socket *sock, SocketGroup *group, HTTP_IPv4 addr, uint1
socket_update(sock);
}
void socket_connect_ipv6(Socket *sock, SocketGroup *group, HTTP_IPv6 addr, uint16_t port) {
void socket_connect_ipv6(Socket *sock, SocketGroup *group, HTTP_IPv6 addr, uint16_t port)
{
#ifdef HTTPS_ENABLED
sock->ssl = NULL;
sock->ssl_ctx = group ? group->ssl_ctx : NULL;
#else
if (group) {
sock->state = SOCKET_STATE_DIED;
return;
}
#endif
sock->state = SOCKET_STATE_PENDING;
sock->event = SOCKET_WANT_NONE;
sock->fd = -1;
sock->ssl = NULL;
sock->ssl_ctx = group ? group->ssl_ctx : NULL;
sock->addr_list = NULL;
sock->addr_count = 0;
sock->addr_cursor = 0;
@@ -364,6 +433,16 @@ void socket_connect_ipv6(Socket *sock, SocketGroup *group, HTTP_IPv6 addr, uint1
socket_update(sock);
}
bool socket_secure(Socket *sock)
{
#ifdef HTTPS_ENABLED
return sock->ssl_ctx != NULL;
#else
(void) sock;
return false;
#endif
}
void socket_update(Socket *sock)
{
sock->event = SOCKET_WANT_NONE;
@@ -376,10 +455,12 @@ void socket_update(Socket *sock)
switch (sock->state) {
case SOCKET_STATE_PENDING:
{
#ifdef HTTPS_ENABLED
if (sock->ssl) {
SSL_free(sock->ssl);
sock->ssl = NULL;
}
#endif
if (sock->fd != -1)
close(sock->fd);
@@ -485,11 +566,11 @@ void socket_update(Socket *sock)
case SOCKET_STATE_CONNECTED:
{
if (sock->ssl_ctx == NULL) {
if (!socket_secure(sock)) {
sock->event = SOCKET_WANT_NONE;
sock->state = SOCKET_STATE_ESTABLISHED_READY;
} else {
#ifdef HTTPS_ENABLED
// Start SSL handshake
if (!sock->ssl) {
sock->ssl = SSL_new(sock->ssl_ctx);
@@ -521,17 +602,20 @@ void socket_update(Socket *sock)
sock->event = SOCKET_WANT_NONE;
sock->state = SOCKET_STATE_PENDING;
again = true;
#else
HTTP_ASSERT(0);
#endif
}
}
break;
case SOCKET_STATE_ACCEPTED:
{
if (sock->ssl_ctx == NULL) {
if (!socket_secure(sock)) {
sock->event = SOCKET_WANT_NONE;
sock->state = SOCKET_STATE_ESTABLISHED_READY;
} else {
#ifdef HTTPS_ENABLED
// Start server-side SSL handshake
if (!sock->ssl) {
sock->ssl = SSL_new(sock->ssl_ctx);
@@ -560,6 +644,9 @@ void socket_update(Socket *sock)
// Server socket error - close the connection
sock->event = SOCKET_WANT_NONE;
sock->state = SOCKET_STATE_DIED;
#else
HTTP_ASSERT(0);
#endif
}
}
break;
@@ -573,11 +660,11 @@ void socket_update(Socket *sock)
case SOCKET_STATE_SHUTDOWN:
{
if (sock->ssl_ctx == NULL) {
if (!socket_secure(sock)) {
sock->event = SOCKET_WANT_NONE;
sock->state = SOCKET_STATE_DIED;
} else {
#ifdef HTTPS_ENABLED
int ret = SSL_shutdown(sock->ssl);
if (ret == 1) {
sock->event = SOCKET_WANT_NONE;
@@ -598,6 +685,9 @@ void socket_update(Socket *sock)
sock->event = SOCKET_WANT_NONE;
sock->state = SOCKET_STATE_DIED;
#else
HTTP_ASSERT(0);
#endif
}
}
break;
@@ -618,7 +708,7 @@ int socket_read(Socket *sock, char *dst, int max) {
return -1;
}
if (sock->ssl_ctx == NULL) {
if (!socket_secure(sock)) {
int ret = read(sock->fd, dst, max);
if (ret == 0) {
sock->event = SOCKET_WANT_NONE;
@@ -639,6 +729,7 @@ int socket_read(Socket *sock, char *dst, int max) {
}
return ret;
} else {
#ifdef HTTPS_ENABLED
int ret = SSL_read(sock->ssl, dst, max);
if (ret <= 0) {
int err = SSL_get_error(sock->ssl, ret);
@@ -657,6 +748,10 @@ int socket_read(Socket *sock, char *dst, int max) {
ret = 0;
}
return ret;
#else
HTTP_ASSERT(0);
return -1;
#endif
}
}
@@ -668,7 +763,7 @@ int socket_write(Socket *sock, char *src, int len) {
return 0;
}
if (sock->ssl_ctx == NULL) {
if (!socket_secure(sock)) {
int ret = write(sock->fd, src, len);
if (ret < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
@@ -684,6 +779,7 @@ int socket_write(Socket *sock, char *src, int len) {
}
return ret;
} else {
#ifdef HTTPS_ENABLED
int ret = SSL_write(sock->ssl, src, len);
if (ret <= 0) {
int err = SSL_get_error(sock->ssl, ret);
@@ -702,6 +798,9 @@ int socket_write(Socket *sock, char *src, int len) {
ret = 0;
}
return ret;
#else
HTTP_ASSERT(0);
#endif
}
}
@@ -712,20 +811,23 @@ void socket_close(Socket *sock) {
socket_update(sock);
}
void socket_free(Socket *sock) {
// Release all resources associated to the socket
if (sock->ssl) {
void socket_free(Socket *sock)
{
#ifdef HTTPS_ENABLED
if (sock->ssl)
SSL_free(sock->ssl);
sock->ssl = NULL;
}
#endif
if (sock->fd >= 0) {
close(sock->fd);
sock->fd = -1;
}
if (sock->hostname) {
free(sock->hostname);
sock->hostname = NULL;
}
if (sock->addr_list) {
free(sock->addr_list);
sock->addr_list = NULL;
+11 -2
View File
@@ -53,12 +53,15 @@
// which means the user needs to call socket_free to free the socket
// as it's not unusable.
#include <errno.h>
#include <stdint.h>
#include "parse.h"
#ifdef HTTPS_ENABLED
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/x509v3.h>
#endif
#include "parse.h"
typedef struct {
int is_ipv6;
@@ -89,8 +92,10 @@ typedef struct {
SocketState state;
SocketWantEvent event;
int fd;
#if HTTPS_ENABLED
SSL *ssl;
SSL_CTX *ssl_ctx;
#endif
AddrInfo *addr_list;
int addr_count;
int addr_cursor;
@@ -98,16 +103,20 @@ typedef struct {
uint16_t port;
} Socket;
#ifdef HTTPS_ENABLED
typedef struct {
char name[128];
SSL_CTX *ssl_ctx;
} Domain;
#endif
typedef struct {
#ifdef HTTPS_ENABLED
SSL_CTX *ssl_ctx;
int num_domains;
int max_domains;
Domain *domains;
#endif
} SocketGroup;
void socket_global_init (void);