runit

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 64d7f276e8b94c10e384850741cc9130a525121d
parent 12dc9af784b6a2c37d12c68b3e438362a7128e1e
Author: Gerrit Pape <pape@smarden.org>
Date:   Tue, 28 Oct 2003 12:06:44 +0000

  * runsv.c: don't use EOVERFLOW as it is not standard (thx Christoph
    Scheurer).
  * reboot_system.h1, reboot_system.h2, tryreboot.c: new; test if reboot()
    function takes one or two arguments (solaris).
  * runit.c: fallthrough stage 3: re-get stderr; sync() before reboot().
  * uw_tmp.h1, uw_tmp.h2, tryuwtmp.c, tryuwtmpx.c: new; test for utmpx or
    utmp support.
  * utmpset.c: support systems with utmp or utmpx (solaris).
  * Makefile: adapt.
  * supports the solaris platform (thx Uffe Jakobsen).
pre 0.11.4.

Diffstat:
MMakefile | 2+-
Mdoc/install.html | 12++++++------
Mdoc/replaceinit.html | 4++--
Mpackage/CHANGES | 13++++++++++++-
Mpackage/upgrade | 4++--
Msrc/Makefile | 36+++++++++++++++++++++++-------------
Msrc/TARGETS | 2++
Asrc/reboot_system.h1 | 8++++++++
Asrc/reboot_system.h2 | 8++++++++
Msrc/runit.c | 36+++++++++++++++++++++++++++---------
Msrc/runsv.c | 9+++++----
Asrc/tryreboot.c | 6++++++
Asrc/tryuwtmp.c | 9+++++++++
Asrc/tryuwtmpx.c | 9+++++++++
Msrc/utmpset.c | 40+++++++++++++++++++++++-----------------
Asrc/uw_tmp.h1 | 9+++++++++
Asrc/uw_tmp.h2 | 13+++++++++++++
17 files changed, 165 insertions(+), 55 deletions(-)

