summaryrefslogtreecommitdiff
path: root/src/daemontools-extras/s6-envdir.c
blob: 394253ebfd63a239da14323661b5ddaa901ab8db (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
37
38
39
40
/* ISC license. */

#include <errno.h>
#include <skalibs/sgetopt.h>
#include <skalibs/strerr2.h>
#include <skalibs/stralloc.h>
#include <skalibs/env.h>
#include <skalibs/djbunix.h>

#define USAGE "s6-envdir [ -I | -i ] [ -n ] [ -f ] [ -c nullchar ] dir prog..."

int main (int argc, char const *const *argv, char const *const *envp)
{
  stralloc modifs = STRALLOC_ZERO ;
  subgetopt_t l = SUBGETOPT_ZERO ;
  int insist = 1 ;
  unsigned int options = 0 ;
  char nullis = '\n' ;
  PROG = "s6-envdir" ;
  for (;;)
  {
    register int opt = subgetopt_r(argc, argv, "Iinfc:", &l) ;
    if (opt == -1) break ;
    switch (opt)
    {
      case 'I' : insist = 0 ; break ;
      case 'i' : insist = 1 ; break ;
      case 'n' : options |= SKALIBS_ENVDIR_NOCHOMP ; break ;
      case 'f' : options |= SKALIBS_ENVDIR_VERBATIM ; break ;
      case 'c' : nullis = *l.arg ; break ;
      default : strerr_dieusage(100, USAGE) ;
    }
  }
  argc -= l.ind ; argv += l.ind ;
  if (argc < 2) strerr_dieusage(100, USAGE) ;
  if ((envdir_internal(*argv++, &modifs, options, nullis) < 0) && (insist || (errno != ENOENT)))
    strerr_diefu1sys(111, "envdir") ;
  pathexec_r(argv, envp, env_len(envp), modifs.s, modifs.len) ;
  strerr_dieexec(111, argv[0]) ;
}