summaryrefslogtreecommitdiff
path: root/src/libexecline/el_substandrun_str.c
blob: f87bddf6374f384c7d610c22b7b481e7b770090f (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
/* ISC license. */

#include <sys/types.h>
#include <unistd.h>
#include <skalibs/djbunix.h>
#include <skalibs/env.h>
#include <skalibs/strerr2.h>
#include <skalibs/stralloc.h>
#include <skalibs/genalloc.h>
#include <execline/execline.h>
#include "exlsn.h"

void el_substandrun_str (stralloc *src, size_t srcbase, char const *const *envp, exlsn_t const *info)
{
  stralloc dst = STRALLOC_ZERO ;
  int r = el_substitute(&dst, src->s + srcbase, src->len, info->vars.s, info->values.s, genalloc_s(elsubst_t const, &info->data), genalloc_len(elsubst_t const, &info->data)) ;
  if (r < 0) strerr_diefu1sys(111, "el_substitute") ;
  if (!r) _exit(0) ;
  stralloc_free(src) ;
  {
    char const *v[r + 1] ;
    if (!env_make(v, r, dst.s, dst.len)) strerr_diefu1sys(111, "env_make") ;
    v[r] = 0 ;
    pathexec_r(v, envp, env_len(envp), info->modifs.s, info->modifs.len) ;
  }
  strerr_dieexec(111, dst.s) ;
}