diff --git a/Makefile b/Makefile @@ -1,6 +1,6 @@ DESTDIR= -PACKAGE=runit-0.11.2 +PACKAGE=runit-0.11.4 DIRS=doc man etc package src MANPAGES=runit.8 runit-init.8 runsvdir.8 runsv.8 svwaitdown.8 svwaitup.8 \ utmpset.8 runsvchdir.8 runsvstat.8 runsvctrl.8 svlogd.8 chpst.8 diff --git a/doc/install.html b/doc/install.html @@ -17,14 +17,14 @@ If you don't have a <tt>/package</tt> directory, create it now: # chmod 1755 /package </pre> Download -<a href="runit-0.11.2.tar.gz">runit-0.11.2.tar.gz</a> into <tt>/package</tt> +<a href="runit-0.11.4.tar.gz">runit-0.11.4.tar.gz</a> into <tt>/package</tt> and unpack the archive <pre> # cd /package - # gunzip runit-0.11.2.tar - # tar -xpf runit-0.11.2.tar - # rm runit-0.11.2.tar - # cd admin/runit-0.11.2 + # gunzip runit-0.11.4.tar + # tar -xpf runit-0.11.4.tar + # rm runit-0.11.4.tar + # cd admin/runit-0.11.4 </pre> On MacOSX, do <pre> @@ -43,7 +43,7 @@ hierarchy, do: </pre> To report success: <pre> - # mail pape-runit-0.11.2@smarden.org &lt;compile/sysdeps + # mail pape-runit-0.11.4@smarden.org &lt;compile/sysdeps </pre> Refer to <a href="replaceinit.html">replacing init</a> for replacing <i>init</i> with <i>runit</i>, or to diff --git a/doc/replaceinit.html b/doc/replaceinit.html @@ -108,7 +108,7 @@ default Unix process no 1 <i>runit</i>. </pre> To report success: <pre> - # ( uname -a ; cat /etc/runit/[123] ) | mail pape-runit-0.11.2@smarden.org + # ( uname -a ; cat /etc/runit/[123] ) | mail pape-runit-0.11.4@smarden.org </pre> <hr> @@ -189,7 +189,7 @@ Use <b>init 6</b> to reboot and <b>init 0</b> to halt a system that runs <p> To report success: <pre> - # ( uname -a ; cat /etc/runit/[123] ) | mail pape-runit-0.11.2@smarden.org + # ( uname -a ; cat /etc/runit/[123] ) | mail pape-runit-0.11.4@smarden.org </pre> <h3>Step 5: Service migration</h3> The goal is to migrate all services from <i>/etc/rc.*</i> scheme to the diff --git a/package/CHANGES b/package/CHANGES @@ -1,3 +1,14 @@ + * runsv.c: don't use EOVERFLOW as it is not standard (thx Christoph + Scheurer). + * reboot_system.h1, reboot_system.h2, tryreboot.c: new; test if reboot() + function takes one or two arguments (solaris). + * runit.c: fallthrough stage 3: re-get stderr; sync() before reboot(). + * uw_tmp.h1, uw_tmp.h2, tryuwtmp.c, tryuwtmpx.c: new; test for utmpx or + utmp support. + * utmpset.c: support systems with utmp or utmpx (solaris). + * Makefile: adapt. + * supports the solaris platform (thx Uffe Jakobsen). + runit 0.11.2 Tue, 23 Sep 2003 10:15:32 +0200 * doc/useinit.html, etc/macosx/StartupItems/runit: don't use /etc/runit/2 @@ -46,12 +57,12 @@ Wed, 04 Jun 2003 13:56:33 +0200 * man/svlogd.8: document -v option; minor. * etc/freebsd/3, etc/openbsd/3: check if magic files in /etc/runit/ are executable, not readable. - A * etc/*/getty-tty*/run: remove utmpset from script. * etc/*/getty-tty*/finish: new: run utmpset. * doc/replaceinit.html: adapt. * setuidgid.c: new: daemontools' setuidgid drop in replacement (not installed by default). + A * Makefile: build setuidgid. * doc/index.html: update. diff --git a/package/upgrade b/package/upgrade @@ -7,9 +7,9 @@ test -d src || ( echo 'Wrong working directory.'; exit 1 ) here=`env - PATH=$PATH pwd` parent=`dirname $here` -echo 'Creating symlink runit -> runit-0.11.2...' +echo 'Creating symlink runit -> runit-0.11.4...' rm -f runit -ln -s runit-0.11.2 runit +ln -s runit-0.11.4 runit mv -f runit .. echo 'Making command links in /command...' diff --git a/src/Makefile b/src/Makefile @@ -63,7 +63,7 @@ svwaitup.o: compile sysdeps svwaitup.c svwaitdown.o: compile sysdeps svwaitdown.c ./compile svwaitdown.c -utmpset.o: compile utmpset.c +utmpset.o: compile sysdeps utmpset.c ./compile utmpset.c runsvchdir.o: compile runsvchdir.c @@ -85,6 +85,14 @@ pmatch.o: compile pmatch.c fmt_ptime.o: compile sysdeps fmt_ptime.c ./compile fmt_ptime.c +reboot_system.h: choose compile reboot_system.h1 reboot_system.h2 + ./choose c tryreboot reboot_system.h1 reboot_system.h2 > \ + reboot_system.h + +uw_tmp.h: compile uw_tmp.h1 uw_tmp.h2 + ( ./compile tryuwtmpx.c 2>/dev/null && cat uw_tmp.h2 >uw_tmp.h ) || \ + ( ./compile tryuwtmp.c 2>/dev/null && cat uw_tmp.h1 >uw_tmp.h ) + rm -f tryuwtmp.o tryuwtmpx.o clean: find . -name \*~ -exec rm -f {} \; @@ -347,19 +355,21 @@ subgetopt.o: compile subgetopt.c subgetopt.h sysdeps: compile direntry.h hasflock.h hasmkffo.h hassgact.h \ hassgprm.h hasshsgr.h haswaitp.h iopause.h load select.h systype \ -uint64.h +uint64.h reboot_system.h uw_tmp.h rm -f sysdeps - cat systype compile load >> sysdeps - grep sysdep direntry.h >> sysdeps - grep sysdep haswaitp.h >> sysdeps - grep sysdep hassgact.h >> sysdeps - grep sysdep hassgprm.h >> sysdeps - grep sysdep select.h >> sysdeps - grep sysdep uint64.h >> sysdeps - grep sysdep iopause.h >> sysdeps - grep sysdep hasmkffo.h >> sysdeps - grep sysdep hasflock.h >> sysdeps - grep sysdep hasshsgr.h >> sysdeps + cat systype compile load >>sysdeps + grep sysdep direntry.h >>sysdeps + grep sysdep haswaitp.h >>sysdeps + grep sysdep hassgact.h >>sysdeps + grep sysdep hassgprm.h >>sysdeps + grep sysdep select.h >>sysdeps + grep sysdep uint64.h >>sysdeps + grep sysdep iopause.h >>sysdeps + grep sysdep hasmkffo.h >>sysdeps + grep sysdep hasflock.h >>sysdeps + grep sysdep hasshsgr.h >>sysdeps + grep sysdep reboot_system.h >>sysdeps + grep sysdep uw_tmp.h >>sysdeps cat sysdeps systype: find-systype.sh trycpp.c x86cpuid.c diff --git a/src/TARGETS b/src/TARGETS @@ -25,6 +25,8 @@ chpst.o pmatch.o fmt_ptime.o uidgid.o +reboot_system.h +uw_tmp.h alloc.o alloc_re.o buffer.o diff --git a/src/reboot_system.h1 b/src/reboot_system.h1 @@ -0,0 +1,8 @@ +#include <unistd.h> +#include <sys/reboot.h> + +/* sysdep: -std reboot */ + +int reboot_system(int what) { + return(reboot(what, (char *)0)); +} diff --git a/src/reboot_system.h2 b/src/reboot_system.h2 @@ -0,0 +1,8 @@ +#include <unistd.h> +#include <sys/reboot.h> + +/* sysdep: +std reboot */ + +int reboot_system(int what) { + return(reboot(what)); +} diff --git a/src/runit.c b/src/runit.c @@ -14,6 +14,7 @@ #include "ndelay.h" #include "wait.h" #include "open.h" +#include "reboot_system.h" /* #define DEBUG */ @@ -69,8 +70,9 @@ int main (int argc, const char * const *argv, char * const *envp) { /* console */ if ((ttyfd =open_write("/dev/console")) != -1) { - if (ioctl(ttyfd, TIOCSCTTY, (char *)NULL) != -1) - strerr_warn2(WARNING, "ioctl: ", &strerr_sys); +#ifdef TIOCSCTTY + ioctl(ttyfd, TIOCSCTTY, (char *)0); +#endif dup2(ttyfd, 0); dup2(ttyfd, 1); dup2(ttyfd, 2); if (ttyfd > 2) close(ttyfd); } @@ -86,8 +88,8 @@ int main (int argc, const char * const *argv, char * const *envp) { ndelay_on(selfpipe[1]); #ifdef RB_DISABLE_CAD - /* activate ctrlaltdel handling, glibc */ - if (RB_DISABLE_CAD == 0) reboot(0); + /* activate ctrlaltdel handling, glibc, dietlibc */ + if (RB_DISABLE_CAD == 0) reboot_system(0); #endif strerr_warn3(INFO, "$Id$", @@ -280,6 +282,12 @@ int main (int argc, const char * const *argv, char * const *envp) { } } + /* reget stderr */ + if ((ttyfd =open_write("/dev/console")) != -1) { + dup2(ttyfd, 2); + if (ttyfd > 2) close(ttyfd); + } + #ifdef RB_AUTOBOOT /* fallthrough stage 3 */ strerr_warn2(INFO, "sending KILL signal to all processes...", 0); @@ -287,20 +295,30 @@ int main (int argc, const char * const *argv, char * const *envp) { if ((stat(REBOOT, &s) != -1) && (s.st_mode & S_IXUSR)) { strerr_warn2(INFO, "system reboot.", 0); - reboot(RB_AUTOBOOT); + sync(); + reboot_system(RB_AUTOBOOT); } else { -#ifdef RB_HALT_SYSTEM #ifdef RB_POWER_OFF strerr_warn2(INFO, "power off...", 0); - reboot(RB_POWER_OFF); + sync(); + reboot_system(RB_POWER_OFF); sleep(2); #endif +#ifdef RB_HALT_SYSTEM strerr_warn2(INFO, "system halt.", 0); - reboot(RB_HALT_SYSTEM); + sync(); + reboot_system(RB_HALT_SYSTEM); +#else +#ifdef RB_HALT + strerr_warn2(INFO, "system halt.", 0); + sync(); + reboot_system(RB_HALT); #else strerr_warn2(INFO, "system reboot.", 0); - reboot(RB_AUTOBOOT); + sync(); + reboot_system(RB_AUTOBOOT); +#endif #endif } #endif diff --git a/src/runsv.c b/src/runsv.c @@ -65,6 +65,9 @@ void fatal(char *m) { void fatal2(char *m1, char *m2) { strerr_die6sys(111, "runsv ", dir, ": fatal: ", m1, m2, ": "); } +void fatalx(char *m1, char *m2) { + strerr_die5x(111, "runsv ", dir, ": fatal: ", m1, m2); +} void warn(char *m) { strerr_warn5("runsv ", dir, ": warning: ", m, ": ", &strerr_sys); } @@ -370,10 +373,8 @@ int main(int argc, char **argv) { if (mkdir("supervise", 0700) == -1) { if ((fd =readlink("supervise", buf, 256)) != -1) { - if (fd == 256) { - errno =EOVERFLOW; - fatal("unable to readlink ./supervise"); - } + if (fd == 256) + fatalx("unable to readlink ./supervise: ", "name too long"); buf[fd] =0; mkdir(buf, 0700); } diff --git a/src/tryreboot.c b/src/tryreboot.c @@ -0,0 +1,6 @@ +#include <unistd.h> +#include <sys/reboot.h> + +int main(void) { + return(reboot(0)); +} diff --git a/src/tryuwtmp.c b/src/tryuwtmp.c @@ -0,0 +1,9 @@ +#include <sys/types.h> +#include <utmp.h> + +struct utmp ut; + +int main(void) { + char *s =ut.ut_name; + return(0); +} diff --git a/src/tryuwtmpx.c b/src/tryuwtmpx.c @@ -0,0 +1,9 @@ +#include <sys/types.h> +#include <utmpx.h> + +struct futmpx ut; + +int main(void) { + char *s =ut.ut_name; + return(0); +} diff --git a/src/utmpset.c b/src/utmpset.c @@ -3,8 +3,8 @@ #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> -#include <utmp.h> #include <string.h> +#include "uw_tmp.h" #include "strerr.h" #include "sgetopt.h" #include "seek.h" @@ -23,21 +23,24 @@ void usage(void) { strerr_die4x(1, "usage: ", progname, USAGE, "\n"); } int utmp_logout(const char *line) { int fd; - struct utmp ut; + uw_tmp ut; int ok =-1; - if ((fd =open(_PATH_UTMP, O_RDWR, 0)) < 0) - strerr_die4sys(111, FATAL, "unable to open ", _PATH_UTMP, ": "); + if ((fd =open(UW_TMP_UFILE, O_RDWR, 0)) < 0) + strerr_die4sys(111, FATAL, "unable to open ", UW_TMP_UFILE, ": "); if (lock_ex(fd) == -1) - strerr_die4sys(111, FATAL, "unable to lock: ", _PATH_UTMP, ": "); + strerr_die4sys(111, FATAL, "unable to lock: ", UW_TMP_UFILE, ": "); - while (read(fd, &ut, sizeof(struct utmp)) == sizeof(struct utmp)) { + while (read(fd, &ut, sizeof(uw_tmp)) == sizeof(uw_tmp)) { if (!ut.ut_name[0] || (str_diff(ut.ut_line, line) != 0)) continue; - memset(ut.ut_name, 0, UT_NAMESIZE); - memset(ut.ut_host, 0, UT_HOSTSIZE); + memset(ut.ut_name, 0, sizeof ut.ut_name); + memset(ut.ut_host, 0, sizeof ut.ut_host); if (time(&ut.ut_time) == -1) break; - if (lseek(fd, -(off_t)sizeof(struct utmp), SEEK_CUR) == -1) break; - if (write(fd, &ut, sizeof(struct utmp)) != sizeof(struct utmp)) break; +#ifdef DEAD_PROCESS + ut.ut_type =DEAD_PROCESS; +#endif + if (lseek(fd, -(off_t)sizeof(uw_tmp), SEEK_CUR) == -1) break; + if (write(fd, &ut, sizeof(uw_tmp)) != sizeof(uw_tmp)) break; ok =1; break; } @@ -48,25 +51,28 @@ int wtmp_logout(const char *line) { int fd; int len; struct stat st; - struct utmp ut; + uw_tmp ut; - if ((fd = open_append(_PATH_WTMP)) == -1) - strerr_die4sys(111, FATAL, "unable to open ", _PATH_WTMP, ": "); + if ((fd = open_append(UW_TMP_WFILE)) == -1) + strerr_die4sys(111, FATAL, "unable to open ", UW_TMP_WFILE, ": "); if (lock_ex(fd) == -1) - strerr_die4sys(111, FATAL, "unable to lock ", _PATH_WTMP, ": "); + strerr_die4sys(111, FATAL, "unable to lock ", UW_TMP_WFILE, ": "); if (fstat(fd, &st) == -1) { close(fd); return(-1); } - memset(&ut, 0, sizeof(struct utmp)); - if ((len =str_len(line)) > UT_LINESIZE) len =UT_LINESIZE -1; + memset(&ut, 0, sizeof(uw_tmp)); + if ((len =str_len(line)) > sizeof ut.ut_line) len =sizeof ut.ut_line -2; byte_copy(ut.ut_line, len, line); if (time(&ut.ut_time) == -1) { close(fd); return(-1); } - if (write(fd, &ut, sizeof(struct utmp)) != sizeof(struct utmp)) { +#ifdef DEAD_PROCESS + ut.ut_type =DEAD_PROCESS; +#endif + if (write(fd, &ut, sizeof(uw_tmp)) != sizeof(uw_tmp)) { ftruncate(fd, st.st_size); close(fd); return(-1); diff --git a/src/uw_tmp.h1 b/src/uw_tmp.h1 @@ -0,0 +1,9 @@ +#include <sys/types.h> +#include <utmp.h> + +/* sysdep: -utmpx */ + +#define UW_TMP_UFILE _PATH_UTMP +#define UW_TMP_WFILE _PATH_WTMP + +typedef struct utmp uw_tmp; diff --git a/src/uw_tmp.h2 b/src/uw_tmp.h2 @@ -0,0 +1,13 @@ +#include <sys/types.h> +#include <utmpx.h> + +/* sysdep: +utmpx */ + +#define UW_TMP_UFILE _UTMPX_FILE +#define UW_TMP_WFILE _WTMPX_FILE + +#ifndef ut_time +#define ut_time ut_tv.tv_sec +#endif + +typedef struct futmpx uw_tmp;