diff options
Diffstat (limited to 'src/init')
-rw-r--r-- | src/init/s6-linux-init-maker.c | 50 | ||||
-rw-r--r-- | src/init/s6-linux-init.c | 16 |
2 files changed, 36 insertions, 30 deletions
diff --git a/src/init/s6-linux-init-maker.c b/src/init/s6-linux-init-maker.c index 48c95c6..ede9a52 100644 --- a/src/init/s6-linux-init-maker.c +++ b/src/init/s6-linux-init-maker.c @@ -22,7 +22,7 @@ #include "defaults.h" #include "initctl.h" -#define USAGE "s6-linux-init-maker [ -c basedir ] [ -b execline_bindir ] [ -u log_uid -g log_gid | -U ] [ -G early_getty_cmd ] [ -r ] [ -L ] [ -p initial_path ] [ -m initial_umask ] [ -t timestamp_style ] [ -d slashdev ] [ -s env_store ] [ -e initial_envvar ... ] [ -q default_grace_time ] dir" +#define USAGE "s6-linux-init-maker [ -c basedir ] [ -b execline_bindir ] [ -u log_uid -g log_gid | -U ] [ -G early_getty_cmd ] [ -1 ] [ -L ] [ -p initial_path ] [ -m initial_umask ] [ -t timestamp_style ] [ -d slashdev ] [ -s env_store ] [ -e initial_envvar ... ] [ -q default_grace_time ] dir" #define dieusage() strerr_dieusage(100, USAGE) #define dienomem() strerr_diefu1sys(111, "stralloc_catb") ; @@ -48,7 +48,7 @@ static gid_t uncaught_logs_gid = 0 ; static unsigned int initial_umask = 0022 ; static unsigned int timestamp_style = 1 ; static unsigned int finalsleep = 3000 ; -static int redirect_stage2 = 0 ; +static int console = 0 ; static int logouthookd = 0 ; typedef int writetobuf_func_t (buffer *, void *) ; @@ -102,19 +102,31 @@ static int s6_svscan_log_script (buffer *b, void *data) { char fmt[UINT64_FMT] ; (void)data ; - return put_shebang(b) - && buffer_puts(b, - "redirfd -w 2 /dev/console\n" - "redirfd -w 1 /dev/null\n" - "redirfd -rnb 0 " LOGGER_FIFO "\n" - "s6-applyuidgid -u ") >= 0 - && buffer_put(b, fmt, uid_fmt(fmt, uncaught_logs_uid)) >= 0 - && buffer_puts(b, " -g ") >= 0 - && buffer_put(b, fmt, gid_fmt(fmt, uncaught_logs_gid)) >= 0 - && buffer_puts(b, " --\ns6-log -bpd3 -- ") >= 0 - && buffer_puts(b, timestamp_style & 1 ? "t " : "") >= 0 - && buffer_puts(b, timestamp_style & 2 ? "T " : "") >= 0 - && buffer_puts(b, S6_LINUX_INIT_TMPFS "/" UNCAUGHT_DIR "\n") >= 0 ; + if (!put_shebang(b) + || buffer_puts(b, + "redirfd -w 2 /dev/console\n" + "redirfd -w 1 /dev/") < 0 + || buffer_puts(b, console ? "console" : "null") < 0 + || buffer_puts(b, "\n" + "redirfd -rnb 0 " LOGGER_FIFO "\n" + "s6-applyuidgid -u ") < 0 + || buffer_put(b, fmt, uid_fmt(fmt, uncaught_logs_uid)) < 0 + || buffer_puts(b, " -g ") < 0 + || buffer_put(b, fmt, gid_fmt(fmt, uncaught_logs_gid)) < 0 + || buffer_puts(b, " --\ns6-log -bpd3 -- ") < 0) + return 0 ; + if (console) + { + if (timestamp_style & 1 && buffer_puts(b, "t ") < 0 + || timestamp_style & 2 && buffer_puts(b, "T ") < 0 + || buffer_puts(b, "1 ") < 0) + return 0 ; + } + if (timestamp_style & 1 && buffer_puts(b, "t ") < 0 + || timestamp_style & 2 && buffer_puts(b, "T ") < 0 + || buffer_puts(b, S6_LINUX_INIT_TMPFS "/" UNCAUGHT_DIR "\n") < 0) + return 0 ; + return 1 ; } static int logouthookd_script (buffer *b, void *data) @@ -177,10 +189,6 @@ static inline int stage1_script (buffer *b) if (buffer_puts(b, " -m 00") < 0 || buffer_put(b, fmt, uint_ofmt(fmt, initial_umask)) < 0) return 0 ; } - if (redirect_stage2) - { - if (buffer_puts(b, " -r") < 0) return 0 ; - } if (initial_path) { if (buffer_puts(b, " -p ") < 0 @@ -399,7 +407,7 @@ int main (int argc, char const *const *argv, char const *const *envp) subgetopt_t l = SUBGETOPT_ZERO ; for (;;) { - int opt = subgetopt_r(argc, argv, "c:b:u:g:UG:rLp:m:t:d:s:e:E:q:", &l) ; + int opt = subgetopt_r(argc, argv, "c:b:u:g:UG:1Lp:m:t:d:s:e:E:q:", &l) ; if (opt == -1) break ; switch (opt) { @@ -417,7 +425,7 @@ int main (int argc, char const *const *argv, char const *const *envp) if (!uint0_scan(x, &uncaught_logs_gid)) strerr_dieinvalid(100, "GID") ; } case 'G' : early_getty = l.arg ; break ; - case 'r' : redirect_stage2 = 1 ; break ; + case '1' : console = 1 ; break ; case 'L' : logouthookd = 1 ; break ; case 'p' : initial_path = l.arg ; break ; case 'm' : if (!uint0_oscan(l.arg, &initial_umask)) dieusage() ; break ; diff --git a/src/init/s6-linux-init.c b/src/init/s6-linux-init.c index 6758682..aeddbac 100644 --- a/src/init/s6-linux-init.c +++ b/src/init/s6-linux-init.c @@ -23,12 +23,12 @@ #include "defaults.h" #include "initctl.h" -#define USAGE "s6-linux-init [ -r ] [ -c basedir ] [ -p initpath ] [ -s envdumpdir ] [ -m umask ] [ -d devtmpfs ]" +#define USAGE "s6-linux-init [ -c basedir ] [ -p initpath ] [ -s envdumpdir ] [ -m umask ] [ -d devtmpfs ]" #define dieusage() strerr_dieusage(100, USAGE) #define BANNER "\n s6-linux-init version " S6_LINUX_INIT_VERSION "\n\n" -static inline void run_stage2 (char const *basedir, char const **argv, unsigned int argc, char const *const *envp, size_t envlen, stralloc *envmodifs, int redirect) +static inline void run_stage2 (char const *basedir, char const **argv, unsigned int argc, char const *const *envp, size_t envlen, stralloc *envmodifs) { size_t dirlen = strlen(basedir) ; char const *childargv[argc + 2] ; @@ -47,10 +47,10 @@ static inline void run_stage2 (char const *basedir, char const **argv, unsigned childargv[argc + 1] = 0 ; setsid() ; fd_close(1) ; - if (open(LOGFIFO, O_WRONLY) != 1) /* blocks */ + if (open(LOGFIFO, O_WRONLY) != 1) /* blocks until catch-all logger is up */ strerr_diefu1sys(111, "open " LOGFIFO " for writing") ; - if (fd_copy(1 + redirect, 2 - redirect) == -1) - strerr_diefu1sys(111, "redirect output file descriptor") ; + if (fd_copy(2, 1) == -1) + strerr_diefu1sys(111, "fd_copy stdout to stderr") ; xpathexec_r(childargv, envp, envlen, envmodifs->s, envmodifs->len) ; } @@ -62,7 +62,6 @@ int main (int argc, char const **argv, char const *const *envp) char const *slashdev = 0 ; char const *envdumpdir = 0 ; stralloc envmodifs = STRALLOC_ZERO ; - int redirect = 0 ; PROG = "s6-linux-init" ; if (getpid() != 1) @@ -76,11 +75,10 @@ int main (int argc, char const **argv, char const *const *envp) subgetopt_t l = SUBGETOPT_ZERO ; for (;;) { - int opt = subgetopt_r(argc, argv, "rc:p:s:m:d:", &l) ; + int opt = subgetopt_r(argc, argv, "c:p:s:m:d:", &l) ; if (opt == -1) break ; switch (opt) { - case 'r' : redirect = 1 ; break ; case 'c' : basedir = l.arg ; break ; case 'p' : path = l.arg ; break ; case 's' : envdumpdir = l.arg ; break ; @@ -160,7 +158,7 @@ int main (int argc, char const **argv, char const *const *envp) } pid = fork() ; if (pid == -1) strerr_diefu1sys(111, "fork") ; - if (!pid) run_stage2(basedir, argv, argc, newenvp, !!path, &envmodifs, redirect) ; + if (!pid) run_stage2(basedir, argv, argc, newenvp, !!path, &envmodifs) ; if (fd_copy(2, 1) == -1) strerr_diefu1sys(111, "redirect output file descriptor") ; xpathexec_r(newargv, newenvp, !!path, envmodifs.s, envmodifs.len) ; |