summaryrefslogtreecommitdiff
path: root/src/tls/s6tls_ucspi_exec_app.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tls/s6tls_ucspi_exec_app.c')
-rw-r--r--src/tls/s6tls_ucspi_exec_app.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/tls/s6tls_ucspi_exec_app.c b/src/tls/s6tls_ucspi_exec_app.c
new file mode 100644
index 0000000..f4b52ef
--- /dev/null
+++ b/src/tls/s6tls_ucspi_exec_app.c
@@ -0,0 +1,36 @@
+/* ISC license. */
+
+#include <stdint.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <skalibs/posixplz.h>
+#include <skalibs/types.h>
+#include <skalibs/env.h>
+#include <skalibs/djbunix.h>
+
+#include "s6tls-internal.h"
+
+void s6tls_ucspi_exec_app (char const *const *argv, int const p[4][2], uint32_t options)
+{
+ size_t m = 0 ;
+ char modif[sizeof(s6tls_envvars) + 33 + 3 * UINT_FMT] ;
+ close(p[2][1]) ;
+ close(p[1][1]) ;
+ close(p[0][0]) ;
+ if (options & 1)
+ {
+ memcpy(modif + m, s6tls_envvars, sizeof(s6tls_envvars)) ;
+ m += sizeof(s6tls_envvars) ;
+ }
+ memcpy(modif + m, "SSLCTLFD=", 9) ; m += 9 ;
+ m += uint_fmt(modif + m, p[2][0]) ;
+ modif[m++] = 0 ;
+ memcpy(modif + m, "SSLREADFD=", 10) ; m += 10 ;
+ m += uint_fmt(modif + m, p[1][0]) ;
+ modif[m++] = 0 ;
+ memcpy(modif + m, "SSLWRITEFD=", 11) ; m += 11 ;
+ m += uint_fmt(modif + m, p[0][1]) ;
+ modif[m++] = 0 ;
+ xpathexec_r(argv, (char const *const *)environ, env_len((char const* const *)environ), modif, m) ;
+}