From b87a78a02391ac468a4dcfe83b7143e14de1041a Mon Sep 17 00:00:00 2001 From: Francesco Cozzuto Date: Wed, 26 Nov 2025 23:51:24 +0100 Subject: [PATCH] Add proxy example (draft) --- .gitignore | 2 + Makefile | 4 +- chttp.c | 77 +++++++++------------ chttp.h | 14 ++-- examples/proxy.c | 146 +++++++++++++++++++++++++++++++++++++++ examples/simple_client.c | 6 +- examples/simple_server.c | 6 +- misc/TODO.txt | 1 + src/client.c | 25 +++---- src/client.h | 6 +- src/parse.c | 9 ++- src/server.c | 21 ++---- src/server.h | 6 +- src/socket.c | 22 +++--- src/socket.h | 2 +- 15 files changed, 229 insertions(+), 118 deletions(-) create mode 100644 examples/proxy.c diff --git a/.gitignore b/.gitignore index 77f1b92..e116812 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ simple_client simple_client.exe simple_server simple_server.exe +proxy +proxy.exe diff --git a/Makefile b/Makefile index 561a726..8747734 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ endif .PHONY: all clean example -all: chttp.c chttp.h simple_client$(EXT) simple_server$(EXT) +all: chttp.c chttp.h simple_client$(EXT) simple_server$(EXT) proxy$(EXT) chttp.c chttp.h: $(wildcard src/*.c src/*.h) misc/amalg.py Makefile python misc/amalg.py @@ -26,4 +26,4 @@ chttp.c chttp.h: $(wildcard src/*.c src/*.h) misc/amalg.py Makefile gcc $< chttp.c -o $@ $(CFLAGS) $(LFLAGS) clean: - rm chttp.c chttp.h simple_client simple_client.exe simple_server simple_server.exe + rm chttp.c chttp.h simple_client simple_client.exe simple_server simple_server.exe proxy proxy.exe diff --git a/chttp.c b/chttp.c index c4a4f88..26e3b52 100644 --- a/chttp.c +++ b/chttp.c @@ -1199,12 +1199,11 @@ static int parse_response(Scanner *s, HTTP_Response *res) || !is_digit(s->src[s->cur+2]) || s->src[s->cur+3] != ' ') return -1; - s->cur += 5; - res->status = - (s->src[s->cur-2] - '0') * 1 + - (s->src[s->cur-3] - '0') * 10 + - (s->src[s->cur-4] - '0') * 100; + (s->src[s->cur+0] - '0') * 100 + + (s->src[s->cur+1] - '0') * 10 + + (s->src[s->cur+2] - '0') * 1; + s->cur += 4; // Parse reason phrase: HTAB / SP / VCHAR / obs-text // Note: obs-text (obsolete text, octets 0x80-0xFF) is not validated @@ -2708,16 +2707,16 @@ static Socket *handle_to_socket(SocketManager *sm, SocketHandle handle) int socket_manager_translate_events( SocketManager *sm, SocketEvent *events, - EventRegister *reg) + EventRegister reg) { int num_events = 0; - for (int i = 0; i < reg->num_polled; i++) { + for (int i = 0; i < reg.num_polled; i++) { - if (!reg->polled[i].revents) + if (!reg.polled[i].revents) continue; - if (reg->polled[i].fd == sm->plain_sock || - reg->polled[i].fd == sm->secure_sock) { + if (reg.polled[i].fd == sm->plain_sock || + reg.polled[i].fd == sm->secure_sock) { // We only listen for input events from the listener // if the socket pool isn't fool. This ensures that @@ -2733,7 +2732,7 @@ int socket_manager_translate_events( // Determine whether the event came from // the encrypted listener or not. - bool secure = (reg->polled[i].fd == sm->secure_sock); + bool secure = (reg.polled[i].fd == sm->secure_sock); Socket *s = sm->sockets; while (s->state != SOCKET_STATE_FREE) { @@ -2741,7 +2740,7 @@ int socket_manager_translate_events( assert(s - sm->sockets < + sm->max_used); } - NATIVE_SOCKET sock = accept(reg->polled[i].fd, NULL, NULL); + NATIVE_SOCKET sock = accept(reg.polled[i].fd, NULL, NULL); if (sock == NATIVE_SOCKET_INVALID) continue; @@ -2774,7 +2773,7 @@ int socket_manager_translate_events( sm->num_used++; - } else if (reg->polled[i].fd == sm->wait_sock) { + } else if (reg.polled[i].fd == sm->wait_sock) { // Consume one byte from the wakeup signal char byte; @@ -2785,10 +2784,8 @@ int socket_manager_translate_events( #endif } else { - - Socket *s = reg->ptrs[i]; - if (reg->polled[i].revents) - socket_update(s); + Socket *s = reg.ptrs[i]; + socket_update(s); } } @@ -3850,6 +3847,12 @@ void http_request_builder_target(HTTP_RequestBuilder builder, if (conn->state != HTTP_CLIENT_CONN_WAIT_URL) return; // Request line already written + if (url.len == 0) { + conn->state = HTTP_CLIENT_CONN_COMPLETE; + conn->result = HTTP_ERROR_BADURL; + return; + } + // Allocate a copy of the URL string so the parsed // URL pointers remain valid char *url_copy = malloc(url.len); @@ -4124,14 +4127,11 @@ void http_client_register_events(HTTP_Client *client, socket_manager_register_events(&client->sockets, reg); } -int http_client_process_events(HTTP_Client *client, - EventRegister *reg) +void http_client_process_events(HTTP_Client *client, + EventRegister reg) { SocketEvent events[HTTP_CLIENT_CAPACITY]; - int ret = socket_manager_translate_events(&client->sockets, events, reg); - if (ret < 0) - return ret; - int num_events = ret; + int num_events = socket_manager_translate_events(&client->sockets, events, reg); for (int i = 0; i < num_events; i++) { @@ -4253,8 +4253,6 @@ int http_client_process_events(HTTP_Client *client, client->num_ready++; } } - - return HTTP_OK; } bool http_client_next_response(HTTP_Client *client, @@ -4311,7 +4309,7 @@ void http_free_response(HTTP_Response *response) #define POLL poll #endif -int http_client_wait_response(HTTP_Client *client, +void http_client_wait_response(HTTP_Client *client, int *result, void **user, HTTP_Response **response) { for (;;) { @@ -4325,15 +4323,11 @@ int http_client_wait_response(HTTP_Client *client, if (reg.num_polled > 0) POLL(reg.polled, reg.num_polled, -1); - int ret = http_client_process_events(client, ®); - if (ret < 0) - return ret; + http_client_process_events(client, reg); if (http_client_next_response(client, result, user, response)) break; } - - return HTTP_OK; } //////////////////////////////////////////////////////////////////////////////////////// @@ -4558,14 +4552,11 @@ http_server_conn_process_events(HTTP_Server *server, HTTP_ServerConn *conn) } } -int http_server_process_events(HTTP_Server *server, - EventRegister *reg) +void http_server_process_events(HTTP_Server *server, + EventRegister reg) { SocketEvent events[HTTP_SERVER_CAPACITY]; - int ret = socket_manager_translate_events(&server->sockets, events, reg); - if (ret < 0) - return ret; - int num_events = ret; + int num_events = socket_manager_translate_events(&server->sockets, events, reg); for (int i = 0; i < num_events; i++) { @@ -4606,8 +4597,6 @@ int http_server_process_events(HTTP_Server *server, http_server_conn_process_events(server, conn); } } - - return HTTP_OK; } bool http_server_next_request(HTTP_Server *server, @@ -4626,7 +4615,7 @@ bool http_server_next_request(HTTP_Server *server, return true; } -int http_server_wait_request(HTTP_Server *server, +void http_server_wait_request(HTTP_Server *server, HTTP_Request **request, HTTP_ResponseBuilder *builder) { for (;;) { @@ -4639,15 +4628,11 @@ int http_server_wait_request(HTTP_Server *server, if (reg.num_polled > 0) POLL(reg.polled, reg.num_polled, -1); - int ret = http_server_process_events(server, ®); - if (ret < 0) - return ret; + http_server_process_events(server, reg); if (http_server_next_request(server, request, builder)) break; } - - return HTTP_OK; } // Get a connection pointer from a response builder. @@ -4836,7 +4821,7 @@ void http_response_builder_body(HTTP_ResponseBuilder builder, HTTP_String str) if (conn == NULL) return; - if (conn->state != HTTP_SERVER_CONN_WAIT_HEADER) { + if (conn->state == HTTP_SERVER_CONN_WAIT_HEADER) { append_special_headers(conn); conn->state = HTTP_SERVER_CONN_WAIT_BODY; } diff --git a/chttp.h b/chttp.h index 791da8c..35b089d 100644 --- a/chttp.h +++ b/chttp.h @@ -619,7 +619,7 @@ void socket_manager_register_events(SocketManager *sm, // socket structs provided to the socket manager // via the init function. int socket_manager_translate_events(SocketManager *sm, - SocketEvent *events, EventRegister *reg); + SocketEvent *events, EventRegister reg); typedef enum { CONNECT_TARGET_NAME, @@ -1037,8 +1037,8 @@ void http_client_register_events(HTTP_Client *client, // The caller has waited for poll() to return and some // I/O events to be triggered, so now the HTTP client // can continue its buffering and flushing operations. -int http_client_process_events(HTTP_Client *client, - EventRegister *reg); +void http_client_process_events(HTTP_Client *client, + EventRegister reg); // After some I/O events were processes, some responses // may be availabe. This function returns one of the @@ -1051,7 +1051,7 @@ bool http_client_next_response(HTTP_Client *client, int *result, void **user, HTTP_Response **response); // TODO: comment -int http_client_wait_response(HTTP_Client *client, +void http_client_wait_response(HTTP_Client *client, int *result, void **user, HTTP_Response **response); // Free a response object. You can't access its fields @@ -1248,8 +1248,8 @@ void http_server_register_events(HTTP_Server *server, // The caller has waited for poll() to return and some // I/O events to be triggered, so now the HTTP server // can continue its buffering and flushing operations. -int http_server_process_events(HTTP_Server *server, - EventRegister *reg); +void http_server_process_events(HTTP_Server *server, + EventRegister reg); typedef struct { HTTP_Server *server; @@ -1269,7 +1269,7 @@ bool http_server_next_request(HTTP_Server *server, HTTP_Request **request, HTTP_ResponseBuilder *builder); // TODO: comment -int http_server_wait_request(HTTP_Server *server, +void http_server_wait_request(HTTP_Server *server, HTTP_Request **request, HTTP_ResponseBuilder *builder); // This function is called to set the status code of diff --git a/examples/proxy.c b/examples/proxy.c new file mode 100644 index 0000000..f6bde9b --- /dev/null +++ b/examples/proxy.c @@ -0,0 +1,146 @@ + +#ifdef _WIN32 +#include +#define POLL WSAPoll +#else +#include +#define POLL poll +#endif + +#include "../chttp.h" + +int main() +{ + int ret; + + HTTP_String remote = HTTP_STR("http://coz.is"); + + HTTP_Client client; + ret = http_client_init(&client); + if (ret < 0) { + printf("Couldn't initialize client (%s)\n", http_strerror(ret)); + return -1; + } + + HTTP_Server server; + ret = http_server_init(&server); + if (ret < 0) { + fprintf(stderr, "Couldn't initialize server (%s)\n", http_strerror(ret)); + return -1; + } + + http_server_set_reuse_addr(&server, true); + http_server_set_trace_bytes(&server, true); + + ret = http_server_listen_tcp(&server, HTTP_STR("127.0.0.1"), 8080); + if (ret < 0) { + fprintf(stderr, "Couldn't start listening (%s)\n", http_strerror(ret)); + return -1; + } + + bool used[HTTP_SERVER_CAPACITY]; + for (int i = 0; i < HTTP_SERVER_CAPACITY; i++) + used[i] = false; + + HTTP_ResponseBuilder pending[HTTP_SERVER_CAPACITY]; + int num_pending = 0; + + for (;;) { + + #define POLL_CAPACITY (HTTP_CLIENT_POLL_CAPACITY + HTTP_SERVER_POLL_CAPACITY) + + void *ptrs[POLL_CAPACITY]; + struct pollfd polled[POLL_CAPACITY]; + + EventRegister server_reg = { + ptrs, + polled, + 0 + }; + http_server_register_events(&server, &server_reg); + + EventRegister client_reg = { + ptrs + server_reg.num_polled, + polled + server_reg.num_polled, + 0 + }; + http_client_register_events(&client, &client_reg); + + if (server_reg.num_polled > 0 || + client_reg.num_polled > 0) { + int num_polled = server_reg.num_polled + + client_reg.num_polled; + POLL(polled, num_polled, -1); + } + + int result; + void *user; + HTTP_Response *response; + http_client_process_events(&client, client_reg); + while (http_client_next_response(&client, &result, &user, &response)) { + + HTTP_ResponseBuilder *builder = (HTTP_ResponseBuilder*) user; + + int i = builder - pending; + assert(i > -1); + assert(i < HTTP_SERVER_CAPACITY); + + if (result == HTTP_OK) { + http_response_builder_status(*builder, response->status); + http_response_builder_body(*builder, response->body); + http_response_builder_send(*builder); + } else { + http_response_builder_status(*builder, 500); + http_response_builder_send(*builder); + } + + used[i] = false; + num_pending--; + } + + HTTP_Request *request; + HTTP_ResponseBuilder response_builder; + http_server_process_events(&server, server_reg); + while (http_server_next_request(&server, &request, &response_builder)) { + + int i = 0; + while (used[i]) { + i++; + assert(i < HTTP_SERVER_CAPACITY); + } + + HTTP_String path = request->url.path; + if (path.len == 0) + path = HTTP_STR("/"); + + char target[1<<10]; + int target_len = snprintf(target, sizeof(target), + "%.*s%.*s", HTTP_UNPACK(remote), HTTP_UNPACK(path)); + if (target_len < 0 || target_len >= (int) sizeof(target)) { + http_response_builder_status(response_builder, 500); + http_response_builder_send(response_builder); + continue; + } + + HTTP_RequestBuilder request_builder = http_client_get_builder(&client); + http_request_builder_set_user(request_builder, &pending[i]); + http_request_builder_trace(request_builder, true); + http_request_builder_method(request_builder, request->method); + http_request_builder_target(request_builder, (HTTP_String) { target, target_len }); + ret = http_request_builder_send(request_builder); + if (ret < 0) { + http_response_builder_status(response_builder, 500); + http_response_builder_send(response_builder); + continue; + } + + used[i] = true; + pending[i] = response_builder; + num_pending++; + } + } + + http_server_free(&server); + http_client_free(&client); + return 0; +} diff --git a/examples/simple_client.c b/examples/simple_client.c index b4149a9..1a31362 100644 --- a/examples/simple_client.c +++ b/examples/simple_client.c @@ -26,11 +26,7 @@ int main(void) int result; void *user; HTTP_Response *response; - ret = http_client_wait_response(&client, &result, &user, &response); - if (ret < 0) { - printf("Couldn't wait for response (%s)\n", http_strerror(ret)); - return -1; - } + http_client_wait_response(&client, &result, &user, &response); if (result == HTTP_OK) { printf("Received %d bytes\n", response->body.len); diff --git a/examples/simple_server.c b/examples/simple_server.c index 9004399..9a34ffa 100644 --- a/examples/simple_server.c +++ b/examples/simple_server.c @@ -24,11 +24,7 @@ int main(void) HTTP_Request *request; HTTP_ResponseBuilder builder; - int ret = http_server_wait_request(&server, &request, &builder); - if (ret < 0) { - fprintf(stderr, "Couldn't wait for request (%s)\n", http_strerror(ret)); - return -1; - } + http_server_wait_request(&server, &request, &builder); http_response_builder_status(builder, 200); http_response_builder_body(builder, HTTP_STR("Hello, world!")); diff --git a/misc/TODO.txt b/misc/TODO.txt index 74b8dda..bef0ac2 100644 --- a/misc/TODO.txt +++ b/misc/TODO.txt @@ -1,2 +1,3 @@ - Add connection timeouts - Per RFC 6265, cookie values can be quoted. This parser would include the quotes in the value. +- Make sure that the proxy example doesn't stall diff --git a/src/client.c b/src/client.c index abb057d..6c5544c 100644 --- a/src/client.c +++ b/src/client.c @@ -225,6 +225,12 @@ void http_request_builder_target(HTTP_RequestBuilder builder, if (conn->state != HTTP_CLIENT_CONN_WAIT_URL) return; // Request line already written + if (url.len == 0) { + conn->state = HTTP_CLIENT_CONN_COMPLETE; + conn->result = HTTP_ERROR_BADURL; + return; + } + // Allocate a copy of the URL string so the parsed // URL pointers remain valid char *url_copy = malloc(url.len); @@ -499,14 +505,11 @@ void http_client_register_events(HTTP_Client *client, socket_manager_register_events(&client->sockets, reg); } -int http_client_process_events(HTTP_Client *client, - EventRegister *reg) +void http_client_process_events(HTTP_Client *client, + EventRegister reg) { SocketEvent events[HTTP_CLIENT_CAPACITY]; - int ret = socket_manager_translate_events(&client->sockets, events, reg); - if (ret < 0) - return ret; - int num_events = ret; + int num_events = socket_manager_translate_events(&client->sockets, events, reg); for (int i = 0; i < num_events; i++) { @@ -628,8 +631,6 @@ int http_client_process_events(HTTP_Client *client, client->num_ready++; } } - - return HTTP_OK; } bool http_client_next_response(HTTP_Client *client, @@ -686,7 +687,7 @@ void http_free_response(HTTP_Response *response) #define POLL poll #endif -int http_client_wait_response(HTTP_Client *client, +void http_client_wait_response(HTTP_Client *client, int *result, void **user, HTTP_Response **response) { for (;;) { @@ -700,13 +701,9 @@ int http_client_wait_response(HTTP_Client *client, if (reg.num_polled > 0) POLL(reg.polled, reg.num_polled, -1); - int ret = http_client_process_events(client, ®); - if (ret < 0) - return ret; + http_client_process_events(client, reg); if (http_client_next_response(client, result, user, response)) break; } - - return HTTP_OK; } diff --git a/src/client.h b/src/client.h index 5c73bee..0b49316 100644 --- a/src/client.h +++ b/src/client.h @@ -203,8 +203,8 @@ void http_client_register_events(HTTP_Client *client, // The caller has waited for poll() to return and some // I/O events to be triggered, so now the HTTP client // can continue its buffering and flushing operations. -int http_client_process_events(HTTP_Client *client, - EventRegister *reg); +void http_client_process_events(HTTP_Client *client, + EventRegister reg); // After some I/O events were processes, some responses // may be availabe. This function returns one of the @@ -217,7 +217,7 @@ bool http_client_next_response(HTTP_Client *client, int *result, void **user, HTTP_Response **response); // TODO: comment -int http_client_wait_response(HTTP_Client *client, +void http_client_wait_response(HTTP_Client *client, int *result, void **user, HTTP_Response **response); // Free a response object. You can't access its fields diff --git a/src/parse.c b/src/parse.c index 5373e9a..50364af 100644 --- a/src/parse.c +++ b/src/parse.c @@ -1073,12 +1073,11 @@ static int parse_response(Scanner *s, HTTP_Response *res) || !is_digit(s->src[s->cur+2]) || s->src[s->cur+3] != ' ') return -1; - s->cur += 5; - res->status = - (s->src[s->cur-2] - '0') * 1 + - (s->src[s->cur-3] - '0') * 10 + - (s->src[s->cur-4] - '0') * 100; + (s->src[s->cur+0] - '0') * 100 + + (s->src[s->cur+1] - '0') * 10 + + (s->src[s->cur+2] - '0') * 1; + s->cur += 4; // Parse reason phrase: HTAB / SP / VCHAR / obs-text // Note: obs-text (obsolete text, octets 0x80-0xFF) is not validated diff --git a/src/server.c b/src/server.c index 7b3ef39..6a0bb6c 100644 --- a/src/server.c +++ b/src/server.c @@ -217,14 +217,11 @@ http_server_conn_process_events(HTTP_Server *server, HTTP_ServerConn *conn) } } -int http_server_process_events(HTTP_Server *server, - EventRegister *reg) +void http_server_process_events(HTTP_Server *server, + EventRegister reg) { SocketEvent events[HTTP_SERVER_CAPACITY]; - int ret = socket_manager_translate_events(&server->sockets, events, reg); - if (ret < 0) - return ret; - int num_events = ret; + int num_events = socket_manager_translate_events(&server->sockets, events, reg); for (int i = 0; i < num_events; i++) { @@ -265,8 +262,6 @@ int http_server_process_events(HTTP_Server *server, http_server_conn_process_events(server, conn); } } - - return HTTP_OK; } bool http_server_next_request(HTTP_Server *server, @@ -285,7 +280,7 @@ bool http_server_next_request(HTTP_Server *server, return true; } -int http_server_wait_request(HTTP_Server *server, +void http_server_wait_request(HTTP_Server *server, HTTP_Request **request, HTTP_ResponseBuilder *builder) { for (;;) { @@ -298,15 +293,11 @@ int http_server_wait_request(HTTP_Server *server, if (reg.num_polled > 0) POLL(reg.polled, reg.num_polled, -1); - int ret = http_server_process_events(server, ®); - if (ret < 0) - return ret; + http_server_process_events(server, reg); if (http_server_next_request(server, request, builder)) break; } - - return HTTP_OK; } // Get a connection pointer from a response builder. @@ -495,7 +486,7 @@ void http_response_builder_body(HTTP_ResponseBuilder builder, HTTP_String str) if (conn == NULL) return; - if (conn->state != HTTP_SERVER_CONN_WAIT_HEADER) { + if (conn->state == HTTP_SERVER_CONN_WAIT_HEADER) { append_special_headers(conn); conn->state = HTTP_SERVER_CONN_WAIT_BODY; } diff --git a/src/server.h b/src/server.h index a8f706a..1cf22f9 100644 --- a/src/server.h +++ b/src/server.h @@ -185,8 +185,8 @@ void http_server_register_events(HTTP_Server *server, // The caller has waited for poll() to return and some // I/O events to be triggered, so now the HTTP server // can continue its buffering and flushing operations. -int http_server_process_events(HTTP_Server *server, - EventRegister *reg); +void http_server_process_events(HTTP_Server *server, + EventRegister reg); typedef struct { HTTP_Server *server; @@ -206,7 +206,7 @@ bool http_server_next_request(HTTP_Server *server, HTTP_Request **request, HTTP_ResponseBuilder *builder); // TODO: comment -int http_server_wait_request(HTTP_Server *server, +void http_server_wait_request(HTTP_Server *server, HTTP_Request **request, HTTP_ResponseBuilder *builder); // This function is called to set the status code of diff --git a/src/socket.c b/src/socket.c index a7103c9..4d93a52 100644 --- a/src/socket.c +++ b/src/socket.c @@ -777,16 +777,16 @@ static Socket *handle_to_socket(SocketManager *sm, SocketHandle handle) int socket_manager_translate_events( SocketManager *sm, SocketEvent *events, - EventRegister *reg) + EventRegister reg) { int num_events = 0; - for (int i = 0; i < reg->num_polled; i++) { + for (int i = 0; i < reg.num_polled; i++) { - if (!reg->polled[i].revents) + if (!reg.polled[i].revents) continue; - if (reg->polled[i].fd == sm->plain_sock || - reg->polled[i].fd == sm->secure_sock) { + if (reg.polled[i].fd == sm->plain_sock || + reg.polled[i].fd == sm->secure_sock) { // We only listen for input events from the listener // if the socket pool isn't fool. This ensures that @@ -802,7 +802,7 @@ int socket_manager_translate_events( // Determine whether the event came from // the encrypted listener or not. - bool secure = (reg->polled[i].fd == sm->secure_sock); + bool secure = (reg.polled[i].fd == sm->secure_sock); Socket *s = sm->sockets; while (s->state != SOCKET_STATE_FREE) { @@ -810,7 +810,7 @@ int socket_manager_translate_events( assert(s - sm->sockets < + sm->max_used); } - NATIVE_SOCKET sock = accept(reg->polled[i].fd, NULL, NULL); + NATIVE_SOCKET sock = accept(reg.polled[i].fd, NULL, NULL); if (sock == NATIVE_SOCKET_INVALID) continue; @@ -843,7 +843,7 @@ int socket_manager_translate_events( sm->num_used++; - } else if (reg->polled[i].fd == sm->wait_sock) { + } else if (reg.polled[i].fd == sm->wait_sock) { // Consume one byte from the wakeup signal char byte; @@ -854,10 +854,8 @@ int socket_manager_translate_events( #endif } else { - - Socket *s = reg->ptrs[i]; - if (reg->polled[i].revents) - socket_update(s); + Socket *s = reg.ptrs[i]; + socket_update(s); } } diff --git a/src/socket.h b/src/socket.h index 6de5ba0..4838e31 100644 --- a/src/socket.h +++ b/src/socket.h @@ -289,7 +289,7 @@ void socket_manager_register_events(SocketManager *sm, // socket structs provided to the socket manager // via the init function. int socket_manager_translate_events(SocketManager *sm, - SocketEvent *events, EventRegister *reg); + SocketEvent *events, EventRegister reg); typedef enum { CONNECT_TARGET_NAME,