diff options
| author | Xavier Del Campo <xavier.delcampo@midokura.com> | 2023-11-16 12:23:08 +0100 |
|---|---|---|
| committer | Xavier Del Campo <xavier.delcampo@midokura.com> | 2023-11-20 16:06:19 +0100 |
| commit | 98f5f52461b0c1ab1ee3331722bd32e2db9e1d41 (patch) | |
| tree | 9ef7ad87da6f857af6e82e1067c4ffb83a795035 | |
| parent | 8280cc40b94a89fc4d22a1954478a7a55da2800c (diff) | |
Split handler_loop from handler_listen
Some applications might set up a struct handler object to listen on any
port i.e., 0, but still need a way to determine which port number was
eventually selected by the implementation.
Therefore, handler_listen has been reduced to the server initialization
bit, whereas the main loop has been split into its own function, namely
handler_loop.
Because of these changes, it no longer made sense for libweb to write
the selected port to standard output, as this is something now
applications can do on their own.
| -rw-r--r-- | handler.c | 10 | ||||
| -rw-r--r-- | include/libweb/handler.h | 4 | ||||
| -rw-r--r-- | include/libweb/server.h | 2 | ||||
| -rw-r--r-- | server.c | 6 |
4 files changed, 16 insertions, 6 deletions
@@ -182,14 +182,20 @@ end: return ret; } -int handler_listen(struct handler *const h, const unsigned short port) +int handler_listen(struct handler *const h, const unsigned short port, + unsigned short *const outport) { - if (!(h->server = server_init(port))) + if (!(h->server = server_init(port, outport))) { fprintf(stderr, "%s: server_init failed\n", __func__); return -1; } + return 0; +} + +int handler_loop(struct handler *const h) +{ for (;;) { bool exit, io; diff --git a/include/libweb/handler.h b/include/libweb/handler.h index f7bc76a..493e24c 100644 --- a/include/libweb/handler.h +++ b/include/libweb/handler.h @@ -20,6 +20,8 @@ struct handler *handler_alloc(const struct handler_cfg *cfg); void handler_free(struct handler *h); int handler_add(struct handler *h, const char *url, enum http_op op, handler_fn f, void *user); -int handler_listen(struct handler *h, unsigned short port); +int handler_listen(struct handler *h, unsigned short port, + unsigned short *outport); +int handler_loop(struct handler *h); #endif /* HANDLER_H */ diff --git a/include/libweb/server.h b/include/libweb/server.h index 74f06ae..b3691aa 100644 --- a/include/libweb/server.h +++ b/include/libweb/server.h @@ -4,7 +4,7 @@ #include <stdbool.h> #include <stddef.h> -struct server *server_init(unsigned short port); +struct server *server_init(unsigned short port, unsigned short *outport); 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); @@ -320,7 +320,8 @@ static int init_signals(void) return 0; } -struct server *server_init(const unsigned short port) +struct server *server_init(const unsigned short port, + unsigned short *const outport) { struct server *const s = malloc(sizeof *s); @@ -373,8 +374,9 @@ struct server *server_init(const unsigned short port) fprintf(stderr, "%s: getsockname(2): %s\n", __func__, strerror(errno)); goto failure; } + else if (outport) + *outport = ntohs(in.sin_port); - printf("Listening on port %hu\n", ntohs(in.sin_port)); return s; failure: |
