aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Del Campo <xavier.delcampo@midokura.com>2023-11-16 12:23:08 +0100
committerXavier Del Campo <xavier.delcampo@midokura.com>2023-11-20 16:06:19 +0100
commit98f5f52461b0c1ab1ee3331722bd32e2db9e1d41 (patch)
tree9ef7ad87da6f857af6e82e1067c4ffb83a795035
parent8280cc40b94a89fc4d22a1954478a7a55da2800c (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.c10
-rw-r--r--include/libweb/handler.h4
-rw-r--r--include/libweb/server.h2
-rw-r--r--server.c6
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 <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);
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: