summaryrefslogtreecommitdiff
path: root/src/tls/s6tls_ucspi_exec_app.c
blob: f4b52ef4c1b21ada66214773e12e269a08e1bdda (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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) ;
}