summaryrefslogtreecommitdiff
path: root/src/stls/stls_handshake.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/stls/stls_handshake.c')
-rw-r--r--src/stls/stls_handshake.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/stls/stls_handshake.c b/src/stls/stls_handshake.c
new file mode 100644
index 0000000..989a167
--- /dev/null
+++ b/src/stls/stls_handshake.c
@@ -0,0 +1,30 @@
+/* ISC license. */
+
+#include <signal.h>
+#include <unistd.h>
+
+#include <tls.h>
+
+#include <skalibs/alarm.h>
+#include <skalibs/strerr2.h>
+
+#include "stls-internal.h"
+
+#define diectx(e, ctx, s) strerr_diefu3x(e, (s), ": ", tls_error(ctx))
+
+static void alrm_handler (int sig)
+{
+ strerr_dief1x(98, "handshake timed out") ;
+}
+
+void stls_handshake (struct tls *ctx, tain_t const *tto)
+{
+ struct sigaction saold ;
+ struct sigaction sanew = { .sa_handler = &alrm_handler, .sa_flags = SA_RESTART, .sa_sigaction = 0 } ;
+ sigfillset(&sanew.sa_mask) ;
+ if (sigaction(SIGALRM, &sanew, &saold) < 0) strerr_diefu1sys(111, "sigaction") ;
+ if (!alarm_timeout(tto)) strerr_diefu1sys(111, "set an alarm") ;
+ if (tls_handshake(ctx) < 0) diectx(97, ctx, "tls_handshake") ;
+ alarm_disable() ;
+ sigaction(SIGALRM, &saold, 0) ;
+}