From 98f5f52461b0c1ab1ee3331722bd32e2db9e1d41 Mon Sep 17 00:00:00 2001 From: Xavier Del Campo Date: Thu, 16 Nov 2023 12:23:08 +0100 Subject: [PATCH] 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. --- handler.c | 10 ++++++++-- include/libweb/handler.h | 4 +++- include/libweb/server.h | 2 +- server.c | 6 ++++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/handler.c b/handler.c index f6e47a3..4abbdb8 100644 --- a/handler.c +++ b/handler.c @@ -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 #include -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); diff --git a/server.c b/server.c index 8cea044..d460155 100644 --- a/server.c +++ b/server.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: