diff options
| -rw-r--r-- | doc/man7/libweb_handler.7 | 17 | ||||
| -rw-r--r-- | handler.c | 2 | ||||
| -rw-r--r-- | include/libweb/handler.h | 1 | ||||
| -rw-r--r-- | include/libweb/server.h | 3 | ||||
| -rw-r--r-- | server.c | 16 |
5 files changed, 32 insertions, 7 deletions
diff --git a/doc/man7/libweb_handler.7 b/doc/man7/libweb_handler.7 index 4b0c454..5398675 100644 --- a/doc/man7/libweb_handler.7 +++ b/doc/man7/libweb_handler.7 @@ -77,6 +77,7 @@ struct handler_cfg void *\fIuser\fP; size_t \fImax_headers\fP; struct http_cfg_post \fIpost\fP; + unsigned \fIbacklog\fP; }; .EE .in @@ -96,6 +97,19 @@ object. See .IR libweb_http (7) for further reference about these members. +On the other hand, +.I backlog +is passed directly to the call to +.IR listen (2) +done internally by +.IR libweb , +and must not exceed +.IR INT_MAX . +If +.I backlog +equals zero, +it shall default to 10. + However, a .I "struct handler" object as returned by @@ -235,7 +249,8 @@ end: .BR handler_free (3), .BR handler_listen (3), .BR handler_loop (3), -.BR libweb_http (7). +.BR libweb_http (7), +.BR listen (2). .SH COPYRIGHT Copyright (C) 2023-2024 libweb contributors @@ -220,7 +220,7 @@ int handler_notify_close(struct handler *const h) int handler_listen(struct handler *const h, const unsigned short port, unsigned short *const outport) { - if (!(h->server = server_init(port, outport))) + if (!(h->server = server_init(port, outport, h->cfg.backlog))) { fprintf(stderr, "%s: server_init failed\n", __func__); return -1; diff --git a/include/libweb/handler.h b/include/libweb/handler.h index 7e0b601..97fdca0 100644 --- a/include/libweb/handler.h +++ b/include/libweb/handler.h @@ -15,6 +15,7 @@ struct handler_cfg void *user; size_t max_headers; struct http_cfg_post post; + unsigned backlog; }; struct handler *handler_alloc(const struct handler_cfg *cfg); diff --git a/include/libweb/server.h b/include/libweb/server.h index 08e0f34..42af6e6 100644 --- a/include/libweb/server.h +++ b/include/libweb/server.h @@ -4,7 +4,8 @@ #include <stdbool.h> #include <stddef.h> -struct server *server_init(unsigned short port, unsigned short *outport); +struct server *server_init(unsigned short port, unsigned short *outport, + unsigned backlog); struct server_client *server_poll(struct server *s, bool *io, bool *exit); int server_read(void *buf, size_t n, struct server_client *c); int server_write(const void *buf, size_t n, struct server_client *c); @@ -5,6 +5,7 @@ #include <poll.h> #include <unistd.h> #include <errno.h> +#include <limits.h> #include <stdbool.h> #include <stddef.h> #include <stdio.h> @@ -299,10 +300,13 @@ end: } struct server *server_init(const unsigned short port, - unsigned short *const outport) + unsigned short *const outport, const unsigned ubacklog) { struct server *const s = malloc(sizeof *s); int fds[2] = {-1, -1}, fd = -1; + /* Ensure default value if not set. */ + enum {QUEUE_LEN = 10}; + const unsigned backlog = ubacklog ? ubacklog : QUEUE_LEN; if (!s) { @@ -326,14 +330,18 @@ struct server *server_init(const unsigned short port, .sin_port = htons(port) }; - enum {QUEUE_LEN = 10}; - if (bind(fd, (const struct sockaddr *)&addr, sizeof addr)) { fprintf(stderr, "%s: bind(2): %s\n", __func__, strerror(errno)); goto failure; } - else if (listen(fd, QUEUE_LEN)) + else if (backlog > INT_MAX) + { + fprintf(stderr, "%s: backlog (%u) exceeds maximum (%d)\n", + __func__, backlog, INT_MAX); + goto failure; + } + else if (listen(fd, backlog)) { fprintf(stderr, "%s: listen(2): %s\n", __func__, strerror(errno)); goto failure; |
