void runsv(int no, char *name) { int pid; if ((pid =fork()) == -1) { warn("unable to fork for ", name); return; } if (pid == 0) { /* child */ const char *prog[3]; prog[0] ="/sbin/runsv"; prog[1] =name; prog[2] =0; sig_uncatch(sig_hangup); sig_uncatch(sig_term); if (pgrp) setsid(); pathexec_run(*prog, prog, (const char* const*)environ); fatal("unable to start runsv ", name); } sv[no].pid =pid; }
int main (int argc, char const *const *argv, char const *const *envp) { unsigned int backlog = 20 ; int flagreuse = 1 ; PROG = "s6-ipcserver-socketbinder" ; { subgetopt_t l = SUBGETOPT_ZERO ; for (;;) { register int opt = subgetopt_r(argc, argv, "Ddb:", &l) ; if (opt == -1) break ; switch (opt) { case 'D' : flagreuse = 0 ; break ; case 'd' : flagreuse = 1 ; break ; case 'b' : if (!uint0_scan(l.arg, &backlog)) dieusage() ; break ; default : dieusage() ; } } argc -= l.ind ; argv += l.ind ; } if (argc < 2) dieusage() ; close(0) ; if (ipc_stream()) strerr_diefu1sys(111, "create socket") ; { mode_t m = umask(0) ; if ((flagreuse ? ipc_bind_reuse(0, argv[0]) : ipc_bind(0, argv[0])) < 0) strerr_diefu2sys(111, "bind to ", argv[0]) ; umask(m) ; } if (ipc_listen(0, backlog) < 0) strerr_diefu2sys(111, "listen to ", argv[0]) ; pathexec_run(argv[1], argv + 1, envp) ; strerr_dieexec(111, argv[1]) ; }
int main(int argc,const char *const *argv,const char *const *envp) { struct passwd *pw; const char *account; char strnum[FMT_ULONG]; account = *++argv; if (!account || !*++argv) usage(); pw = getpwnam(account); if (!pw) strerr_die3x(111,FATAL,"unknown account ",account); if (!pathexec_env("HOME",pw->pw_dir)) nomem(); if (!pathexec_env("SHELL",pw->pw_shell)) nomem(); if (!pathexec_env("USER",pw->pw_name)) nomem(); strnum[fmt_ulong(strnum,pw->pw_gid)] = 0; if (!pathexec_env("GID",strnum)) nomem(); strnum[fmt_ulong(strnum,pw->pw_uid)] = 0; if (!pathexec_env("UID",strnum)) nomem(); if (chdir(pw->pw_dir) != 0) strerr_die3sys(111,FATAL,"unable to chdir to ", pw->pw_dir); if (prot_gid(pw->pw_gid) == -1) strerr_die2sys(111,FATAL,"unable to setgid"); if (prot_gids(pw->pw_name, pw->pw_gid) == -1) strerr_die2sys(111,FATAL,"unable to initgroups"); if (prot_uid(pw->pw_uid) == -1) strerr_die2sys(111,FATAL,"unable to setuid"); pathexec_run(*argv,argv,envp); strerr_die3sys(111,FATAL,"unable to run ",*argv); }
int main (int argc, char const *const *argv, char const *const *envp) { int incr = 10 ; int strict = 0 ; PROG = "s6-nice" ; { subgetopt_t l = SUBGETOPT_ZERO ; for (;;) { register int opt = subgetopt_r(argc, argv, "Iin:", &l) ; if (opt == -1) break ; switch (opt) { case 'I' : strict = 0 ; break ; case 'i' : strict = 1 ; break ; case 'n': if (!int_scan(l.arg, &incr)) strerr_dieusage(100, USAGE) ; break ; default : strerr_dieusage(100, USAGE) ; } } argc -= l.ind ; argv += l.ind ; } if (!argc) strerr_dieusage(100, USAGE) ; errno = 0 ; if ((nice(incr) < 0) && errno) { char fmt[1+UINT_FMT] ; fmt[int_fmt(fmt, incr)] = 0 ; if (strict) strerr_diefu2sys(111, "nice to ", fmt) ; else strerr_warnwu2sys("nice to ", fmt) ; } pathexec_run(argv[0], argv, envp) ; strerr_dieexec((errno == ENOENT) ? 127 : 126, argv[0]) ; }
int main(int argc,char **argv,char **envp) { int piin[2]; int piout[2]; if (argc < 2) errint(EINVAL,"usage: fixcrio program [ arg ... ]"); if (pipe(piin) == -1) errint(errno,"unable to create pipe"); if (pipe(piout) == -1) errint(errno,"unable to create pipe"); switch(fork()) { case -1: errint(errno,"unable to fork"); case 0: sig_ignore(sig_pipe); close(piin[0]); close(piout[1]); doit(piin[1],piout[0]); } close(piin[1]); close(piout[0]); if (fd_move(0,piin[0]) == -1) errint(errno,"unable to move descriptors"); if (fd_move(1,piout[1]) == -1) errint(errno,"unable to move descriptors"); pathexec_run(argv[1],argv + 1,envp); errsys(errno); return(0); }
int main(int argc,const char * const *argv,const char * const *envp) { if (!argv[1]) strerr_die1x(100,"pgrphack: usage: pgrphack child"); setsid(); /* shouldn't fail; if it does, too bad */ pathexec_run(argv[1],argv + 1,envp); strerr_die4sys(111,"pgrphack: fatal: ","unable to run ",argv[1],": "); }
int main (int argc, char const *const *argv, char const *const *envp) { unsigned int len ; int fd; PROG = "cgjoin" ; if (argc < 3) strerr_dieusage(100, USAGE) ; len = strlen(argv[1]) ; { char path[len + PREFIXLEN + SUFFIXLEN + 1] ; char pid[UINT_FMT + 1] ; unsigned int k ; // format this program's PID as a string k = uint_fmt(pid, getpid()) ; pid[k++] = 0 ; // Build up the path to the cgrup filesystem memcpy(path, PREFIX, PREFIXLEN); memcpy(path + PREFIXLEN, argv[1], len); memcpy(path + PREFIXLEN + len, SUFFIX, SUFFIXLEN); path[PREFIXLEN + len + SUFFIXLEN] = 0 ; doparents(path); // Write the pid to the cgroup's tasks file if ((fd = open_write(path)) < 0) strerr_dief2x(100, "cannot open cgroup tasks file: ", path) ; fd_write(fd, pid, k) ; close(fd) ; } pathexec_run(argv[2], argv+2, envp) ; strerr_dieexec(111, argv[2]) ; }
int main (int argc, char *const *argv, char const *const *envp) { char const *newargv[argc + 7] ; unsigned int m = 0 ; unsigned int pos ; PROG = "s6-setuidgid" ; if (argc < 3) dieusage() ; argv++ ; pos = str_chr(argv[0], ':') ; if (argv[0][pos]) { argv[0][pos] = 0 ; newargv[m++] = S6_BINPREFIX "s6-applyuidgid" ; newargv[m++] = "-u" ; newargv[m++] = argv[0] ; newargv[m++] = "-g" ; newargv[m++] = argv[0] + pos + 1 ; newargv[m++] = "-G" ; newargv[m++] = "" ; argv++ ; } else { newargv[m++] = S6_BINPREFIX "s6-envuidgid" ; newargv[m++] = *argv++ ; newargv[m++] = S6_BINPREFIX "s6-applyuidgid" ; newargv[m++] = "-Uz" ; } newargv[m++] = "--" ; while (*argv) newargv[m++] = *argv++ ; newargv[m++] = 0 ; pathexec_run(newargv[0], newargv, envp) ; strerr_dieexec(111, newargv[0]) ; }
int main (int argc, char const *const *argv, char const *const *envp) { unsigned int fd ; int block = 1 ; PROG = "fdblock" ; { subgetopt_t l = SUBGETOPT_ZERO ; for (;;) { register int opt = subgetopt_r(argc, argv, "n", &l) ; if (opt == -1) break ; switch (opt) { case 'n' : block = 0 ; break ; default : strerr_dieusage(100, USAGE) ; } } argc -= l.ind ; argv += l.ind ; } if ((argc < 2) || !uint0_scan(argv[0], &fd)) strerr_dieusage(100, USAGE) ; if ((block ? ndelay_off(fd) : ndelay_on(fd)) < 0) strerr_diefu1sys(111, block ? "ndelay_off" : "ndelay_on") ; pathexec_run(argv[1], argv+1, envp) ; strerr_dieexec(111, argv[1]) ; }
int main(int argc,char **argv,char **envp) { int piin[2]; int piout[2]; pid[fmt_ulong(pid,getpid())] = 0; if (argc < 2) strerr_die1x(100,"recordio: usage: recordio program [ arg ... ]"); if (pipe(piin) == -1) strerr_die2sys(111,FATAL,"unable to create pipe: "); if (pipe(piout) == -1) strerr_die2sys(111,FATAL,"unable to create pipe: "); switch(fork()) { case -1: strerr_die2sys(111,FATAL,"unable to fork: "); case 0: sig_ignore(sig_pipe); close(piin[0]); close(piout[1]); doit(piin[1],piout[0]); } close(piin[1]); close(piout[0]); if (fd_move(0,piin[0]) == -1) strerr_die2sys(111,FATAL,"unable to move descriptors: "); if (fd_move(1,piout[1]) == -1) strerr_die2sys(111,FATAL,"unable to move descriptors: "); pathexec_run(argv[1],argv + 1,envp); strerr_die4sys(111,FATAL,"unable to run ",argv[1],": "); }
int main (int argc, char * const argv[], char const * const *envp) { PROG = "aa-ctty"; int fd = 0; int steal = 0; for (;;) { struct option longopts[] = { { "double-output", no_argument, NULL, 'D' }, { "fd", required_argument, NULL, 'f' }, { "help", no_argument, NULL, 'h' }, { "steal", no_argument, NULL, 's' }, { "version", no_argument, NULL, 'V' }, { NULL, 0, 0, 0 } }; int c; c = getopt_long (argc, argv, "+Df:hsV", longopts, NULL); if (c == -1) break; switch (c) { case 'D': aa_set_double_output (1); break; case 'f': if (!uint0_scan (optarg, &fd)) aa_strerr_diefu1sys (1, "set fd"); break; case 'h': dieusage (0); case 's': steal = 1; break; case 'V': aa_die_version (); default: dieusage (1); } } argc -= optind; argv += optind; if (argc == 0) dieusage (1); if (ioctl (fd, TIOCSCTTY, steal) < 0) aa_strerr_warnu1sys ("set controlling terminal"); pathexec_run (argv[0], (char const * const *) argv, envp); aa_strerr_dieexec (111, argv[0]); }
pid_t child_spawn1_internal (char const *prog, char const *const *argv, char const *const *envp, int *p, int to) { int e ; int syncp[2] ; pid_t pid ; if (coe(p[0]) < 0 || pipecoe(syncp) < 0) { e = errno ; fd_close(p[1]) ; fd_close(p[0]) ; errno = e ; return 0 ; } pid = fork() ; if (pid < 0) { e = errno ; fd_close(syncp[1]) ; fd_close(syncp[0]) ; fd_close(p[1]) ; fd_close(p[0]) ; errno = e ; return 0 ; } if (!pid) { fd_close(syncp[0]) ; fd_close(p[!(to & 1)]) ; if (fd_move(to & 1, p[to & 1]) < 0) goto err ; if ((to & 2) && (fd_copy(!(to & 1), to & 1) < 0)) goto err ; sig_blocknone() ; pathexec_run(prog, argv, envp) ; err: e = errno ; fd_write(syncp[1], (char *)&e, sizeof(e)) ; _exit(127) ; } fd_close(syncp[1]) ; fd_close(p[to & 1]) ; syncp[1] = fd_read(syncp[0], (char *)&e, sizeof(e)) ; if (syncp[1] < 0) { e = errno ; fd_close(syncp[0]) ; fd_close(p[!(to & 1)]) ; errno = e ; return 0 ; } fd_close(syncp[0]) ; if (syncp[1] == sizeof(e)) { fd_close(p[!(to & 1)]) ; wait_pid(pid, &syncp[1]) ; errno = e ; return 0 ; } return pid ; }
int main (int argc, char const *const *argv, char const *const *envp) { PROG = "cd" ; if (argc < 3) strerr_dieusage(100, USAGE) ; if (chdir(argv[1]) == -1) strerr_diefu2sys(111, "chdir to ", argv[1]) ; pathexec_run(argv[2], argv+2, envp) ; strerr_dieexec(111, argv[2]) ; }
int main(int argc, char **argv, char **envp) { if (!argv[0]) die_0(100); argv[0] = "curvecpmessage"; pathexec_run(*argv, argv, envp); die_5(111, "netcurvecpmessage: fatal: unable to run ", *argv, ": ", e_str(errno), "\n"); return 111; }
int main (int argc, char const *const *argv, char const *const *envp) { int fd, fd2 ; unsigned int flags = 0 ; int what = -1 ; int changemode = 0 ; PROG = "redirfd" ; { subgetopt_t l = SUBGETOPT_ZERO ; for (;;) { register int opt = subgetopt_r(argc, argv, "rwuacxnb", &l) ; if (opt == -1) break ; switch (opt) { case 'r' : what = O_RDONLY ; flags &= ~(O_APPEND|O_CREAT|O_TRUNC|O_EXCL) ; break ; case 'w' : what = O_WRONLY ; flags |= O_CREAT|O_TRUNC ; flags &= ~(O_APPEND|O_EXCL) ; break ; case 'u' : what = O_RDWR ; flags &= ~(O_APPEND|O_CREAT|O_TRUNC|O_EXCL) ; break ; case 'a' : what = O_WRONLY ; flags |= O_CREAT|O_APPEND ; flags &= ~(O_TRUNC|O_EXCL) ; break ; case 'c' : what = O_WRONLY ; flags |= O_APPEND ; flags &= ~(O_CREAT|O_TRUNC|O_EXCL) ; break ; case 'x' : what = O_WRONLY ; flags |= O_CREAT|O_EXCL ; flags &= ~(O_APPEND|O_TRUNC) ; break ; case 'n' : flags |= O_NONBLOCK ; break ; case 'b' : changemode = 1 ; break ; default : dieusage() ; } } argc -= l.ind ; argv += l.ind ; } if ((argc < 3) || (what == -1)) dieusage() ; if (!uint0_scan(argv[0], (unsigned int *)&fd)) dieusage() ; flags |= what ; fd2 = open3(argv[1], flags, 0666) ; if ((fd2 == -1) && (what == O_WRONLY) && (errno == ENXIO)) { register int e ; int fdr = open_read(argv[1]) ; if (fdr == -1) strerr_diefu2sys(111, "open_read ", argv[1]) ; fd2 = open3(argv[1], flags, 0666) ; e = errno ; fd_close(fdr) ; errno = e ; } if (fd2 == -1) strerr_diefu2sys(111, "open ", argv[1]) ; if (fd_move(fd, fd2) == -1) { char fmt[UINT_FMT] ; fmt[uint_fmt(fmt, fd2)] = 0 ; strerr_diefu4sys(111, "move fd ", fmt, " to fd ", argv[0]) ; } if (changemode) { if (((flags & O_NONBLOCK) ? ndelay_off(fd) : ndelay_on(fd)) < 0) strerr_diefu1sys(111, "change blocking mode") ; } pathexec_run(argv[2], argv+2, envp) ; strerr_dieexec(111, argv[2]) ; }
int main(int argc,char **argv,char **envp) { errmsg_iam("argv0"); if (argc < 3) { carp("usage: argv0", " realname program [ arg ... ]"); return 100; } pathexec_run(argv[1],argv + 2,envp); carp("unable to run ",argv[1],": ",error_string(table,errno)); return 111; }
int main(int argc, char **argv, char **envp) { if (!argv[0]) die_usage(); if (!argv[1]) die_usage(); if (str_equal(argv[1], "-h")) die_usage(); if (extremesandbox_droproot() == -1) die_fatal("unable to drop root privileges", 0); pathexec_run(argv[1], argv + 1, envp); die_fatal("unable to run", argv[1]); return 111; }
int main (int argc, char const *const *argv, char const *const *envp) { unsigned int timeout = 0 ; int dodelete = 0 ; PROG = "s6-fdholder-retrieve" ; { subgetopt_t l = SUBGETOPT_ZERO ; for (;;) { register int opt = subgetopt_r(argc, argv, "Dt:", &l) ; if (opt == -1) break ; switch (opt) { case 'D' : dodelete = 1 ; break ; case 't' : if (!uint0_scan(l.arg, &timeout)) dieusage() ; break ; default : dieusage() ; } } argc -= l.ind ; argv += l.ind ; if (argc < 3) dieusage() ; } { char const *newargv[13 + argc] ; unsigned int m = 0 ; char fmtt[UINT_FMT] ; newargv[m++] = S6_BINPREFIX "s6-ipcclient" ; newargv[m++] = "-l0" ; newargv[m++] = "--" ; newargv[m++] = *argv++ ; newargv[m++] = S6_BINPREFIX "s6-fdholder-retrievec" ; if (dodelete) newargv[m++] = "-D" ; if (timeout) { fmtt[uint_fmt(fmtt, timeout)] = 0 ; newargv[m++] = "-t" ; newargv[m++] = fmtt ; } newargv[m++] = "--" ; newargv[m++] = *argv++ ; newargv[m++] = EXECLINE_EXTBINPREFIX "fdclose" ; newargv[m++] = "6" ; newargv[m++] = EXECLINE_EXTBINPREFIX "fdclose" ; newargv[m++] = "7" ; while (*argv) newargv[m++] = *argv++ ; newargv[m++] = 0 ; pathexec_run(newargv[0], newargv, envp) ; strerr_dieexec(111, newargv[0]) ; } }
int main (int argc, char const *const *argv, char const *const *envp) { int df = 0 ; PROG = "heredoc" ; { subgetopt_t l = SUBGETOPT_ZERO ; for (;;) { register int opt = subgetopt_r(argc, argv, "d", &l) ; if (opt == -1) break ; switch (opt) { case 'd' : df = 1 ; break ; default : dieusage() ; } } argc -= l.ind ; argv += l.ind ; } if (argc < 3) dieusage() ; { int fd[2] ; unsigned int fdr ; int pid ; if (!uint0_scan(argv[0], &fdr)) strerr_dieusage(100, USAGE) ; if (pipe(fd) < 0) strerr_diefu1sys(111, "pipe") ; pid = df ? doublefork() : fork() ; switch (pid) { case -1: strerr_diefu2sys(111, df ? "double" : "", "fork") ; case 0: { unsigned int len = str_len(argv[1]) ; PROG = "heredoc (child)" ; fd_close(fd[0]) ; if (allwrite(fd[1], argv[1], len) < len) strerr_diefu1sys(111, "allwrite") ; return 0 ; } } fd_close(fd[1]) ; if (fd_move((int)fdr, fd[0]) == -1) strerr_diefu2sys(111, "read on fd ", argv[0]) ; } pathexec_run(argv[2], argv+2, envp) ; strerr_dieexec(111, argv[2]) ; }
void pathexec_env_run(const char *file, const char *const *argv) { const char **e; unsigned int elen; unsigned int i; unsigned int j; unsigned int split; unsigned int t; if (!stralloc_cats(&plus,"")) return; elen = 0; for (i = 0;environ[i];++i) ++elen; for (i = 0;i < plus.len;++i) if (!plus.s[i]) ++elen; e = (const char **) alloc((elen + 1) * sizeof(char *)); if (!e) return; elen = 0; for (i = 0;environ[i];++i) e[elen++] = environ[i]; j = 0; for (i = 0;i < plus.len;++i) if (!plus.s[i]) { split = str_chr(plus.s + j,'='); for (t = 0;t < elen;++t) if (byte_equal(plus.s + j,split,e[t])) if (e[t][split] == '=') { --elen; e[t] = e[elen]; break; } if (plus.s[j + split]) e[elen++] = plus.s + j; j = i + 1; } e[elen] = 0; pathexec_run(file,argv,e); alloc_free(e); }
int main(int argc,const char *const *argv,const char *const *envp) { account = *++argv; if (!account || !*++argv) strerr_die1x(100,"setuidgid: usage: setuidgid account child"); pw = getpwnam(account); if (!pw) strerr_die3x(111,FATAL,"unknown account ",account); if (prot_gid(pw->pw_gid) == -1) strerr_die2sys(111,FATAL,"unable to setgid: "); if (prot_uid(pw->pw_uid) == -1) strerr_die2sys(111,FATAL,"unable to setuid: "); pathexec_run(*argv,argv,envp); strerr_die4sys(111,FATAL,"unable to run ",*argv,": "); }
int main(int argc,const char * const *argv,const char * const *envp) { char ch; int wstat; int pi[2]; int i; int ignored; if (!argv[1]) strerr_die1x(100,"fghack: usage: fghack child"); if (pipe(pi) == -1) strerr_die2sys(111,FATAL,"unable to create pipe: "); switch(pid = fork()) { case -1: strerr_die2sys(111,FATAL,"unable to fork: "); case 0: close(pi[0]); for (i = 0;i < 30;++i) ignored = dup(pi[1]); pathexec_run(argv[1],argv + 1,envp); strerr_die4sys(111,FATAL,"unable to run ",argv[1],": "); } close(pi[1]); for (;;) { i = buffer_unixread(pi[0],&ch,1); if ((i == -1) && (errno == error_intr)) continue; if (i == 1) continue; break; } if (wait_pid(&wstat,pid) == -1) strerr_die2sys(111,FATAL,"wait failed: "); if (wait_crashed(wstat)) strerr_die2x(111,FATAL,"child crashed"); _exit(wait_exitcode(wstat)); }
static void trystart (unsigned int i, char const *name, int islog) { int pid = fork() ; switch (pid) { case -1 : tain_addsec_g(&services[i].restartafter[islog], CHECK_RETRY_TIMEOUT) ; strerr_warnwu2sys("fork for ", name) ; return ; case 0 : { char const *cargv[3] = { "s6-supervise", name, 0 } ; PROG = "s6-svscan (child)" ; selfpipe_finish() ; if (services[i].flaglog) if (fd_move(!islog, services[i].p[!islog]) == -1) strerr_diefu2sys(111, "set fds for ", name) ; pathexec_run(S6_BINPREFIX "s6-supervise", cargv, (char const **)environ) ; strerr_dieexec(111, S6_BINPREFIX "s6-supervise") ; } } services[i].pid[islog] = pid ; }
int main (int argc, char const *const *argv, char const *const *envp) { PROG = "s6-softlimit" ; for (;;) { register int opt = sgetopt(argc, argv, "a:c:d:f:l:m:o:p:r:s:t:") ; if (opt == -1) break ; switch (opt) { case 'a' : #ifdef RLIMIT_AS doit(RLIMIT_AS, subgetopt_here.arg) ; #endif #ifdef RLIMIT_VMEM doit(RLIMIT_VMEM, subgetopt_here.arg) ; #endif break ; case 'c' : #ifdef RLIMIT_CORE doit(RLIMIT_CORE, subgetopt_here.arg) ; #endif break ; case 'd' : #ifdef RLIMIT_DATA doit(RLIMIT_DATA, subgetopt_here.arg) ; #endif break ; case 'f' : #ifdef RLIMIT_FSIZE doit(RLIMIT_FSIZE, subgetopt_here.arg) ; #endif break ; case 'l' : #ifdef RLIMIT_MEMLOCK doit(RLIMIT_MEMLOCK, subgetopt_here.arg) ; #endif break ; case 'm' : #ifdef RLIMIT_DATA doit(RLIMIT_DATA, subgetopt_here.arg) ; #endif #ifdef RLIMIT_STACK doit(RLIMIT_STACK, subgetopt_here.arg) ; #endif #ifdef RLIMIT_MEMLOCK doit(RLIMIT_MEMLOCK, subgetopt_here.arg) ; #endif #ifdef RLIMIT_VMEM doit(RLIMIT_VMEM, subgetopt_here.arg) ; #endif #ifdef RLIMIT_AS doit(RLIMIT_AS, subgetopt_here.arg) ; #endif break ; case 'o' : #ifdef RLIMIT_NOFILE doit(RLIMIT_NOFILE, subgetopt_here.arg) ; #endif #ifdef RLIMIT_OFILE doit(RLIMIT_OFILE, subgetopt_here.arg) ; #endif break ; case 'p' : #ifdef RLIMIT_NPROC doit(RLIMIT_NPROC, subgetopt_here.arg) ; #endif break ; case 'r' : #ifdef RLIMIT_RSS doit(RLIMIT_RSS, subgetopt_here.arg) ; #endif break ; case 's' : #ifdef RLIMIT_STACK doit(RLIMIT_STACK, subgetopt_here.arg) ; #endif break ; case 't' : #ifdef RLIMIT_CPU doit(RLIMIT_CPU, subgetopt_here.arg) ; #endif break ; } } argc -= subgetopt_here.ind ; argv += subgetopt_here.ind ; if (!argc) strerr_dieusage(100, USAGE) ; pathexec_run(argv[0], argv, envp) ; strerr_dieexec(111, argv[0]) ; }
int main (int argc, char const *const *argv, char const *const *envp) { char const *def = 0 ; int insist = 0, chomp = 0 ; PROG = "backtick" ; { subgetopt_t l = SUBGETOPT_ZERO ; for (;;) { register int opt = subgetopt_r(argc, argv, "eniD:", &l) ; if (opt == -1) break ; switch (opt) { case 'e' : break ; /* compat */ case 'n' : chomp = 1 ; break ; case 'i' : insist = 1 ; break ; case 'D' : def = l.arg ; break ; default : dieusage() ; } } argc -= l.ind ; argv += l.ind ; } if (argc < 2) dieusage() ; if (!argv[0][0]) dieusage() ; if (!argv[1][0]) strerr_dief1x(100, "empty block") ; { unsigned int m = 0, i = 1 ; int fd = dup(0) ; char const *newargv[argc + 15] ; char fmt[UINT_FMT] ; if (fd < 0) { if (errno != EBADF) strerr_diefu1sys(111, "dup stdin") ; } else fmt[uint_fmt(fmt, (unsigned int)fd)] = 0 ; newargv[m++] = EXECLINE_BINPREFIX "pipeline" ; newargv[m++] = "--" ; while (argv[i] && argv[i][0] != EXECLINE_BLOCK_END_CHAR && (!EXECLINE_BLOCK_END_CHAR || (argv[i][0] && argv[i][1]))) newargv[m++] = argv[i++] ; if (!argv[i]) strerr_dief1x(100, "unterminated block") ; newargv[m++] = "" ; i++ ; newargv[m++] = EXECLINE_BINPREFIX "withstdinas" ; if (insist) newargv[m++] = "-i" ; if (chomp) newargv[m++] = "-n" ; if (def) { newargv[m++] = "-D" ; newargv[m++] = def ; } newargv[m++] = "-!" ; newargv[m++] = "--" ; newargv[m++] = argv[0] ; if (fd < 0) { newargv[m++] = EXECLINE_BINPREFIX "fdclose" ; newargv[m++] = "0" ; } else { newargv[m++] = EXECLINE_BINPREFIX "fdmove" ; newargv[m++] = "0" ; newargv[m++] = fmt ; } while (argv[i]) newargv[m++] = argv[i++] ; newargv[m++] = 0 ; pathexec_run(newargv[0], newargv, envp) ; strerr_dieexec(111, newargv[0]) ; } }
int main(int argc,const char *const *argv,const char *const *envp) { int opt; while ((opt = getopt(argc,argv,"a:c:d:f:l:m:o:p:r:s:t:")) != opteof) switch(opt) { case '?': die_usage(); case 'a': #ifdef RLIMIT_AS doit(RLIMIT_AS,optarg); #endif #ifdef RLIMIT_VMEM doit(RLIMIT_VMEM,optarg); #endif break; case 'c': #ifdef RLIMIT_CORE doit(RLIMIT_CORE,optarg); #endif break; case 'd': #ifdef RLIMIT_DATA doit(RLIMIT_DATA,optarg); #endif break; case 'f': #ifdef RLIMIT_FSIZE doit(RLIMIT_FSIZE,optarg); #endif break; case 'l': #ifdef RLIMIT_MEMLOCK doit(RLIMIT_MEMLOCK,optarg); #endif break; case 'm': #ifdef RLIMIT_DATA doit(RLIMIT_DATA,optarg); #endif #ifdef RLIMIT_STACK doit(RLIMIT_STACK,optarg); #endif #ifdef RLIMIT_MEMLOCK doit(RLIMIT_MEMLOCK,optarg); #endif #ifdef RLIMIT_VMEM doit(RLIMIT_VMEM,optarg); #endif #ifdef RLIMIT_AS doit(RLIMIT_AS,optarg); #endif break; case 'o': #ifdef RLIMIT_NOFILE doit(RLIMIT_NOFILE,optarg); #endif #ifdef RLIMIT_OFILE doit(RLIMIT_OFILE,optarg); #endif break; case 'p': #ifdef RLIMIT_NPROC doit(RLIMIT_NPROC,optarg); #endif break; case 'r': #ifdef RLIMIT_RSS doit(RLIMIT_RSS,optarg); #endif break; case 's': #ifdef RLIMIT_STACK doit(RLIMIT_STACK,optarg); #endif break; case 't': #ifdef RLIMIT_CPU doit(RLIMIT_CPU,optarg); #endif break; } argv += optind; if (!*argv) die_usage(); pathexec_run(*argv,argv,envp); strerr_die4sys(111,FATAL,"unable to run ",*argv,": "); }
int main (int argc, char const *const *argv, char const *const *envp) { char const *delim = DELIM_DEFAULT ; char const *codes = 0 ; int crunch = 0, chomp = 0, not = 1, par = 0 ; PROG = "forbacktickx" ; { subgetopt_t l = SUBGETOPT_ZERO ; for (;;) { register int opt = subgetopt_r(argc, argv, "epnCc0d:o:x:", &l) ; if (opt == -1) break ; switch (opt) { case 'e' : break ; /* compat */ case 'p' : par = 1 ; break ; case 'n' : chomp = 1 ; break ; case 'C' : crunch = 1 ; break ; case 'c' : crunch = 0 ; break ; case '0' : delim = 0 ; break ; case 'd' : delim = l.arg ; break ; case 'o' : { unsigned short okcodes[256] ; unsigned int nbc ; if (!ushort_scanlist(okcodes, 256, l.arg, &nbc)) dieusage() ; codes = l.arg ; not = 0 ; break ; } case 'x' : { unsigned short okcodes[256] ; unsigned int nbc ; if (!ushort_scanlist(okcodes, 256, l.arg, &nbc)) dieusage() ; codes = l.arg ; not = 1 ; break ; } default : dieusage() ; } } argc -= l.ind ; argv += l.ind ; } if (argc < 2) dieusage() ; if (!argv[0][0]) dieusage() ; if (!argv[1][0]) strerr_dief1x(100, "empty block") ; { unsigned int m = 0, i = 1 ; int fd = dup(0) ; char const *newargv[argc + 18] ; char fmt[UINT_FMT] ; if (fd < 0) { if (errno != EBADF) strerr_diefu1sys(111, "dup stdin") ; } else fmt[uint_fmt(fmt, (unsigned int)fd)] = 0 ; newargv[m++] = EXECLINE_BINPREFIX "pipeline" ; newargv[m++] = "--" ; while (argv[i] && argv[i][0] != EXECLINE_BLOCK_END_CHAR && (!EXECLINE_BLOCK_END_CHAR || (argv[i][0] && argv[i][1]))) newargv[m++] = argv[i++] ; if (!argv[i]) strerr_dief1x(100, "unterminated block") ; newargv[m++] = "" ; i++ ; newargv[m++] = EXECLINE_BINPREFIX "unexport" ; newargv[m++] = "!" ; newargv[m++] = EXECLINE_BINPREFIX "forstdin" ; if (par) newargv[m++] = "-p" ; if (chomp) newargv[m++] = "-n" ; if (crunch) newargv[m++] = "-C" ; if (!delim) newargv[m++] = "-0" ; else if (str_diff(delim, DELIM_DEFAULT)) { newargv[m++] = "-d" ; newargv[m++] = delim ; } if (codes) { newargv[m++] = not ? "-x" : "-o" ; newargv[m++] = codes ; } newargv[m++] = "--" ; newargv[m++] = argv[0] ; if (fd < 0) { newargv[m++] = EXECLINE_BINPREFIX "fdclose" ; newargv[m++] = "0" ; } else { newargv[m++] = EXECLINE_BINPREFIX "fdmove" ; newargv[m++] = "0" ; newargv[m++] = fmt ; } while (argv[i]) newargv[m++] = argv[i++] ; newargv[m++] = 0 ; pathexec_run(newargv[0], newargv, envp) ; strerr_dieexec(111, newargv[0]) ; } }
int main (int argc, char const *const *argv, char const *const *envp) { iopause_fd x[2] = { { -1, IOPAUSE_READ, 0 }, { -1, IOPAUSE_READ, 0 } } ; struct taia deadline, tto ; ftrigr_t a = FTRIGR_ZERO ; int pid ; uint16 id ; PROG = "s6-ftrig-listen1" ; { unsigned int t = 0 ; for (;;) { register int opt = subgetopt(argc, argv, "t:") ; if (opt == -1) break ; switch (opt) { case 't' : if (uint0_scan(subgetopt_here.arg, &t)) break ; default : strerr_dieusage(100, USAGE) ; } } if (t) taia_from_millisecs(&tto, t) ; else tto = infinitetto ; argc -= subgetopt_here.ind ; argv += subgetopt_here.ind ; } if (argc < 3) strerr_dieusage(100, USAGE) ; taia_now_g() ; taia_add_g(&deadline, &tto) ; if (!ftrigr_startf_g(&a, &deadline)) strerr_diefu1sys(111, "ftrigr_startf") ; id = ftrigr_subscribe_g(&a, argv[0], argv[1], 0, &deadline) ; if (!id) strerr_diefu4sys(111, "subscribe to ", argv[0], " with regexp ", argv[1]) ; x[0].fd = selfpipe_init() ; if (x[0].fd < 0) strerr_diefu1sys(111, "selfpipe_init") ; if (selfpipe_trap(SIGCHLD) < 0) strerr_diefu1sys(111, "selfpipe_trap") ; if (sig_ignore(SIGPIPE) < 0) strerr_diefu1sys(111, "sig_ignore") ; x[1].fd = ftrigr_fd(&a) ; pid = fork() ; switch (pid) { case -1 : strerr_diefu1sys(111, "fork") ; case 0 : { PROG = "s6-ftrig-listen1 (child)" ; pathexec_run(argv[2], argv+2, envp) ; strerr_dieexec(111, argv[2]) ; } } for (;;) { char dummy ; register int r = ftrigr_check(&a, id, &dummy) ; if (r < 0) strerr_diefu1sys(111, "ftrigr_check") ; if (r) break ; r = iopause_g(x, 2, &deadline) ; if (r < 0) strerr_diefu1sys(111, "iopause") ; else if (!r) { errno = ETIMEDOUT ; strerr_diefu1sys(1, "get expected event") ; } if (x[0].revents & IOPAUSE_READ) handle_signals() ; if (x[1].revents & IOPAUSE_READ) { if (ftrigr_update(&a) < 0) strerr_diefu1sys(111, "ftrigr_update") ; } } return 0 ; }
int main (int argc, char const *const *argv, char const *const *envp) { unsigned int nb = 0, ex = 1 ; unsigned int timeout = 0 ; PROG = "s6-setlock" ; for (;;) { register int opt = subgetopt(argc, argv, "nNrwt:") ; if (opt == -1) break ; switch (opt) { case 'n' : nb = 1 ; break ; case 'N' : nb = 0 ; break ; case 'r' : ex = 0 ; break ; case 'w' : ex = 1 ; break ; case 't' : if (!uint0_scan(subgetopt_here.arg, &timeout)) dieusage() ; nb = 2 ; break ; default : dieusage() ; } } argc -= subgetopt_here.ind ; argv += subgetopt_here.ind ; if (argc < 2) dieusage() ; if (nb < 2) { int fd = open_create(argv[0]) ; if (fd == -1) strerr_diefu2sys(111, "open_create ", argv[0]) ; if ((*f[ex][nb])(fd) == -1) strerr_diefu2sys(1, "lock ", argv[0]) ; } else { char const *cargv[3] = { "s6lockd-helper", argv[0], 0 } ; char const *cenvp[2] = { ex ? "S6LOCK_EX=1" : 0, 0 } ; iopause_fd x = { .events = IOPAUSE_READ } ; tain_t deadline ; int p[2] ; unsigned int pid ; char c ; tain_now_g() ; tain_from_millisecs(&deadline, timeout) ; tain_add_g(&deadline, &deadline) ; pid = child_spawn(S6_LIBEXECPREFIX "s6lockd-helper", cargv, cenvp, p, 2) ; if (!pid) strerr_diefu2sys(111, "spawn ", S6_LIBEXECPREFIX "s6lockd-helper") ; x.fd = p[0] ; for (;;) { register int r = iopause_g(&x, 1, &deadline) ; if (r < 0) strerr_diefu1sys(111, "iopause") ; if (!r) { kill(pid, SIGTERM) ; errno = ETIMEDOUT ; strerr_diefu1sys(1, "acquire lock") ; } r = sanitize_read(fd_read(p[0], &c, 1)) ; if (r < 0) strerr_diefu1sys(111, "read ack from helper") ; if (r) break ; } if (c != '!') strerr_dief1x(111, "helper sent garbage ack") ; fd_close(p[0]) ; if (uncoe(p[1]) < 0) strerr_diefu1sys(111, "uncoe fd to helper") ; } pathexec_run(argv[1], argv+1, envp) ; strerr_dieexec(111, argv[1]) ; }
int main (int argc, char const *const *argv, char const *const *envp) { unsigned int kbufsz = 65536, verbosity = 1 ; char const *linevar = 0 ; char const *targ = 0 ; PROG = "s6-devd" ; { subgetopt_t l = SUBGETOPT_ZERO ; for (;;) { register int opt = subgetopt_r(argc, argv, "qvb:l:t:", &l) ; if (opt == -1) break ; switch (opt) { case 'q' : if (verbosity) verbosity-- ; break ; case 'v' : verbosity++ ; break ; case 'b' : if (!uint0_scan(l.arg, &kbufsz)) dieusage() ; break ; case 'l' : linevar = l.arg ; break ; case 't' : if (!check_targ(l.arg)) dieusage() ; targ = l.arg ; break ; default : dieusage() ; } } argc -= l.ind ; argv += l.ind ; } if (!argc) strerr_dieusage(100, USAGE) ; { unsigned int m = 0, pos = 0 ; char fmt[UINT_FMT * 3] ; char const *newargv[argc + 15] ; newargv[m++] = S6_LINUX_UTILS_BINPREFIX "s6-uevent-listener" ; if (verbosity != 1) { newargv[m++] = "-v" ; newargv[m++] = fmt + pos ; pos += uint_fmt(fmt + pos, verbosity) ; fmt[pos++] = 0 ; } if (kbufsz != 65536) { newargv[m++] = "-b" ; newargv[m++] = fmt + pos ; pos += uint_fmt(fmt + pos, kbufsz) ; fmt[pos++] = 0 ; } newargv[m++] = "--" ; newargv[m++] = S6_LINUX_UTILS_BINPREFIX "s6-uevent-spawner" ; if (verbosity != 1) { newargv[m++] = "-v" ; newargv[m++] = fmt + pos ; pos += uint_fmt(fmt + pos, verbosity) ; fmt[pos++] = 0 ; } if (linevar) { newargv[m++] = "-l" ; newargv[m++] = linevar ; } if (targ) { newargv[m++] = "-t" ; newargv[m++] = targ ; } newargv[m++] = "--" ; while (*argv) newargv[m++] = *argv++ ; newargv[m++] = 0 ; pathexec_run(newargv[0], newargv, envp) ; strerr_dieexec(111, newargv[0]) ; } }