aboutsummaryrefslogtreecommitdiff
path: root/examples/headers
diff options
context:
space:
mode:
Diffstat (limited to 'examples/headers')
-rw-r--r--examples/headers/main.c75
1 files changed, 69 insertions, 6 deletions
diff --git a/examples/headers/main.c b/examples/headers/main.c
index 51d622a..a4eb5e6 100644
--- a/examples/headers/main.c
+++ b/examples/headers/main.c
@@ -1,10 +1,21 @@
+/* As of FreeBSD 13.2, sigaction(2) still conforms to IEEE Std
+ * 1003.1-1990 (POSIX.1), which did not define SA_RESTART.
+ * FreeBSD supports it as an extension, but then _POSIX_C_SOURCE must
+ * not be defined. */
+#ifndef __FreeBSD__
+#define _POSIX_C_SOURCE 200809L
+#endif
+
#include <dynstr.h>
#include <libweb/handler.h>
#include <libweb/html.h>
#include <libweb/http.h>
+#include <errno.h>
+#include <signal.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
static const size_t max_headers = 5;
@@ -41,6 +52,59 @@ static int on_length(const unsigned long long len,
return 1;
}
+struct handler *handler;
+
+static void handle_signal(const int signum)
+{
+ switch (signum)
+ {
+ case SIGINT:
+ /* Fall through. */
+ case SIGTERM:
+ handler_notify_close(handler);
+ break;
+
+ default:
+ break;
+ }
+}
+
+static int init_signals(void)
+{
+ struct sigaction sa =
+ {
+ .sa_handler = handle_signal,
+ .sa_flags = SA_RESTART
+ };
+
+ sigemptyset(&sa.sa_mask);
+
+ static const struct signal
+ {
+ int signal;
+ const char *name;
+ } signals[] =
+ {
+ {.signal = SIGINT, .name = "SIGINT"},
+ {.signal = SIGTERM, .name = "SIGTERM"},
+ {.signal = SIGPIPE, .name = "SIGPIPE"}
+ };
+
+ for (size_t i = 0; i < sizeof signals / sizeof *signals; i++)
+ {
+ const struct signal *const s = &signals[i];
+
+ if (sigaction(s->signal, &sa, NULL))
+ {
+ fprintf(stderr, "%s: sigaction(2) %s: %s\n",
+ __func__, s->name, strerror(errno));
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
int main(int argc, char *argv[])
{
int ret = EXIT_FAILURE;
@@ -50,17 +114,16 @@ int main(int argc, char *argv[])
.max_headers = max_headers
};
- struct handler *const h = handler_alloc(&cfg);
static const char *const urls[] = {"/", "/index.html"};
- if (!h)
+ if (!(handler = handler_alloc(&cfg)))
{
fprintf(stderr, "%s: handler_alloc failed\n", __func__);
goto end;
}
for (size_t i = 0; i < sizeof urls / sizeof *urls; i++)
- if (handler_add(h, urls[i], HTTP_OP_GET, hello, NULL))
+ if (handler_add(handler, urls[i], HTTP_OP_GET, hello, NULL))
{
fprintf(stderr, "%s: handler_add failed\n", __func__);
goto end;
@@ -68,7 +131,7 @@ int main(int argc, char *argv[])
unsigned short port;
- if (handler_listen(h, 0, &port))
+ if (handler_listen(handler, 0, &port))
{
fprintf(stderr, "%s: handler_listen failed\n", __func__);
goto end;
@@ -76,7 +139,7 @@ int main(int argc, char *argv[])
printf("Listening on port %hu\n", port);
- if (handler_loop(h))
+ if (handler_loop(handler))
{
fprintf(stderr, "%s: handler_loop failed\n", __func__);
goto end;
@@ -85,6 +148,6 @@ int main(int argc, char *argv[])
ret = EXIT_SUCCESS;
end:
- handler_free(h);
+ handler_free(handler);
return ret;
}