aboutsummaryrefslogtreecommitdiff
path: root/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils.c')
-rw-r--r--utils.c48
1 files changed, 30 insertions, 18 deletions
diff --git a/utils.c b/utils.c
index 50f57a1..5d831f1 100644
--- a/utils.c
+++ b/utils.c
@@ -24,24 +24,6 @@
#include <openssl/x509_vfy.h>
#include <openssl/x509v3.h>
-static sigset_t set;
-
-void
-block_signals(void)
-{
- sigset_t new;
-
- sigemptyset(&new);
- sigaddset(&new, SIGHUP);
- sigprocmask(SIG_BLOCK, &new, &set);
-}
-
-void
-unblock_signals(void)
-{
- sigprocmask(SIG_SETMASK, &set, NULL);
-}
-
int
starts_with(const char *str, const char *prefix)
{
@@ -248,3 +230,33 @@ end:
X509_STORE_CTX_free(ctx);
return ret;
}
+
+void
+dispatch_imsg(struct imsgbuf *ibuf, imsg_handlerfn **handlers, size_t size)
+{
+ struct imsg imsg;
+ size_t datalen, i;
+ ssize_t n;
+
+ if ((n = imsg_read(ibuf)) == -1) {
+ if (errno == EAGAIN || errno == EWOULDBLOCK)
+ return;
+ _exit(1);
+ }
+
+ if (n == 0)
+ _exit(1);
+
+ for (;;) {
+ if ((n = imsg_get(ibuf, &imsg)) == -1)
+ _exit(1);
+ if (n == 0)
+ return;
+ datalen = imsg.hdr.len - IMSG_HEADER_SIZE;
+ i = imsg.hdr.type;
+ if (i > (size / sizeof(imsg_handlerfn*)) || handlers[i] == NULL)
+ abort();
+ handlers[i](ibuf, &imsg, datalen);
+ imsg_free(&imsg);
+ }
+}