From 0080be8701258ed47e67cf033eb605d75b9566fb Mon Sep 17 00:00:00 2001 From: primardj Date: Sun, 24 Mar 2024 23:51:57 +0000 Subject: [PATCH] add a mirror to the old man --- mirror_runit/list_commands.txt | 22 + mirror_runit/runit-2.1.2/doc/benefits.html | 187 +++ mirror_runit/runit-2.1.2/doc/chpst.8.html | 152 +++ mirror_runit/runit-2.1.2/doc/debian | 1 + .../runit-2.1.2/doc/dependencies.html | 36 + mirror_runit/runit-2.1.2/doc/faq.html | 438 +++++++ mirror_runit/runit-2.1.2/doc/index.html | 261 ++++ mirror_runit/runit-2.1.2/doc/install.html | 61 + mirror_runit/runit-2.1.2/doc/replaceinit.html | 254 ++++ .../runit-2.1.2/doc/runit-init.8.html | 60 + mirror_runit/runit-2.1.2/doc/runit.8.html | 74 ++ mirror_runit/runit-2.1.2/doc/runlevels.html | 98 ++ mirror_runit/runit-2.1.2/doc/runscripts.html | 1058 +++++++++++++++++ mirror_runit/runit-2.1.2/doc/runsv.8.html | 157 +++ .../runit-2.1.2/doc/runsvchdir.8.html | 52 + mirror_runit/runit-2.1.2/doc/runsvdir.8.html | 73 ++ mirror_runit/runit-2.1.2/doc/sv.8.html | 218 ++++ mirror_runit/runit-2.1.2/doc/svlogd.8.html | 264 ++++ mirror_runit/runit-2.1.2/doc/upgrade.html | 105 ++ mirror_runit/runit-2.1.2/doc/usedietlibc.html | 35 + mirror_runit/runit-2.1.2/doc/useinit.html | 102 ++ mirror_runit/runit-2.1.2/doc/utmpset.8.html | 63 + mirror_runit/runit-2.1.2/etc/2 | 6 + mirror_runit/runit-2.1.2/etc/debian/1 | 10 + mirror_runit/runit-2.1.2/etc/debian/2 | 1 + mirror_runit/runit-2.1.2/etc/debian/3 | 14 + .../runit-2.1.2/etc/debian/ctrlaltdel | 9 + .../runit-2.1.2/etc/debian/getty-tty5/finish | 2 + .../runit-2.1.2/etc/debian/getty-tty5/run | 2 + mirror_runit/runit-2.1.2/etc/freebsd/1 | 17 + mirror_runit/runit-2.1.2/etc/freebsd/2 | 1 + mirror_runit/runit-2.1.2/etc/freebsd/3 | 15 + .../runit-2.1.2/etc/freebsd/ctrlaltdel | 9 + .../etc/freebsd/getty-ttyv4/finish | 2 + .../runit-2.1.2/etc/freebsd/getty-ttyv4/run | 2 + mirror_runit/runit-2.1.2/etc/macosx/2 | 1 + .../StartupItems/StartupParameters.plist | 11 + .../runit-2.1.2/etc/macosx/StartupItems/runit | 22 + .../etc/macosx/org.smarden.runit.plist | 20 + mirror_runit/runit-2.1.2/etc/openbsd/1 | 17 + mirror_runit/runit-2.1.2/etc/openbsd/2 | 1 + mirror_runit/runit-2.1.2/etc/openbsd/3 | 15 + .../runit-2.1.2/etc/openbsd/ctrlaltdel | 9 + .../etc/openbsd/getty-ttyC4/finish | 2 + .../runit-2.1.2/etc/openbsd/getty-ttyC4/run | 2 + mirror_runit/runit-2.1.2/man/chpst.8 | 265 +++++ mirror_runit/runit-2.1.2/man/runit-init.8 | 63 + mirror_runit/runit-2.1.2/man/runit.8 | 88 ++ mirror_runit/runit-2.1.2/man/runsv.8 | 225 ++++ mirror_runit/runit-2.1.2/man/runsvchdir.8 | 55 + mirror_runit/runit-2.1.2/man/runsvdir.8 | 102 ++ mirror_runit/runit-2.1.2/man/sv.8 | 285 +++++ mirror_runit/runit-2.1.2/man/svlogd.8 | 464 ++++++++ mirror_runit/runit-2.1.2/man/utmpset.8 | 63 + mirror_runit/runit-2.1.2/package/CHANGES | 688 +++++++++++ mirror_runit/runit-2.1.2/package/COPYING | 24 + mirror_runit/runit-2.1.2/package/README | 3 + mirror_runit/runit-2.1.2/package/THANKS | 2 + mirror_runit/runit-2.1.2/package/TODO | 8 + mirror_runit/runit-2.1.2/package/check | 9 + mirror_runit/runit-2.1.2/package/commands | 9 + mirror_runit/runit-2.1.2/package/compile | 27 + mirror_runit/runit-2.1.2/package/install | 6 + mirror_runit/runit-2.1.2/package/install-man | 26 + mirror_runit/runit-2.1.2/package/sharing | 3 + mirror_runit/runit-2.1.2/package/upgrade | 29 + mirror_runit/runit-2.1.2/package/versions | 54 + mirror_runit/runit-2.1.2/src/Makefile | 468 ++++++++ mirror_runit/runit-2.1.2/src/TARGETS | 143 +++ mirror_runit/runit-2.1.2/src/alloc.c | 33 + mirror_runit/runit-2.1.2/src/alloc.h | 10 + mirror_runit/runit-2.1.2/src/alloc_re.c | 19 + mirror_runit/runit-2.1.2/src/buffer.c | 12 + mirror_runit/runit-2.1.2/src/buffer.h | 61 + mirror_runit/runit-2.1.2/src/buffer_0.c | 13 + mirror_runit/runit-2.1.2/src/buffer_1.c | 7 + mirror_runit/runit-2.1.2/src/buffer_2.c | 7 + mirror_runit/runit-2.1.2/src/buffer_get.c | 69 ++ mirror_runit/runit-2.1.2/src/buffer_put.c | 90 ++ mirror_runit/runit-2.1.2/src/buffer_read.c | 9 + mirror_runit/runit-2.1.2/src/buffer_write.c | 9 + mirror_runit/runit-2.1.2/src/byte.h | 15 + mirror_runit/runit-2.1.2/src/byte_chr.c | 22 + mirror_runit/runit-2.1.2/src/byte_copy.c | 16 + mirror_runit/runit-2.1.2/src/byte_cr.c | 18 + mirror_runit/runit-2.1.2/src/byte_diff.c | 18 + mirror_runit/runit-2.1.2/src/byte_rchr.c | 25 + mirror_runit/runit-2.1.2/src/check-diff | 5 + mirror_runit/runit-2.1.2/src/check-dist | 8 + mirror_runit/runit-2.1.2/src/check-local | 9 + mirror_runit/runit-2.1.2/src/chkshsgr.c | 12 + mirror_runit/runit-2.1.2/src/choose.sh | 18 + mirror_runit/runit-2.1.2/src/chpst.c | 475 ++++++++ mirror_runit/runit-2.1.2/src/chpst.check | 36 + mirror_runit/runit-2.1.2/src/chpst.dist | 13 + mirror_runit/runit-2.1.2/src/coe.c | 9 + mirror_runit/runit-2.1.2/src/coe.h | 8 + mirror_runit/runit-2.1.2/src/conf-cc | 5 + mirror_runit/runit-2.1.2/src/conf-ld | 3 + mirror_runit/runit-2.1.2/src/direntry.h1 | 12 + mirror_runit/runit-2.1.2/src/direntry.h2 | 12 + mirror_runit/runit-2.1.2/src/env.c | 17 + mirror_runit/runit-2.1.2/src/env.h | 10 + mirror_runit/runit-2.1.2/src/error.c | 132 ++ mirror_runit/runit-2.1.2/src/error.h | 33 + mirror_runit/runit-2.1.2/src/error_str.c | 267 +++++ mirror_runit/runit-2.1.2/src/fd.h | 9 + mirror_runit/runit-2.1.2/src/fd_copy.c | 14 + mirror_runit/runit-2.1.2/src/fd_move.c | 12 + mirror_runit/runit-2.1.2/src/fifo.c | 12 + mirror_runit/runit-2.1.2/src/fifo.h | 8 + mirror_runit/runit-2.1.2/src/find-systype.sh | 143 +++ mirror_runit/runit-2.1.2/src/fmt.h | 27 + mirror_runit/runit-2.1.2/src/fmt_ptime.c | 42 + mirror_runit/runit-2.1.2/src/fmt_ptime.h | 14 + mirror_runit/runit-2.1.2/src/fmt_uint.c | 8 + mirror_runit/runit-2.1.2/src/fmt_uint0.c | 12 + mirror_runit/runit-2.1.2/src/fmt_ulong.c | 15 + mirror_runit/runit-2.1.2/src/gen_alloc.h | 9 + mirror_runit/runit-2.1.2/src/gen_allocdefs.h | 36 + mirror_runit/runit-2.1.2/src/hasflock.h1 | 3 + mirror_runit/runit-2.1.2/src/hasflock.h2 | 4 + mirror_runit/runit-2.1.2/src/hasmkffo.h1 | 3 + mirror_runit/runit-2.1.2/src/hasmkffo.h2 | 4 + mirror_runit/runit-2.1.2/src/hassgact.h1 | 3 + mirror_runit/runit-2.1.2/src/hassgact.h2 | 4 + mirror_runit/runit-2.1.2/src/hassgprm.h1 | 3 + mirror_runit/runit-2.1.2/src/hassgprm.h2 | 4 + mirror_runit/runit-2.1.2/src/hasshsgr.h1 | 3 + mirror_runit/runit-2.1.2/src/hasshsgr.h2 | 4 + mirror_runit/runit-2.1.2/src/haswaitp.h1 | 3 + mirror_runit/runit-2.1.2/src/haswaitp.h2 | 4 + mirror_runit/runit-2.1.2/src/iopause.c | 78 ++ mirror_runit/runit-2.1.2/src/iopause.h1 | 21 + mirror_runit/runit-2.1.2/src/iopause.h2 | 20 + mirror_runit/runit-2.1.2/src/lock.h | 10 + mirror_runit/runit-2.1.2/src/lock_ex.c | 13 + mirror_runit/runit-2.1.2/src/lock_exnb.c | 13 + mirror_runit/runit-2.1.2/src/ndelay.h | 9 + mirror_runit/runit-2.1.2/src/ndelay_off.c | 14 + mirror_runit/runit-2.1.2/src/ndelay_on.c | 14 + mirror_runit/runit-2.1.2/src/open.h | 12 + mirror_runit/runit-2.1.2/src/open_append.c | 8 + mirror_runit/runit-2.1.2/src/open_read.c | 8 + mirror_runit/runit-2.1.2/src/open_trunc.c | 8 + mirror_runit/runit-2.1.2/src/open_write.c | 8 + mirror_runit/runit-2.1.2/src/openreadclose.c | 18 + mirror_runit/runit-2.1.2/src/openreadclose.h | 10 + mirror_runit/runit-2.1.2/src/pathexec.h | 11 + mirror_runit/runit-2.1.2/src/pathexec_env.c | 74 ++ mirror_runit/runit-2.1.2/src/pathexec_run.c | 48 + mirror_runit/runit-2.1.2/src/pmatch.c | 40 + mirror_runit/runit-2.1.2/src/pmatch.h | 6 + mirror_runit/runit-2.1.2/src/print-ar.sh | 14 + mirror_runit/runit-2.1.2/src/print-cc.sh | 5 + mirror_runit/runit-2.1.2/src/print-ld.sh | 6 + mirror_runit/runit-2.1.2/src/prot.c | 21 + mirror_runit/runit-2.1.2/src/prot.h | 9 + mirror_runit/runit-2.1.2/src/readclose.c | 23 + mirror_runit/runit-2.1.2/src/readclose.h | 11 + mirror_runit/runit-2.1.2/src/reboot_system.h1 | 8 + mirror_runit/runit-2.1.2/src/reboot_system.h2 | 8 + mirror_runit/runit-2.1.2/src/runit-init.c | 76 ++ mirror_runit/runit-2.1.2/src/runit-init.check | 3 + mirror_runit/runit-2.1.2/src/runit-init.dist | 3 + mirror_runit/runit-2.1.2/src/runit.c | 346 ++++++ mirror_runit/runit-2.1.2/src/runit.check | 3 + mirror_runit/runit-2.1.2/src/runit.dist | 2 + mirror_runit/runit-2.1.2/src/runit.h | 4 + mirror_runit/runit-2.1.2/src/runsv.c | 607 ++++++++++ mirror_runit/runit-2.1.2/src/runsv.check | 59 + mirror_runit/runit-2.1.2/src/runsv.dist | 16 + mirror_runit/runit-2.1.2/src/runsvchdir.c | 76 ++ mirror_runit/runit-2.1.2/src/runsvchdir.check | 3 + mirror_runit/runit-2.1.2/src/runsvchdir.dist | 3 + mirror_runit/runit-2.1.2/src/runsvctrl.c | 82 ++ mirror_runit/runit-2.1.2/src/runsvctrl.check | 23 + mirror_runit/runit-2.1.2/src/runsvctrl.dist | 8 + mirror_runit/runit-2.1.2/src/runsvdir.c | 286 +++++ mirror_runit/runit-2.1.2/src/runsvdir.check | 3 + mirror_runit/runit-2.1.2/src/runsvdir.dist | 3 + mirror_runit/runit-2.1.2/src/runsvstat.c | 167 +++ mirror_runit/runit-2.1.2/src/runsvstat.check | 26 + mirror_runit/runit-2.1.2/src/runsvstat.dist | 12 + mirror_runit/runit-2.1.2/src/scan.h | 30 + mirror_runit/runit-2.1.2/src/scan_ulong.c | 16 + mirror_runit/runit-2.1.2/src/seek.h | 17 + mirror_runit/runit-2.1.2/src/seek_set.c | 9 + mirror_runit/runit-2.1.2/src/select.h1 | 12 + mirror_runit/runit-2.1.2/src/select.h2 | 13 + mirror_runit/runit-2.1.2/src/sgetopt.c | 53 + mirror_runit/runit-2.1.2/src/sgetopt.h | 23 + mirror_runit/runit-2.1.2/src/sig.c | 15 + mirror_runit/runit-2.1.2/src/sig.h | 28 + mirror_runit/runit-2.1.2/src/sig_block.c | 40 + mirror_runit/runit-2.1.2/src/sig_catch.c | 18 + mirror_runit/runit-2.1.2/src/sig_pause.c | 16 + mirror_runit/runit-2.1.2/src/str.h | 16 + mirror_runit/runit-2.1.2/src/str_chr.c | 19 + mirror_runit/runit-2.1.2/src/str_diff.c | 17 + mirror_runit/runit-2.1.2/src/str_len.c | 16 + mirror_runit/runit-2.1.2/src/str_start.c | 15 + mirror_runit/runit-2.1.2/src/stralloc.h | 31 + mirror_runit/runit-2.1.2/src/stralloc_cat.c | 9 + mirror_runit/runit-2.1.2/src/stralloc_catb.c | 14 + mirror_runit/runit-2.1.2/src/stralloc_cats.c | 10 + mirror_runit/runit-2.1.2/src/stralloc_eady.c | 8 + mirror_runit/runit-2.1.2/src/stralloc_opyb.c | 13 + mirror_runit/runit-2.1.2/src/stralloc_opys.c | 10 + mirror_runit/runit-2.1.2/src/stralloc_pend.c | 7 + mirror_runit/runit-2.1.2/src/strerr.h | 80 ++ mirror_runit/runit-2.1.2/src/strerr_die.c | 33 + mirror_runit/runit-2.1.2/src/strerr_sys.c | 14 + mirror_runit/runit-2.1.2/src/subgetopt.c | 67 ++ mirror_runit/runit-2.1.2/src/subgetopt.h | 26 + mirror_runit/runit-2.1.2/src/sv.c | 394 ++++++ mirror_runit/runit-2.1.2/src/sv.check | 27 + mirror_runit/runit-2.1.2/src/sv.dist | 12 + mirror_runit/runit-2.1.2/src/svlogd.c | 848 +++++++++++++ mirror_runit/runit-2.1.2/src/svlogd.check | 27 + mirror_runit/runit-2.1.2/src/svlogd.dist | 21 + mirror_runit/runit-2.1.2/src/svwaitdown.c | 177 +++ mirror_runit/runit-2.1.2/src/svwaitdown.check | 24 + mirror_runit/runit-2.1.2/src/svwaitdown.dist | 12 + mirror_runit/runit-2.1.2/src/svwaitup.c | 126 ++ mirror_runit/runit-2.1.2/src/svwaitup.check | 28 + mirror_runit/runit-2.1.2/src/svwaitup.dist | 14 + mirror_runit/runit-2.1.2/src/tai.h | 28 + mirror_runit/runit-2.1.2/src/tai_now.c | 9 + mirror_runit/runit-2.1.2/src/tai_pack.c | 18 + mirror_runit/runit-2.1.2/src/tai_sub.c | 8 + mirror_runit/runit-2.1.2/src/tai_unpack.c | 18 + mirror_runit/runit-2.1.2/src/taia.h | 36 + mirror_runit/runit-2.1.2/src/taia_add.c | 20 + mirror_runit/runit-2.1.2/src/taia_approx.c | 8 + mirror_runit/runit-2.1.2/src/taia_frac.c | 8 + mirror_runit/runit-2.1.2/src/taia_less.c | 14 + mirror_runit/runit-2.1.2/src/taia_now.c | 15 + mirror_runit/runit-2.1.2/src/taia_pack.c | 22 + mirror_runit/runit-2.1.2/src/taia_sub.c | 23 + mirror_runit/runit-2.1.2/src/taia_uint.c | 12 + mirror_runit/runit-2.1.2/src/trycpp.c | 9 + mirror_runit/runit-2.1.2/src/trydrent.c | 10 + mirror_runit/runit-2.1.2/src/tryflock.c | 10 + mirror_runit/runit-2.1.2/src/trymkffo.c | 9 + mirror_runit/runit-2.1.2/src/trypoll.c | 20 + mirror_runit/runit-2.1.2/src/tryreboot.c | 6 + mirror_runit/runit-2.1.2/src/trysgact.c | 12 + mirror_runit/runit-2.1.2/src/trysgprm.c | 12 + mirror_runit/runit-2.1.2/src/tryshsgr.c | 16 + mirror_runit/runit-2.1.2/src/trysocketlib.c | 12 + mirror_runit/runit-2.1.2/src/trysysel.c | 11 + mirror_runit/runit-2.1.2/src/tryulong64.c | 13 + mirror_runit/runit-2.1.2/src/tryuwtmp.c | 9 + mirror_runit/runit-2.1.2/src/tryuwtmpx.c | 9 + mirror_runit/runit-2.1.2/src/trywaitp.c | 9 + mirror_runit/runit-2.1.2/src/uidgid.c | 74 ++ mirror_runit/runit-2.1.2/src/uidgid.h | 18 + mirror_runit/runit-2.1.2/src/uint64.h1 | 10 + mirror_runit/runit-2.1.2/src/uint64.h2 | 10 + mirror_runit/runit-2.1.2/src/utmpset.c | 112 ++ mirror_runit/runit-2.1.2/src/utmpset.check | 5 + mirror_runit/runit-2.1.2/src/utmpset.dist | 7 + mirror_runit/runit-2.1.2/src/uw_tmp.h1 | 19 + mirror_runit/runit-2.1.2/src/uw_tmp.h2 | 13 + mirror_runit/runit-2.1.2/src/wait.h | 16 + mirror_runit/runit-2.1.2/src/wait_nohang.c | 14 + mirror_runit/runit-2.1.2/src/wait_pid.c | 41 + mirror_runit/runit-2.1.2/src/warn-auto.sh | 2 + mirror_runit/runit-2.1.2/src/warn-shsgr | 3 + mirror_runit/runit-2.1.2/src/x86cpuid.c | 40 + 271 files changed, 14564 insertions(+) create mode 100644 mirror_runit/list_commands.txt create mode 100644 mirror_runit/runit-2.1.2/doc/benefits.html create mode 100644 mirror_runit/runit-2.1.2/doc/chpst.8.html create mode 120000 mirror_runit/runit-2.1.2/doc/debian create mode 100644 mirror_runit/runit-2.1.2/doc/dependencies.html create mode 100644 mirror_runit/runit-2.1.2/doc/faq.html create mode 100644 mirror_runit/runit-2.1.2/doc/index.html create mode 100644 mirror_runit/runit-2.1.2/doc/install.html create mode 100644 mirror_runit/runit-2.1.2/doc/replaceinit.html create mode 100644 mirror_runit/runit-2.1.2/doc/runit-init.8.html create mode 100644 mirror_runit/runit-2.1.2/doc/runit.8.html create mode 100644 mirror_runit/runit-2.1.2/doc/runlevels.html create mode 100644 mirror_runit/runit-2.1.2/doc/runscripts.html create mode 100644 mirror_runit/runit-2.1.2/doc/runsv.8.html create mode 100644 mirror_runit/runit-2.1.2/doc/runsvchdir.8.html create mode 100644 mirror_runit/runit-2.1.2/doc/runsvdir.8.html create mode 100644 mirror_runit/runit-2.1.2/doc/sv.8.html create mode 100644 mirror_runit/runit-2.1.2/doc/svlogd.8.html create mode 100644 mirror_runit/runit-2.1.2/doc/upgrade.html create mode 100644 mirror_runit/runit-2.1.2/doc/usedietlibc.html create mode 100644 mirror_runit/runit-2.1.2/doc/useinit.html create mode 100644 mirror_runit/runit-2.1.2/doc/utmpset.8.html create mode 100755 mirror_runit/runit-2.1.2/etc/2 create mode 100755 mirror_runit/runit-2.1.2/etc/debian/1 create mode 120000 mirror_runit/runit-2.1.2/etc/debian/2 create mode 100755 mirror_runit/runit-2.1.2/etc/debian/3 create mode 100755 mirror_runit/runit-2.1.2/etc/debian/ctrlaltdel create mode 100755 mirror_runit/runit-2.1.2/etc/debian/getty-tty5/finish create mode 100755 mirror_runit/runit-2.1.2/etc/debian/getty-tty5/run create mode 100755 mirror_runit/runit-2.1.2/etc/freebsd/1 create mode 120000 mirror_runit/runit-2.1.2/etc/freebsd/2 create mode 100755 mirror_runit/runit-2.1.2/etc/freebsd/3 create mode 100755 mirror_runit/runit-2.1.2/etc/freebsd/ctrlaltdel create mode 100755 mirror_runit/runit-2.1.2/etc/freebsd/getty-ttyv4/finish create mode 100755 mirror_runit/runit-2.1.2/etc/freebsd/getty-ttyv4/run create mode 120000 mirror_runit/runit-2.1.2/etc/macosx/2 create mode 100644 mirror_runit/runit-2.1.2/etc/macosx/StartupItems/StartupParameters.plist create mode 100755 mirror_runit/runit-2.1.2/etc/macosx/StartupItems/runit create mode 100644 mirror_runit/runit-2.1.2/etc/macosx/org.smarden.runit.plist create mode 100755 mirror_runit/runit-2.1.2/etc/openbsd/1 create mode 120000 mirror_runit/runit-2.1.2/etc/openbsd/2 create mode 100755 mirror_runit/runit-2.1.2/etc/openbsd/3 create mode 100755 mirror_runit/runit-2.1.2/etc/openbsd/ctrlaltdel create mode 100755 mirror_runit/runit-2.1.2/etc/openbsd/getty-ttyC4/finish create mode 100755 mirror_runit/runit-2.1.2/etc/openbsd/getty-ttyC4/run create mode 100644 mirror_runit/runit-2.1.2/man/chpst.8 create mode 100644 mirror_runit/runit-2.1.2/man/runit-init.8 create mode 100644 mirror_runit/runit-2.1.2/man/runit.8 create mode 100644 mirror_runit/runit-2.1.2/man/runsv.8 create mode 100644 mirror_runit/runit-2.1.2/man/runsvchdir.8 create mode 100644 mirror_runit/runit-2.1.2/man/runsvdir.8 create mode 100644 mirror_runit/runit-2.1.2/man/sv.8 create mode 100644 mirror_runit/runit-2.1.2/man/svlogd.8 create mode 100644 mirror_runit/runit-2.1.2/man/utmpset.8 create mode 100644 mirror_runit/runit-2.1.2/package/CHANGES create mode 100644 mirror_runit/runit-2.1.2/package/COPYING create mode 100644 mirror_runit/runit-2.1.2/package/README create mode 100644 mirror_runit/runit-2.1.2/package/THANKS create mode 100644 mirror_runit/runit-2.1.2/package/TODO create mode 100755 mirror_runit/runit-2.1.2/package/check create mode 100644 mirror_runit/runit-2.1.2/package/commands create mode 100755 mirror_runit/runit-2.1.2/package/compile create mode 100755 mirror_runit/runit-2.1.2/package/install create mode 100755 mirror_runit/runit-2.1.2/package/install-man create mode 100644 mirror_runit/runit-2.1.2/package/sharing create mode 100755 mirror_runit/runit-2.1.2/package/upgrade create mode 100644 mirror_runit/runit-2.1.2/package/versions create mode 100644 mirror_runit/runit-2.1.2/src/Makefile create mode 100644 mirror_runit/runit-2.1.2/src/TARGETS create mode 100644 mirror_runit/runit-2.1.2/src/alloc.c create mode 100644 mirror_runit/runit-2.1.2/src/alloc.h create mode 100644 mirror_runit/runit-2.1.2/src/alloc_re.c create mode 100644 mirror_runit/runit-2.1.2/src/buffer.c create mode 100644 mirror_runit/runit-2.1.2/src/buffer.h create mode 100644 mirror_runit/runit-2.1.2/src/buffer_0.c create mode 100644 mirror_runit/runit-2.1.2/src/buffer_1.c create mode 100644 mirror_runit/runit-2.1.2/src/buffer_2.c create mode 100644 mirror_runit/runit-2.1.2/src/buffer_get.c create mode 100644 mirror_runit/runit-2.1.2/src/buffer_put.c create mode 100644 mirror_runit/runit-2.1.2/src/buffer_read.c create mode 100644 mirror_runit/runit-2.1.2/src/buffer_write.c create mode 100644 mirror_runit/runit-2.1.2/src/byte.h create mode 100644 mirror_runit/runit-2.1.2/src/byte_chr.c create mode 100644 mirror_runit/runit-2.1.2/src/byte_copy.c create mode 100644 mirror_runit/runit-2.1.2/src/byte_cr.c create mode 100644 mirror_runit/runit-2.1.2/src/byte_diff.c create mode 100644 mirror_runit/runit-2.1.2/src/byte_rchr.c create mode 100755 mirror_runit/runit-2.1.2/src/check-diff create mode 100755 mirror_runit/runit-2.1.2/src/check-dist create mode 100755 mirror_runit/runit-2.1.2/src/check-local create mode 100644 mirror_runit/runit-2.1.2/src/chkshsgr.c create mode 100644 mirror_runit/runit-2.1.2/src/choose.sh create mode 100644 mirror_runit/runit-2.1.2/src/chpst.c create mode 100755 mirror_runit/runit-2.1.2/src/chpst.check create mode 100644 mirror_runit/runit-2.1.2/src/chpst.dist create mode 100644 mirror_runit/runit-2.1.2/src/coe.c create mode 100644 mirror_runit/runit-2.1.2/src/coe.h create mode 100644 mirror_runit/runit-2.1.2/src/conf-cc create mode 100644 mirror_runit/runit-2.1.2/src/conf-ld create mode 100644 mirror_runit/runit-2.1.2/src/direntry.h1 create mode 100644 mirror_runit/runit-2.1.2/src/direntry.h2 create mode 100644 mirror_runit/runit-2.1.2/src/env.c create mode 100644 mirror_runit/runit-2.1.2/src/env.h create mode 100644 mirror_runit/runit-2.1.2/src/error.c create mode 100644 mirror_runit/runit-2.1.2/src/error.h create mode 100644 mirror_runit/runit-2.1.2/src/error_str.c create mode 100644 mirror_runit/runit-2.1.2/src/fd.h create mode 100644 mirror_runit/runit-2.1.2/src/fd_copy.c create mode 100644 mirror_runit/runit-2.1.2/src/fd_move.c create mode 100644 mirror_runit/runit-2.1.2/src/fifo.c create mode 100644 mirror_runit/runit-2.1.2/src/fifo.h create mode 100644 mirror_runit/runit-2.1.2/src/find-systype.sh create mode 100644 mirror_runit/runit-2.1.2/src/fmt.h create mode 100644 mirror_runit/runit-2.1.2/src/fmt_ptime.c create mode 100644 mirror_runit/runit-2.1.2/src/fmt_ptime.h create mode 100644 mirror_runit/runit-2.1.2/src/fmt_uint.c create mode 100644 mirror_runit/runit-2.1.2/src/fmt_uint0.c create mode 100644 mirror_runit/runit-2.1.2/src/fmt_ulong.c create mode 100644 mirror_runit/runit-2.1.2/src/gen_alloc.h create mode 100644 mirror_runit/runit-2.1.2/src/gen_allocdefs.h create mode 100644 mirror_runit/runit-2.1.2/src/hasflock.h1 create mode 100644 mirror_runit/runit-2.1.2/src/hasflock.h2 create mode 100644 mirror_runit/runit-2.1.2/src/hasmkffo.h1 create mode 100644 mirror_runit/runit-2.1.2/src/hasmkffo.h2 create mode 100644 mirror_runit/runit-2.1.2/src/hassgact.h1 create mode 100644 mirror_runit/runit-2.1.2/src/hassgact.h2 create mode 100644 mirror_runit/runit-2.1.2/src/hassgprm.h1 create mode 100644 mirror_runit/runit-2.1.2/src/hassgprm.h2 create mode 100644 mirror_runit/runit-2.1.2/src/hasshsgr.h1 create mode 100644 mirror_runit/runit-2.1.2/src/hasshsgr.h2 create mode 100644 mirror_runit/runit-2.1.2/src/haswaitp.h1 create mode 100644 mirror_runit/runit-2.1.2/src/haswaitp.h2 create mode 100644 mirror_runit/runit-2.1.2/src/iopause.c create mode 100644 mirror_runit/runit-2.1.2/src/iopause.h1 create mode 100644 mirror_runit/runit-2.1.2/src/iopause.h2 create mode 100644 mirror_runit/runit-2.1.2/src/lock.h create mode 100644 mirror_runit/runit-2.1.2/src/lock_ex.c create mode 100644 mirror_runit/runit-2.1.2/src/lock_exnb.c create mode 100644 mirror_runit/runit-2.1.2/src/ndelay.h create mode 100644 mirror_runit/runit-2.1.2/src/ndelay_off.c create mode 100644 mirror_runit/runit-2.1.2/src/ndelay_on.c create mode 100644 mirror_runit/runit-2.1.2/src/open.h create mode 100644 mirror_runit/runit-2.1.2/src/open_append.c create mode 100644 mirror_runit/runit-2.1.2/src/open_read.c create mode 100644 mirror_runit/runit-2.1.2/src/open_trunc.c create mode 100644 mirror_runit/runit-2.1.2/src/open_write.c create mode 100644 mirror_runit/runit-2.1.2/src/openreadclose.c create mode 100644 mirror_runit/runit-2.1.2/src/openreadclose.h create mode 100644 mirror_runit/runit-2.1.2/src/pathexec.h create mode 100644 mirror_runit/runit-2.1.2/src/pathexec_env.c create mode 100644 mirror_runit/runit-2.1.2/src/pathexec_run.c create mode 100644 mirror_runit/runit-2.1.2/src/pmatch.c create mode 100644 mirror_runit/runit-2.1.2/src/pmatch.h create mode 100644 mirror_runit/runit-2.1.2/src/print-ar.sh create mode 100644 mirror_runit/runit-2.1.2/src/print-cc.sh create mode 100644 mirror_runit/runit-2.1.2/src/print-ld.sh create mode 100644 mirror_runit/runit-2.1.2/src/prot.c create mode 100644 mirror_runit/runit-2.1.2/src/prot.h create mode 100644 mirror_runit/runit-2.1.2/src/readclose.c create mode 100644 mirror_runit/runit-2.1.2/src/readclose.h create mode 100644 mirror_runit/runit-2.1.2/src/reboot_system.h1 create mode 100644 mirror_runit/runit-2.1.2/src/reboot_system.h2 create mode 100644 mirror_runit/runit-2.1.2/src/runit-init.c create mode 100755 mirror_runit/runit-2.1.2/src/runit-init.check create mode 100644 mirror_runit/runit-2.1.2/src/runit-init.dist create mode 100644 mirror_runit/runit-2.1.2/src/runit.c create mode 100755 mirror_runit/runit-2.1.2/src/runit.check create mode 100644 mirror_runit/runit-2.1.2/src/runit.dist create mode 100644 mirror_runit/runit-2.1.2/src/runit.h create mode 100644 mirror_runit/runit-2.1.2/src/runsv.c create mode 100755 mirror_runit/runit-2.1.2/src/runsv.check create mode 100644 mirror_runit/runit-2.1.2/src/runsv.dist create mode 100644 mirror_runit/runit-2.1.2/src/runsvchdir.c create mode 100755 mirror_runit/runit-2.1.2/src/runsvchdir.check create mode 100644 mirror_runit/runit-2.1.2/src/runsvchdir.dist create mode 100644 mirror_runit/runit-2.1.2/src/runsvctrl.c create mode 100755 mirror_runit/runit-2.1.2/src/runsvctrl.check create mode 100644 mirror_runit/runit-2.1.2/src/runsvctrl.dist create mode 100644 mirror_runit/runit-2.1.2/src/runsvdir.c create mode 100755 mirror_runit/runit-2.1.2/src/runsvdir.check create mode 100644 mirror_runit/runit-2.1.2/src/runsvdir.dist create mode 100644 mirror_runit/runit-2.1.2/src/runsvstat.c create mode 100755 mirror_runit/runit-2.1.2/src/runsvstat.check create mode 100644 mirror_runit/runit-2.1.2/src/runsvstat.dist create mode 100644 mirror_runit/runit-2.1.2/src/scan.h create mode 100644 mirror_runit/runit-2.1.2/src/scan_ulong.c create mode 100644 mirror_runit/runit-2.1.2/src/seek.h create mode 100644 mirror_runit/runit-2.1.2/src/seek_set.c create mode 100644 mirror_runit/runit-2.1.2/src/select.h1 create mode 100644 mirror_runit/runit-2.1.2/src/select.h2 create mode 100644 mirror_runit/runit-2.1.2/src/sgetopt.c create mode 100644 mirror_runit/runit-2.1.2/src/sgetopt.h create mode 100644 mirror_runit/runit-2.1.2/src/sig.c create mode 100644 mirror_runit/runit-2.1.2/src/sig.h create mode 100644 mirror_runit/runit-2.1.2/src/sig_block.c create mode 100644 mirror_runit/runit-2.1.2/src/sig_catch.c create mode 100644 mirror_runit/runit-2.1.2/src/sig_pause.c create mode 100644 mirror_runit/runit-2.1.2/src/str.h create mode 100644 mirror_runit/runit-2.1.2/src/str_chr.c create mode 100644 mirror_runit/runit-2.1.2/src/str_diff.c create mode 100644 mirror_runit/runit-2.1.2/src/str_len.c create mode 100644 mirror_runit/runit-2.1.2/src/str_start.c create mode 100644 mirror_runit/runit-2.1.2/src/stralloc.h create mode 100644 mirror_runit/runit-2.1.2/src/stralloc_cat.c create mode 100644 mirror_runit/runit-2.1.2/src/stralloc_catb.c create mode 100644 mirror_runit/runit-2.1.2/src/stralloc_cats.c create mode 100644 mirror_runit/runit-2.1.2/src/stralloc_eady.c create mode 100644 mirror_runit/runit-2.1.2/src/stralloc_opyb.c create mode 100644 mirror_runit/runit-2.1.2/src/stralloc_opys.c create mode 100644 mirror_runit/runit-2.1.2/src/stralloc_pend.c create mode 100644 mirror_runit/runit-2.1.2/src/strerr.h create mode 100644 mirror_runit/runit-2.1.2/src/strerr_die.c create mode 100644 mirror_runit/runit-2.1.2/src/strerr_sys.c create mode 100644 mirror_runit/runit-2.1.2/src/subgetopt.c create mode 100644 mirror_runit/runit-2.1.2/src/subgetopt.h create mode 100644 mirror_runit/runit-2.1.2/src/sv.c create mode 100755 mirror_runit/runit-2.1.2/src/sv.check create mode 100644 mirror_runit/runit-2.1.2/src/sv.dist create mode 100644 mirror_runit/runit-2.1.2/src/svlogd.c create mode 100755 mirror_runit/runit-2.1.2/src/svlogd.check create mode 100644 mirror_runit/runit-2.1.2/src/svlogd.dist create mode 100644 mirror_runit/runit-2.1.2/src/svwaitdown.c create mode 100755 mirror_runit/runit-2.1.2/src/svwaitdown.check create mode 100644 mirror_runit/runit-2.1.2/src/svwaitdown.dist create mode 100644 mirror_runit/runit-2.1.2/src/svwaitup.c create mode 100755 mirror_runit/runit-2.1.2/src/svwaitup.check create mode 100644 mirror_runit/runit-2.1.2/src/svwaitup.dist create mode 100644 mirror_runit/runit-2.1.2/src/tai.h create mode 100644 mirror_runit/runit-2.1.2/src/tai_now.c create mode 100644 mirror_runit/runit-2.1.2/src/tai_pack.c create mode 100644 mirror_runit/runit-2.1.2/src/tai_sub.c create mode 100644 mirror_runit/runit-2.1.2/src/tai_unpack.c create mode 100644 mirror_runit/runit-2.1.2/src/taia.h create mode 100644 mirror_runit/runit-2.1.2/src/taia_add.c create mode 100644 mirror_runit/runit-2.1.2/src/taia_approx.c create mode 100644 mirror_runit/runit-2.1.2/src/taia_frac.c create mode 100644 mirror_runit/runit-2.1.2/src/taia_less.c create mode 100644 mirror_runit/runit-2.1.2/src/taia_now.c create mode 100644 mirror_runit/runit-2.1.2/src/taia_pack.c create mode 100644 mirror_runit/runit-2.1.2/src/taia_sub.c create mode 100644 mirror_runit/runit-2.1.2/src/taia_uint.c create mode 100644 mirror_runit/runit-2.1.2/src/trycpp.c create mode 100644 mirror_runit/runit-2.1.2/src/trydrent.c create mode 100644 mirror_runit/runit-2.1.2/src/tryflock.c create mode 100644 mirror_runit/runit-2.1.2/src/trymkffo.c create mode 100644 mirror_runit/runit-2.1.2/src/trypoll.c create mode 100644 mirror_runit/runit-2.1.2/src/tryreboot.c create mode 100644 mirror_runit/runit-2.1.2/src/trysgact.c create mode 100644 mirror_runit/runit-2.1.2/src/trysgprm.c create mode 100644 mirror_runit/runit-2.1.2/src/tryshsgr.c create mode 100644 mirror_runit/runit-2.1.2/src/trysocketlib.c create mode 100644 mirror_runit/runit-2.1.2/src/trysysel.c create mode 100644 mirror_runit/runit-2.1.2/src/tryulong64.c create mode 100644 mirror_runit/runit-2.1.2/src/tryuwtmp.c create mode 100644 mirror_runit/runit-2.1.2/src/tryuwtmpx.c create mode 100644 mirror_runit/runit-2.1.2/src/trywaitp.c create mode 100644 mirror_runit/runit-2.1.2/src/uidgid.c create mode 100644 mirror_runit/runit-2.1.2/src/uidgid.h create mode 100644 mirror_runit/runit-2.1.2/src/uint64.h1 create mode 100644 mirror_runit/runit-2.1.2/src/uint64.h2 create mode 100644 mirror_runit/runit-2.1.2/src/utmpset.c create mode 100755 mirror_runit/runit-2.1.2/src/utmpset.check create mode 100644 mirror_runit/runit-2.1.2/src/utmpset.dist create mode 100644 mirror_runit/runit-2.1.2/src/uw_tmp.h1 create mode 100644 mirror_runit/runit-2.1.2/src/uw_tmp.h2 create mode 100644 mirror_runit/runit-2.1.2/src/wait.h create mode 100644 mirror_runit/runit-2.1.2/src/wait_nohang.c create mode 100644 mirror_runit/runit-2.1.2/src/wait_pid.c create mode 100644 mirror_runit/runit-2.1.2/src/warn-auto.sh create mode 100644 mirror_runit/runit-2.1.2/src/warn-shsgr create mode 100644 mirror_runit/runit-2.1.2/src/x86cpuid.c diff --git a/mirror_runit/list_commands.txt b/mirror_runit/list_commands.txt new file mode 100644 index 0000000..a10a9a6 --- /dev/null +++ b/mirror_runit/list_commands.txt @@ -0,0 +1,22 @@ +# Officials: + +chpst +runit +runit-init +runsv +runsvchdir +runsvdir +sv +svlogd +utmpset + + +# Artix-packaged + +halt +pause +poweroff +reboot +zzz + + diff --git a/mirror_runit/runit-2.1.2/doc/benefits.html b/mirror_runit/runit-2.1.2/doc/benefits.html new file mode 100644 index 0000000..b1687d9 --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/benefits.html @@ -0,0 +1,187 @@ + + + +runit - benefits + + +G. Pape
+runit
+
+

runit - benefits

+
+Service supervision
+Clean process state
+Reliable logging facility
+Fast system boot up and shutdown
+Portability
+Packaging friendly
+Small code size +
+

Service supervision

+Each service is associated with a service directory, and each +service daemon runs as a child process of a supervising +runsv process running in this directory. +The runsv program provides a reliable interface +for signalling the service daemon and controlling the service and +supervisor. +Normally the sv program is used to send commands +through this interface, and to query status informations about the service. +

+The runsv program supervises the corresponding +service daemon. +By default a service is defined to be up, that means, if the service daemon +dies, it will be restarted. +Of course you can tell runsv otherwise. +

+This reliable interface to control daemons and supervisors obsoletes +pid-guessing programs, such as pidof, killall, +start-stop-daemon, which, due to guessing, are prone to failures +by design. +It also obsoletes so called pid-files, no need for each and every +service daemon to include code to daemonize, to write the new process id +into a file, and to take care that the file is removed properly on shutdown, +which might be very difficult in case of a crash. +


+

Clean process state

+runit guarantees each service a clean process state, no matter if the +service is activated for the first time or automatically at boot time, +reactivated, or simply restarted. +This means that the service always is started with the same environment, +resource limits, open file descriptors, and controlling terminals. +

+You don't necessarily have that with sysv init scripts for example. +It requires a carefully written init script that reliably cleans up and sets +the process state before starting the service daemon. +This adds even more complexity to the init script in comparison with a run +script used by runit. +Many of today's init scripts don't provide a clean process state, here is +an example on what could happen: +

+ # /etc/init.d/foo-daemon start
+ Starting foo daemon: food.
+ #
+
+Fine. +Everything works, nothing to worry about. +After rebooting the system this shows up on the screen: +
+ ...
+ Starting foo daemon: food: command not found
+ failed.
+ ...
+
+The food program is installed in /opt/foo/bin/. +When starting the service for the first time using the init script, the +PATH environment variable contained /opt/foo/bin. +After reboot init started the service using the init script, but +with a different value for the PATH variable, not containing +/opt/foo/bin. +Of course the init script should have set PATH before starting the +daemon; the problem is that it worked in the first place, and that the error +didn't show up until system reboot. +

+With bad init scripts miraculous things could also happen when just doing +

+ # /etc/init.d/foo-daemon restart
+
+at the command line. +

+The clean process state includes open file descriptors, obsoleting the +widely used hack in many service daemons to force-close all file descriptors +that might be open, up to the limit of available file descriptors for the +daemon process (often results in 1024 unnecessary close() system calls in a +great number of service daemon implementations). +


+

Reliable logging facility

+The runsv program provides a reliable logging +facility for the service daemon. +If configured, runsv creates a pipe, starts and +supervises an additional log service, redirects the log daemon's standard +input to read from the pipe, and redirects the service daemon's standard +output to write to the pipe. +Restarting the service does not require restarting the log service, and vice +versa. +A good choice for a log daemon is runit's service logging daemon +svlogd. +

+The service daemon and the log daemon can run with different process states, +and under different user id's. +runit supports easy and reliable logging for service daemons running +chroot'ed. +

+If runsv is told to shutdown a service, e.g. at +system shutdown, it ensures that the log service stays up as long as the +corresponding service daemon is running and possibly writing to the log. +


+

Fast system boot up and shutdown

+After the system's one time tasks (stage 1) are done, the system services +are started up in parallel. +The operating system's process scheduler takes care of having the services +available as soon as possible. +

+On system shutdown, stage 3 uses runsv's control +interface to wait until each service daemon is terminated and all logs are +written. +Again, services are taken down in parallel. +As soon as all services are down, system halt or system reboot is initiated. +


+

Portability

+runit comes ready-to-run for Debian GNU/Linux and BSD systems, and +can easily be configured to run on other UNIX systems. +The UNIX system's one time initialization tasks and tasks to shutdown the +system must be identified and runit's stages 1 and 3 configured +accordingly. +

+Stages 1 and 3 handle one time tasks. +They only run for short and exit soon. +Stage 2 handles the system's uptime tasks (via the +runsvdir program) and is running the whole +system's uptime. +

+runit's stage 2 is portable across UNIX systems. +runit is well suited for server systems and embedded systems, and +also does its job well on desktop systems. +


+

Packaging friendly

+runit's stages 1 and 3 are distribution specific. +They normally are shell scripts, and an operating system distribution with +software package management should adapt these scripts if they need support +for their package management. +The + +runit-run +Debian package is an attempt to integrate runit into +Debian GNU/Linux as an alternative to +the default + +sysvinit. +

+Stage 2 is packaging friendly: +all a software package that provides a service needs to do is to include +a service directory in the package, and to provide a symbolic link +to this directory in /service/. +The service will be started within five seconds, and automatically at boot +time. +The package's install and update scripts can use the reliable control +interface to stop, start, restart, or send signals to the service. +On package removal, the symbolic link simply is removed. +The service will be taken down automatically. +


+

Small code size

+One of the runit project's principles is to keep the code size +small. +As of version 1.0.0 of runit, the runit.c source contains +330 lines of code; the runsvdir.c source is 274 lines of code, the +runsv.c source 509. +This minimizes the possibility of bugs introduced by programmer's fault, +and makes it more easy for security related people to proofread the source +code. +

+The runit core programs have a very small memory footprint and do not +allocate memory dynamically. +


+
+Gerrit Pape <pape@smarden.org> +
+ + diff --git a/mirror_runit/runit-2.1.2/doc/chpst.8.html b/mirror_runit/runit-2.1.2/doc/chpst.8.html new file mode 100644 index 0000000..97d90f2 --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/chpst.8.html @@ -0,0 +1,152 @@ + + + + + +chpst(8) manual page + + +G. Pape
runit

+ +

Name

+chpst - runs a program with a changed process state +

Synopsis

+chpst [-vP012] +[-u user] [-U user] [-b argv0] [-e dir] [-/ root] [-n inc] [-l|-L lock] [-m bytes] [-d bytes] +[-o n] [-p n] [-f bytes] [-c bytes] prog +

Description

+prog consists of one or +more arguments.

+chpst changes the process state according to the given options, +and runs prog. +

Options

+ +
+ +
-u [:]user[:group]
+
setuidgid. Set uid and gid to the +user’s uid and gid, as found in /etc/passwd. If user is followed by a colon +and a group, set the gid to group’s gid, as found in /etc/group, instead +of user’s gid. If group consists of a colon-separated list of group names, +chpst sets the group ids of all listed groups. If user is prefixed with +a colon, the user and all group arguments are interpreted as uid and gids +respectivly, and not looked up in the password or group file. All initial +supplementary groups are removed.
+ +
-U [:]user[:group]
+
envuidgid. Set the environment +variables $UID and $GID to the user’s uid and gid, as found in /etc/passwd. +If user is followed by a colon and a group, set $GID to the group’s gid, +as found in /etc/group, instead of user’s gid. If user is prefixed with a +colon, the user and group arguments are interpreted as uid and gid respectivly, +and not looked up in the password or group file.
+ +
-b argv0
+
argv0. Run prog +with argv0 as the 0th argument.
+ +
-e dir
+
envdir. Set various +environment variables as specified by files in the directory dir: If dir +contains a file named k whose first line is v, chpst removes the environment +variable k if it exists, and then adds the environment variable k with +the value v. The name k must not contain =. Spaces and tabs at the end of +v are removed, and nulls in v are changed to newlines. If the file k is +empty (0 bytes long), chpst removes the environment variable k if it exists, +without adding a new variable.
+ +
-/ root
+
chroot. Change the root directory to +root before starting prog.
+ +
-n inc
+
nice. Add inc to the nice(2) value before +starting prog. inc must be an integer, and may start with a minus or plus. +
+ +
-l lock
+
lock. Open the file lock for writing, and obtain an exclusive lock +on it. lock will be created if it does not exist. If lock is locked by another +process, wait until a new lock can be obtained.
+ +
-L lock
+
The same as -l, but +fail immediately if lock is locked by another process.
+ +
-m bytes
+
limit memory. +Limit the data segment, stack segment, locked physical pages, and total +of all segment per process to bytes bytes each.
+ +
-d bytes
+
limit data segment. +Limit the data segment per process to bytes bytes.
+ +
-o n
+
limit open files. +Limit the number of open file descriptors per process to n.
+ +
-p n
+
limit processes. +Limit the number of processes per uid to n.
+ +
-f bytes
+
limit output size. Limit +the output file size to bytes bytes.
+ +
-c bytes
+
limit core size. Limit the core +file size to bytes bytes.
+ +
-v
+
verbose. Print verbose messages to standard error. +This includes warnings about limits unsupported by the system.
+ +
-P
+
pgrphack. +Run prog in a new process group.
+ +
-0
+
Close standard input before starting +prog.
+ +
-1
+
Close standard output before starting prog.
+ +
-2
+
Close standard error +before starting prog.
+
+ +

Exit Codes

+chpst exits 100 when called with wrong options. +It prints an error message and exits 111 if it has trouble changing the +process state. Otherwise its exit code is the same as that of prog. +

Emulation

+If +chpst is called as envdir, envuidgid, pgrphack, setlock, setuidgid, or +softlimit, it emulates the functionality of these programs from the daemontools +package respectively. +

See Also

+sv(8), runsv(8), setsid(2), runit(8), runit-init(8), +runsvdir(8), runsvchdir(8)

+ http://smarden.org/runit/
+ http://cr.yp.to/daemontools.html
+ +

Author

+Gerrit Pape <pape@smarden.org>

+ +


+Table of Contents

+

+ + diff --git a/mirror_runit/runit-2.1.2/doc/debian b/mirror_runit/runit-2.1.2/doc/debian new file mode 120000 index 0000000..8784129 --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/debian @@ -0,0 +1 @@ +../etc/debian \ No newline at end of file diff --git a/mirror_runit/runit-2.1.2/doc/dependencies.html b/mirror_runit/runit-2.1.2/doc/dependencies.html new file mode 100644 index 0000000..452b56c --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/dependencies.html @@ -0,0 +1,36 @@ + + + +runit -service dependencies + + +G. Pape
+runit
+
+

runit - service dependencies

+
+runit's service supervision resolves dependencies for service daemons +designed to be run by a supervisor process automatically. +The service daemon (or the corresponding run scripts) should behave +as follows: + +If you want to run service daemons that do not support service supervision +as described above, please refer to +this page +about service dependencies I wrote some time ago. +
+
+Gerrit Pape <pape@smarden.org> +
+ + diff --git a/mirror_runit/runit-2.1.2/doc/faq.html b/mirror_runit/runit-2.1.2/doc/faq.html new file mode 100644 index 0000000..a2eae27 --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/faq.html @@ -0,0 +1,438 @@ + + + +runit - Frequently asked questions + + +G. Pape
+runit
+
+

runit - Frequently asked questions

+
+ +What's runit, why is it that different +
+ +I need some help with runit, what should I do +
+ + +What's the license, is runit free software +
+

+ +How do I run a service under runit service supervision +
+ +How do I create a new service directory +
+ + +How do I create a new service directory with an appendant log service +
+ +How do I tell runit about a new service +
+ +How do I start, stop, or restart a service +
+ +How can I send signals to a service daemon +
+ +How can I query the status of a service +
+ +How do I remove a service +
+

+ +How do I make a service depend on another service +
+ +

+ +What about runlevels +
+ +What about LSB init scripts compliance +
+

+ +Is it possible to allow a user other than root to control a service +
+ +Does runit support user-specific services? +
+ +Does runit work on a read-only filesystem +
+ +


+

+What's runit, why is it that different +

+What is this runit init scheme about? +Why is it that different from sysvinit and other init schemes? +

+Answer: +Please see the introduction, and web page about +runit's benefits. + +


+

+I need some help with runit, what should I do +

+I have a question, runit is doing something wrong, or I'm doing something +wrong, what should I do? +

+Answer: +First see the documentation, especially this list of +frequently asked questions, and the man pages +if you have a question about a specific runit program. +If that still doesn't answer your question, try to search the + +supervision mailing list archive. +Finally, if this fails, feel free to post your question to the +supervision mailing list. + + + +


+

+What's the license, is runit free software +

+I would like to distribute runit, in source and binary form. +Am I allowed to do so? +

+Answer: +runit is free software, it's licensed under a three-clause BSD alike +license. +See the file package/COPYING in the runit tarball. + +


+

+How do I run a service under runit service supervision +

+I want a service to be run under runit service supervision, so that it's +automatically started on system boot, and supervised while system uptime. +How does that work? +

+Answer: +runit doesn't use the usual /etc/init.d/ init script interface, +but uses a directory per service. +To integrate a service into the runit init scheme, +create a service directory for the service, and +tell runit about it. + +


+

+How do I create a new service directory +

+How do I create a service directory for the use with runit? +

+Answer: +Service directories usually are placed into the /etc/sv/ +directory. +Create a new directory for your service in /etc/sv/, put a +./run script into it, and make the script executable. +Note that for the use with runit, +service daemons must not put themself into the +background, but must run in the foreground. +Here's a simple example for a getty service: +

+ $ cat /etc/sv/getty-2/run
+ #!/bin/sh
+ exec getty 38400 tty2 linux
+ $ 
+
+Note the exec in the last line, it tells the shell that +interprets the script to replace itself with the service daemon +getty; this is necessary to make +controlling the service work properly. + + + +
+

+How do I create a new service directory with an appendant log service +

+How do I create a service directory with an appendant log service for the +use with runit? +

+Answer: +First create the service directory for the service. +Then create a subdirectory ./log in the service directory, again +put a ./run script into it, and make the script executable. +The ./run script must run a service logging daemon, normally +this is the svlogd program. +See the runsv man page for details. +Here's an example of a ./log/run script: +

+ $ cat /etc/sv/socklog-klog/log/run
+ #!/bin/sh
+ exec chpst -ulog svlogd -tt ./main
+ $ 
+
+ +
+

+How do I tell runit about a new service +

+I created a service directory for a service that should run under runit +service supervision. +How do I tell runit about the new service directory, so that it picks +up and runs the service by default? +

+Answer: +Create a symbolic link in /service/ pointing to the service +directory, runit will pick up the service within the next five seconds, +and automatically start it on system boot. +E.g.: +

+ # ln -s /etc/sv/getty-2 /service/
+
+ +
+

+How do I start, stop, or restart a service +

+I want to stop a service temporarily, and probably restart is later, or +I want to have it restarted immediately. +How can I control a service running under runit service supervision? +

+Answer: +Use the sv program. +E.g., to restart the socklog-unix service, do: +

+ # sv restart socklog-unix
+
+ +
+

+How can I send signals to a service daemon +

+I want to send a service daemon the HUP signal, to have it re-read its +configuration, or I want to send it the INT signal. +How can a send signals to a service daemon? +

+Answer: +Use the sv program. +E.g., to send the dhcp service the HUP signal, do: +

+ # sv hup dhcp
+
+ +
+

+How can I query the status of a service +

+I want to now the status of a service, whether it is up and available, +or down as requested, or so. +How can I find out this information? +

+Answer: +User the sv program. +E.g., to query or check the status of the socklog-unix service, +do: +

+ # sv status socklog-unix
+
+or +
+ # sv check socklog-unix
+
+ +
+

+How do I remove a service +

+I want to remove a service that currently runs under runit service +supervision. +How do I tell runit? +

+Answer: +Remove the symbolic link in /service/ pointing to the service +directory, runit recognizes the removed service within the next five +seconds, then stops the service, the optional log service, and finally the +supervisor process. +E.g.: +

+ # rm /service/getty-2
+
+ +
+

+How do I make a service depend on another service +

+I have a service that needs another service to be available before it can +start. +How can I tell runit about this dependency? +

+Answer: +Make sure in the ./run script of the dependant service that the +service it depends on is available before the service daemon starts. +The sv program can be used for that. +E.g. the cron service wants the socklog-unix system +logging service to be available before starting the cron service +daemon, so no logs get lost: +

+ $ cat /etc/sv/cron/run
+ #!/bin/sh
+ sv start socklog-unix || exit 1
+ exec cron -f
+ $ 
+
+See also the documentation. + + + +
+

+What about runlevels +

+Other init schemes support runlevels, what about runit? +

+Answer: +runit supports runlevels, even more flexible than traditional init schemes. +See the documentation. + +


+

+What about LSB init scripts compliance +

+I know about the sv program to control a service, +but have applications that rely on the /etc/init.d/ scripts +interface as defined through LSB. +Do I need to change the application to work with runit? +

+Answer: +You don't need to change the application. +The sv program supports the /etc/init.d/ +script interface + +as defined through LSB. +To make this script interface work for a service, create a symbolic link +in /etc/init.d/, named as the service daemon, pointing to the +sv program, e.g. for the cron service: +

+ # ln -s /bin/sv /etc/init.d/cron
+ # /etc/init.d/cron restart
+ ok: run: cron: (pid 5869) 0s
+ # 
+
+ +
+

+Is it possible to allow a user other than root to control a service +

+Using the sv program to control a service, or query +its status informations, only works as root. +Is it possible to allow non-root users to control a service too? +

+Answer: +Yes, you simply need to adjust file system permissions for the +./supervise/ subdirectory in the service directory. +E.g.: to allow the user burdon to control the service +dhcp, change to the dhcp service directory, and do +

+ # chmod 755 ./supervise
+ # chown burdon ./supervise/ok ./supervise/control ./supervise/status
+
+This works similarly with groups, of course. + +
+

+Does runit support user-specific services? +

+It's very nice to simply +create symbolic links to add system-wide services. +Does this work for user-specific services too? +

+Answer: +Yes. +E.g.: to provide the user floyd with facility to manage services +through ~/service/, create a service +runsvdir-floyd with the following run script and a usual log/run +script, and tell runit about the service +

+ #!/bin/sh
+ exec 2>&1
+ exec chpst -ufloyd runsvdir /home/floyd/service
+
+Now floyd can create services on his own, and manage them through +symbolic links in ~/service/ to have them run under his user id. + +
+

+Does runit work on a read-only filesystem +

+On my system /etc/ is mounted read-only by default. +runit uses many files in /etc/ it needs to write to, like +/etc/runit/stopit, and the ./supervise/ +subdirectories in the service directories. +How can I make runit work on my system? +

+Answer: +Use symbolic links, runit deals with them well, even with dangling +symlinks. +E.g., make a ramdisk available at a moint point, say /var/run/, +and create symbolic links for the files and directories that runit needs +to write access to pointing into /var/run/: +

+ # ln -s /var/run/runit.stopit /etc/runit/stopit
+ # ln -s /var/run/sv.getty-2 /etc/sv/getty-2/supervise
+
+ +
+
+Gerrit Pape <pape@smarden.org> +
+ + diff --git a/mirror_runit/runit-2.1.2/doc/index.html b/mirror_runit/runit-2.1.2/doc/index.html new file mode 100644 index 0000000..85bb01b --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/index.html @@ -0,0 +1,261 @@ + + + +runit - a UNIX init scheme with service supervision + + +G. Pape +
+

runit - a UNIX init scheme with service supervision

+
+How to install runit
+Upgrading from previous versions of runit +

+Benefits
+How to replace init
+How to use runit with current init
+How to use dietlibc
+Frequently asked questions
+

+Runlevels
+Service dependencies
+A collection of run scripts
+

+The runit program
+The runit-init program
+
+The sv program
+
+The runsvdir program
+The runsvchdir program
+The runsv program
+
+The svlogd program
+
+The chpst program
+The utmpset program
+


+runit is a +cross-platform Unix init scheme with service supervision, a replacement for +sysvinit, +and other init schemes. +It runs on GNU/Linux, *BSD, MacOSX, Solaris, +and can easily be adapted to other Unix operating systems. +If runit runs for you on any other operating system, please +let me know. +
+runit is discussed on the + +<supervision@list.skarnet.org> +mailing list. +Please contact this list and not me privately. +

+To subscribe send an empty email to + +<supervision-subscribe@list.skarnet.org>. +

+Mailing list archives are available at +skarnet.org, and + +gmane.org. +


+The program runit is intended to run as Unix +process no 1, it is automatically started by the +runit-init /sbin/init-replacement +if this is started by the kernel. +

+runit performs the system's booting, +running and shutting down in three stages: +

+These are working examples for Debian sarge: +/etc/runit/1, +/etc/runit/2, +/etc/runit/3. +

+The program runit-init is intended to +replace /sbin/init. +The command init 0 tells runit to halt the system, +and init 6 to reboot. +Runlevels are handled through the +runsvdir and +runsvchdir programs. +Service dependencies are resolved +automatically. +

+runit is optimized for reliability and small size. +The amount of code in process no 1 should be minimal. +


+See How to install runit for installing +runit, and How to replace init for +configuring runit to run as process no 1. +See How to use with current init if you want to +use runit without replacing the current init scheme. +Please read the list of +Frequently asked questions with answers. +
+If runit on Linux is compiled and linked with the +dietlibc, it yields in a +statically linked runit binary of 8.5k size and this +ps axuw output on my system: +
+ USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
+ root         1  0.0  0.0    20   16 ?        S     2002   0:02 runit
+
+I recommend doing this; for instructions, see +How to use dietlibc. +
+The following distributions are known to include or package runit: + +If you know of more distributions, please +let me know. +
+runit in use: +I replaced sysvinit successfully with runit on several server +systems and a laptop running Debian/GNU Linux sarge, woody, and potato. +Here is an example: +
+ # strings /proc/1/exe |grep Id
+ $Id: runit.c,v 1.7 2002/02/13 09:59:52 pape Exp $
+ # uptime
+  11:59:13 up 365 days, 23:22,  3 users,  load average: 0.01, 0.02, 0.00
+ # ps axuw |head -n20
+ USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
+ root         1  0.0  0.0    20   16 ?        S     2002   0:07 runit
+ root         2  0.0  0.0     0    0 ?        SW    2002   0:00 [keventd]
+ root         3  0.0  0.0     0    0 ?        SWN   2002   0:51 [ksoftirqd_CPU0]
+ root         4  0.0  0.0     0    0 ?        SW    2002 144:38 [kswapd]
+ root         5  0.0  0.0     0    0 ?        SW    2002   0:08 [bdflush]
+ root         6  0.0  0.0     0    0 ?        SW    2002   7:24 [kupdated]
+ root       168  0.0  0.0  1652  168 ?        S     2002   0:27 /usr/sbin/cron
+ root       174  0.0  0.0    36   24 ?        S     2002   1:06 runsvdir /var/service log: ...............................................................................................
+ root       176  0.0  0.0    20   20 ?        S     2002   0:00 runsv qmail-send
+ root       177  0.0  0.0    20   20 ?        S     2002   0:00 runsv getty-5
+ root       178  0.0  0.0    20   20 ?        S     2002   0:00 runsv getty-4
+ root       179  0.0  0.0    20   20 ?        S     2002   0:00 runsv getty-3
+ root       180  0.0  0.0    20   20 ?        S     2002   0:00 runsv getty-2
+ root       182  0.0  0.0    20   20 ?        S     2002   0:00 runsv socklog-unix
+ root       183  0.0  0.0  1256    4 tty5     S     2002   0:00 /sbin/getty 38400 tty5 linux
+ root       184  0.0  0.0  1256    4 tty3     S     2002   0:00 getty 38400 tty3 linux
+ root       185  0.0  0.0    20   20 ?        S     2002   0:00 runsv socklog-klog
+ root       186  0.0  0.0    20   20 ?        S     2002   0:00 runsv ssh
+ root       187  0.0  0.0  1256    4 tty4     S     2002   0:00 getty 38400 tty4 linux
+ # pstree
+ runit-+-bdflush
+       |-cron
+       |-gcache
+       |-keventd
+       |-ksoftirqd_CPU0
+       |-kswapd
+       |-kupdated
+       `-runsvdir-+-runsv-+-multilog
+                  |       `-qmail-send-+-qmail-clean
+                  |                    |-qmail-lspawn
+                  |                    `-qmail-rspawn---qmail-remote
+                  |-4*[runsv---getty]
+                  |-2*[runsv-+-multilog]
+                  |          `-socklog]
+                  |-runsv-+-multilog
+                  |       `-sshd-+-sshd---sshd---bash---bash---pstree
+                  |              `-sshd---sshd---rsync
+                  |-runsv---clockspeed
+                  |-runsv-+-dnscache
+                  |       `-multilog
+                  |-runsv---apache-ssl-+-9*[apache-ssl]
+                  |                    |-gcache
+                  |                    `-4*[multilog]
+                  |-7*[runsv-+-multilog]
+                  |          `-tcpserver]
+                  |-4*[runsv-+-multilog]
+                  |          `-tinydns]
+                  |-runsv---uncat
+                  |-2*[runsv-+-multilog]
+                  |          `-tcpsvd]
+                  |-runsv-+-svlogd
+                  |       `-tcpsvd-+-smtpfront-qmail
+                  |                `-smtpfront-qmail---qmail-queue
+                  `-runsv-+-svlogd
+                          `-tcpsvd---bincimap-up---bincimapd
+
+
+See http://smarden.org/runit/ +for recent informations. +
+Related links: + +
+
+Gerrit Pape <pape@smarden.org> +
+ + diff --git a/mirror_runit/runit-2.1.2/doc/install.html b/mirror_runit/runit-2.1.2/doc/install.html new file mode 100644 index 0000000..fb3b2c4 --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/install.html @@ -0,0 +1,61 @@ + + + +runit - installation + + +G. Pape
+runit
+
+

runit - installation

+
+runit installs into +/package. +If you don't have a /package directory, create it now: +
+ # mkdir -p /package
+ # chmod 1755 /package
+
+Download +runit-2.1.2.tar.gz into /package +and unpack the archive +
+ # cd /package
+ # gunzip runit-2.1.2.tar
+ # tar -xpf runit-2.1.2.tar
+ # rm runit-2.1.2.tar
+ # cd admin/runit-2.1.2
+
+On MacOSX, do +
+ # echo 'cc -Xlinker -x' >src/conf-ld
+ # cp src/Makefile src/Makefile.old
+ # sed -e 's/ -static//' <src/Makefile.old >src/Makefile
+
+Now compile and install the runit programs +
+ # package/install
+
+If you want to make the man pages available in the /usr/local/man/ +hierarchy, do: +
+ # package/install-man
+
+To report success: +
+ # mail pape-runit-2.1.2@smarden.org <compile/sysdeps
+
+If you use runit regularly, please +contribute to the project. +

+Refer to replacing init for +replacing init with runit, or to +use with traditional init for running +runit's service supervision with your system's current init +scheme. +


+
+Gerrit Pape <pape@smarden.org> +
+ + diff --git a/mirror_runit/runit-2.1.2/doc/replaceinit.html b/mirror_runit/runit-2.1.2/doc/replaceinit.html new file mode 100644 index 0000000..70f6f7d --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/replaceinit.html @@ -0,0 +1,254 @@ + + + +runit - replacing init + + +G. Pape
+runit +
+

runit - replacing init

+
+How to replace sysvinit on GNU/Linux
+How to replace init on *BSD
+How to replace init on MacOSX
+How to replace init on Solaris +
+

Replacing sysvinit (GNU/Linux)

+Follow these steps to migrate from sysvinit to runit on +Debian GNU/Linux (woody). +The /sbin/init binary is not replaced until step 6, runit is +the default Unix process no 1 after step 7. +

+If you have installed the precompiled Debian package, start at step 3. +

Step 1: The three stages

+runit looks for the three stages implementing the system's +booting, running and shutdown in /etc/runit/1, +/etc/runit/2 and /etc/runit/3, create the files now: +
+ # mkdir -p /etc/runit
+ # cp -p /package/admin/runit/etc/debian/[123] /etc/runit/
+
+Create also a getty service directory: +
+ # mkdir -p /etc/sv/getty-5
+ # cp -p /package/admin/runit/etc/debian/getty-tty5/run /etc/sv/getty-5/
+ # cp -p /package/admin/runit/etc/debian/getty-tty5/finish /etc/sv/getty-5/
+
+If you want runit to handle the ctrl-alt-del keyboard request, do: +
+ # cp -p /package/admin/runit/etc/debian/ctrlaltdel /etc/runit/
+
+

Step 2: The runit programs

+The runit programs must reside on the root partition, copy them to +/sbin: +
+ # cp -p /package/admin/runit/command/runit* /sbin/
+
+

Step 3: The getties

+At least one getty must run in stage 2 so that you are able to login. +Choose a free tty, say tty5, where sysvinit is not +running any getty (edit /etc/inittab and kill -HUP 1 if +needed), and tell runsvdir about the getty-5 +service: +
+ # mkdir -p /service
+ # ln -s /etc/sv/getty-5 /service/
+
+Start runit's stage 2 for testing: +
+ # /etc/runit/2 &
+
+And check that the getty is running. +

Step 4: Reboot into runit for testing

+Boot your system with runit for the first time. +This does not change the default boot behavior of your system, lilo +will be told to use runit just once: + +If you are not using lilo as boot loader, refer to the documentation +of your boot loader on how to pass init=/sbin/runit-init to the +kernel. +

Step 5: Service migration

+The goal is to migrate all services from sysvinit scheme to the +runit service supervision design; take a look at these +run scripts for popular services. +The migration can be done smoothly. +For those services that are not migrated to use run scripts yet, +add the corresponding init-script startup to /etc/runit/1, +e.g.: +
+ #!/bin/sh
+ # one time tasks
+
+ /etc/init.d/kerneld start
+ /etc/init.d/rmnologin
+
+ touch /etc/runit/stopit
+ chmod 0 /etc/runit/stopit
+
+It is possible to just add /etc/init.d/rc 2 for having all services +from the former runlevel 2 started as one time tasks, but keep the goal above +in mind, supervising services has great advantages. +

+To migrate a service, +create a service directory, disable the service +if it is running, disable the service in /etc/rc.conf or remove the +service startup from the /etc/rc.* scripts and +tell runsvdir about the new service. +

+Repeat step 4 and 5, using /sbin/runit-init 6 to reboot the +system, until you are satisfied with your services startup. +If anything goes wrong, reboot the system into the default sysvinit +/sbin/init and repair the runit stages, then start again at +step 4. +

Step 6: Replace /sbin/init

+Now it is time to replace the sysvinit /sbin/init binary: +
+ # mv /sbin/init /sbin/init.sysv
+ # ln -s runit-init /sbin/init
+
+

Step 7: Final reboot

+The last step is to do the final reboot to boot the system with the new +default Unix process no 1 runit. +
+ # init 6
+
+To report success: +
+ # ( uname -a ; cat /etc/runit/[123] ) |mail pape-runit-2.1.2@smarden.org
+
+
+ +

Replacing init (*BSD)

+Follow these steps to migrate from init to runit on +OpenBSD 2.9 or +FreeBSD 4.4. +The /sbin/init binary is not replaced until step 4. +

Step 1: The three stages

+runit looks for the three stages implementing the system's +booting, running and shutdown in /etc/runit/1, +/etc/runit/2 and /etc/runit/3 respectively. +Create the scripts now: +
+ # mkdir -p /etc/runit
+
+OpenBSD 2.9:
+ # cp -p /package/admin/runit/etc/openbsd/[123] /etc/runit/
+
+FreeBSD 4.4:
+ # cp -p /package/admin/runit/etc/freebsd/[123] /etc/runit/
+
+Remove the svscanboot startup from /etc/rc.local by +deleting the line csh -cf '/command/svscanboot &' (this normally +is the last one); runit will start +runsvdir in stage 2 after running +rc.local in stage 1. +
+ # vi /etc/rc.local
+
+

Step 2: The runit programs

+The runit programs must reside on the root partition, install them +into /sbin: +
+ # install -m0500 /package/admin/runit/command/runit* /sbin/
+
+

Step 3: The getties

+At least one getty must run in stage 2 so that you are able to login. +To have it run on the virtual console no 5, create the getty-5 service +directory: +
+ # mkdir -p /etc/sv/getty-5
+
+OpenBSD 2.9:
+ # cp -p /package/admin/runit/etc/openbsd/getty-ttyC4/run /etc/sv/getty-5/
+ # cp -p /package/admin/runit/etc/openbsd/getty-ttyC4/finish /etc/sv/getty-5/
+
+FreeBSD 4.4:
+ # cp -p /package/admin/runit/etc/freebsd/getty-ttyv4/run /etc/sv/getty-5/
+ # cp -p /package/admin/runit/etc/freebsd/getty-ttyv4/finish /etc/sv/getty-5/
+
+and tell runsvdir about the getty-5 +service: +
+ # mkdir -p /service
+ # ln -s /etc/sv/getty-5 /service/
+
+Start runit's stage 2 for testing: +
+ # /etc/runit/2 &
+
+And check that the getty is running. +

Step 4: Replace the /sbin/init binary

+Before replacing the init binary, make sure that you are able +to boot your system alternatively, e.g. with a boot floppy, to restore the +former /sbin/init if anything goes wrong. +

+Make a backup copy of the current /sbin/init program and replace +it with /sbin/runit-init: +

+ # cp -p /sbin/init /sbin/init.bsd
+ # install /sbin/runit-init /sbin/init
+
+Boot your system with runit for the first time: +
+ # reboot
+
+Watch the console output while runit boots up the system. +Switch to the virtual console 5 (CTRL-ALT-F5) when stage 2 is reached, a +getty should run there, you are able to login. +

+Use init 6 to reboot and init 0 to halt a system that runs +runit. +This will cause runit to enter stage 3 which runs +/sbin/reboot or /sbin/halt as last command. +

+To report success: +

+ # ( uname -a ; cat /etc/runit/[123] ) |mail pape-runit-2.1.2@smarden.org
+
+

Step 5: Service migration

+The goal is to migrate all services from /etc/rc.* scheme to the +runit service supervision design; take a look at these +run scripts for popular services. +The migration can be done smoothly. +By default runit runs the /etc/rc scripts in stage 1 as a +one time task, so the services are started automatically: +
+ #!/bin/sh
+ # system one time tasks
+
+ /bin/sh /etc/rc autoboot
+
+ touch /etc/runit/stopit
+ chmod 0 /etc/runit/stopit
+
+To migrate a service, +create a service directory, disable the service +if it is running, disable the service in /etc/rc.conf or remove the +service startup from the /etc/rc.* scripts and +tell runsvdir about the new service. +
+ +

Replacing init on MacOSX

+Replacing init on MacOSX is not yet supported. +Please refer to the instructions on how to use +runit service supervision with the MacOSX init scheme. +
+ +

Replacing init on Solaris

+Replacing init on Solaris is not yet supported. +Please refer to the instructions on how to use +runit service supervision with the Solaris sysvinit scheme. +
+
+Gerrit Pape <pape@smarden.org> +
+ + diff --git a/mirror_runit/runit-2.1.2/doc/runit-init.8.html b/mirror_runit/runit-2.1.2/doc/runit-init.8.html new file mode 100644 index 0000000..014d2f1 --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/runit-init.8.html @@ -0,0 +1,60 @@ + + + + + +runit-init(8) manual page + + +G. Pape
runit

+ +

Name

+init - a UNIX process no 1 +

Synopsis

+init [ 0 | 6 ] +

Description

+runit-init +is the first process the kernel starts. If runit-init is started as process +no 1, it runs and replaces itself with runit(8).

+If runit-init is started +while the system is up, it must be either called as init 0 or init 6: +

+ +
init +0
+
tells the Unix process no 1 to shutdown and halt the system. To signal +runit(8) the system halt request, runit-init removes all permissions of +the file /etc/runit/reboot (chmod 0), and sets the execute by owner permission +of the file /etc/runit/stopit (chmod 100). Then a CONT signal is sent to +runit(8).
+ +
init 6
+
tells the Unix process no 1 to shutdown and reboot the +system. To signal runit(8) the system reboot request, runit-init sets the +execute by owner permission of the files /etc/runit/reboot and /etc/runit/stopit +(chmod 100). Then a CONT signal is sent to runit(8).
+
+ +

Exit Codes

+runit-init +returns 111 on error, 0 in all other cases. +

See Also

+runit(8), runsvdir(8), +runsvchdir(8), sv(8), runsv(8), chpst(8), utmpset(8), svlogd(8)

+http://smarden.org/runit/ + +

Author

+Gerrit Pape <pape@smarden.org>

+ +


+Table of Contents

+

+ + diff --git a/mirror_runit/runit-2.1.2/doc/runit.8.html b/mirror_runit/runit-2.1.2/doc/runit.8.html new file mode 100644 index 0000000..6c46b39 --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/runit.8.html @@ -0,0 +1,74 @@ + + + + + +runit(8) manual page + + +G. Pape
runit

+ +

Name

+runit - a UNIX process no 1 +

Synopsis

+runit +

Description

+runit must be run +as Unix process no 1. It performs the system’s booting, running, and shutdown +in three stages: +

Stage 1

+runit runs /etc/runit/1 and waits for it to terminate. +The system’s one time tasks are done here. /etc/runit/1 has full control +of /dev/console to be able to start an emergency shell if the one time +initialization tasks fail. If /etc/runit/1 crashes, or exits 100, runit +will skip stage 2 and enter stage 3. +

Stage 2

+runit runs /etc/runit/2, which +should not return until system shutdown; if it crashes, or exits 111, it +will be restarted. Normally /etc/runit/2 starts runsvdir(8). runit is able +to handle the ctrl-alt-del keyboard request in stage 2, see below. +

Stage 3

+If +runit is told to shutdown the system, or stage 2 returns, it terminates +stage 2 if it is running, and runs /etc/runit/3. The systems tasks to shutdown +and possibly halt or reboot the system are done here. If stage 3 returns, +runit checks if the file /etc/runit/reboot exists and has the execute by +owner permission set. If so, the system is rebooted, it’s halted otherwise. + +

Ctrl-alt-del

+If runit receives the ctrl-alt-del keyboard request and the file +/etc/runit/ctrlaltdel exists and has the execute by owner permission set, +runit runs /etc/runit/ctrlaltdel, waits for it to terminate, and then sends +itself a CONT signal. +

Signals

+runit only accepts signals in stage 2.

+If runit +receives a CONT signal and the file /etc/runit/stopit exists and has the +execute by owner permission set, runit is told to shutdown the system.

+if +runit receives an INT signal, a ctrl-alt-del keyboard request is triggered. + +

See Also

+runit-init(8), runsvdir(8), runsvchdir(8), sv(8), runsv(8), chpst(8), +utmpset(8), svlogd(8)

+http://smarden.org/runit/ +

Author

+Gerrit Pape <pape@smarden.org> +

+ +


+Table of Contents

+

+ + diff --git a/mirror_runit/runit-2.1.2/doc/runlevels.html b/mirror_runit/runit-2.1.2/doc/runlevels.html new file mode 100644 index 0000000..c0e49c3 --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/runlevels.html @@ -0,0 +1,98 @@ + + + +runit - runlevels + + +G. Pape
+runit
+
+

runit - runlevels

+
+Prepare runit for using runlevels
+Switching runlevels
+Creating runlevels +
+

Prepare runit

+If not yet done, configure your system to use +runit as process no 1 by following the +instructions. +

+Create the following directories and symbolic links: +

+ # mkdir -p /etc/runit/runsvdir/default
+ # mkdir -p /etc/runit/runsvdir/single
+ # ln -s /etc/sv/getty-5 /etc/runit/runsvdir/single/
+ # ln -s default /etc/runit/runsvdir/current
+
+Copy the contents of /service/ to +/etc/runit/runsvdir/current/ and replace /service/ +with a symbolic link: +
+ # cp -pR /service/* /etc/runit/runsvdir/current/
+ # mv -f /service /service.old && \
+     ln -s /etc/runit/runsvdir/current /service
+
+You have now created two runlevels: default and single. +The current runlevel is default. +It is safe to remove /service.old/ if you don't need it anymore. +

+Finally edit /etc/runit/2 to set the default runlevel when +stage 2 starts: +

+ $ cat /etc/runit/2 
+ #!/bin/sh
+ PATH=/command:/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin
+ 
+ runsvchdir default >/dev/null
+ 
+ exec env - PATH=$PATH \
+ runsvdir /service 'log: ...........................................................................................................................................................................................................................................................................................................................................................................................................'
+
+
+

Switching runlevels

+Switching runlevels with runit is done by switching the directory the +runsvdir program is running in. +This is done by the runsvchdir program, e.g. +to switch to the single user runlevel, do: +
+ # runsvchdir single
+
+To switch back to the default runlevel, do: +
+ # runsvchdir default
+
+See the runsvdir program for a description of +what happens when runsvdir sees the directory changed. +Note that there is no guarantee that all services from the previous +runlevel will stop, the runsv processes have sent +the service daemons a SIGTERM and wait for them to terminate. +You can check the status of the previous runlevel through +/etc/runit/runsvdir/previous/. +
+

Creating new runlevels

+To create a new runlevel, simply create a new directory in +/etc/runit/runsvdir/. +The name of the directory is the name of the new runlevel. +The name must not start with a dot and must not be current, +current.new, or previous, e.g.: +
+ # mkdir /etc/runit/runsvdir/maintenance
+
+Add the services you want to run in the runlevel maintenance to the +newly created directory, e.g.: +
+ # ln -s /etc/sv/getty-5 /etc/runit/runsvdir/maintenance/
+ # ln -s /etc/sv/ssh /etc/runit/runsvdir/maintenance/
+ # ln -s /etc/sv/dnscache /etc/runit/runsvdir/maintenance/
+
+If you want to switch to the runlevel maintenance, do: +
+ # runsvchdir maintenance
+
+
+
+Gerrit Pape <pape@smarden.org> +
+ + diff --git a/mirror_runit/runit-2.1.2/doc/runscripts.html b/mirror_runit/runit-2.1.2/doc/runscripts.html new file mode 100644 index 0000000..f832b63 --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/runscripts.html @@ -0,0 +1,1058 @@ + + + +runit - collection of run scripts + + +G. Pape
+runit
+How to replace init +
+

runit - collection of run scripts

+
+This is a collection of run scripts for popular services to have +them monitored by the +daemontools or +runit package. +If you have additional run scripts or one of these run scripts works for you on +an operating system not stated here, please +let me know. +

+Thanks go to the following people for contributing run scripts: + +Alessandro Bono, Robin S. Socha, Claus Alboege, Paul Jarc, clemens fischer, +Jesse Cablek, Lukas Beeler, Thomas Baden, Ralf Hildebrandt, Antonio Dias, +Erich Schubert, Lang Martin, Tomasz Nidecki, Marek Bartnikowski, +Thomas Schwinge, Gael Canal, Woon Wai Keen, Richard A Downing, Phil Genera, +Stefan Karrmann, Kevin Berry, Karl Chen, Sascha Huedepohl, Jason Smith, +Kevin, marlowe, ed neville, xavier dutoit. + +

+See also +here for some more run +scripts. +


+atftpd
+apache
+apache2
+atd
+bind9
+boa
+cfengine
+cfsd
+chrony
+clamav
+clamsmtpd
+courier-imap
+cron
+cups
+dhclient
+dhcpcd
+dhcpd
+dictd
+dropbear
+exim
+expireproctitle
+fam
+fcron
+fetchmail
+gdm
+getty
+gpm
+hotwayd
+identd
+inn
+jabberd
+junkbuster
+kdm
+keepalived
+klogd
+leafnode
+logging Linux kernel messages
+ +logging console messages
+mdadm
+minidentd
+mpd
+nscd
+ntpd
+nullidentd
+polipo
+pop3-ssl
+pop3vscan
+portmap
+postfix
+postgresql
+powernowd
+ppp
+privoxy
+proftpd
+pure-ftpd
+radiusd
+rmrtg
+rsyncd
+samba (smbd, nmbd)
+shoutcast
+spamd
+squid
+sshd
+sshd under tcpserver
+statd, mountd
+stunnel
+subversion
+swat
+syslogd
+taiclockd
+tmda-ofmipd
+tomcat
+tor
+vsftpd
+wvdial
+xdm
+xfs
+
+ +

An atftpd run script

+(Debian) +
+ #!/bin/sh
+ exec in.tftpd --daemon --no-fork --tftpd-timeout 30 \
+   --retry-timeout 5 --no-tsize --no-blksize --no-multicast \
+   --maxthread 1000 --verbose=7 /var/atfpd 2>&1
+
+
+

An apache run script

+(SunOS, Apache 1.*, patched to run under supervise) +
+ #!/bin/sh
+ exec 2>&1
+ exec env -i \
+ /pack/apache/1.3.27-1/sbin/httpd -F 2>&1
+
+(Debian woody) +
+ #!/bin/sh
+ exec 1>&2
+ exec apache-ssl -F
+
+
+

An apache2 run script

+(SunOS) +
+ #!/bin/sh
+ exec 2>&1
+ exec env -i /command/pgrphack \
+ /pack/apache/2.0.43-1/sbin/httpd -DFOREGROUND 2>&1
+
+(HP-UX/GNU, Linux) +
+ #!/bin/sh
+ TZ=MET-1METDST
+ export TZ
+ exec /usr/local/apache2/bin/httpd -DNO_DETACH
+
+
+

An atd run script

+(Debian sarge) +
+ #!/bin/sh
+ exec 2>&1
+ exec atd -d
+
+
+

A bind9 run script

+(Linux) +
+ #!/bin/sh
+ MEM="`head -1 ./env/MEM`"
+ CHROOT="`head -1 ./env/CHROOT`"
+ exec softlimit -m "${MEM}" \
+   named -u bind -t "${CHROOT}" -g 2>&1
+
+(HP-UX/GNU, Linux) +
+ #!/bin/sh
+ exec named -f -t /var/spool/named/ -u named
+
+
+

A boa run script

+(SunOS) +
+ #!/bin/sh
+ exec 2>&1
+ ulimit -n 1024
+ exec /pack/boa/current/boa -c /pack/boa/current -d 2>&1
+
+
+

A cfengine run script

+(SunOS) +
+ #!/bin/sh
+ /pack/cfengine/sbin/cfagent --file /pack/cfengine/etc/cfagent.conf \
+   -L -v -q exec sleep 3600
+
+
+

A cfsd run script

+(Debian sarge) +
+ #!/bin/sh
+ exec 2>&1
+ 
+ set -e
+ 
+ PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
+ DAEMON=cfsd
+ CONFIG_FILE=/etc/cfs.conf
+ 
+ # source config file
+ test ! -r "$CONFIG_FILE" || . "$CONFIG_FILE"
+ 
+ test -n "$CRYPT_ROOT" || exit 0
+ test -n "$NULL_EXPORT" || exit 0
+ test -n "$CFS_MOUNT" || exit 0
+ test -n "$CFS_UMOUNT" || exit 0
+ 
+ sv start portmap || exit 1
+ 
+ exec env \
+    NODAEMON=1 CFS_MOUNT="$CFS_MOUNT" CFS_UMOUNT="$CFS_UMOUNT" $DAEMON
+
+
+

A chrony run script

+(LFS) +
+ #!/bin/sh
+ exec 2>&1
+ exec chronyd -d -r -s
+
+This service needs a +log service +to be set up. +
+

A clamd run script

+(RedHat 7) +
+ #!/bin/sh
+ exec 2>&1
+ exec setuidgid clamav softlimit -a 40000000 clamd
+
+This service needs a +log service +to be set up. +
+

A clamsmtpd run script

+(Debian sarge) +
+ #!/bin/sh
+ exec 2>&1
+ exec chpst -uclamav clamsmtpd -d 3
+
+This service needs a +log service +to be set up. +
+

A courier-imap run script

+(SunOS) +
+ #!/bin/sh
+ exec 2>&1
+ PREFIX="/usr/lib/courier-imap"
+ exec envdir ./env \
+   tcpserver -v -R 0 143 \
+   $PREFIX/sbin/imaplogin \
+   $PREFIX/libexec/authlib/authshadow \
+   $PREFIX/libexec/authlib/authvchkpw \
+   $PREFIX/bin/imapd Maildir
+
+See also +this page. +
+

A cron run script

+(Debian sarge) +
+ #!/bin/sh
+ exec 2>&1
+ exec cron -f -l
+
+
+

A cups run script

+(Debian woody) +
+ #!/bin/sh
+ exec 2>&1
+ exec cupsd -f
+
+
+

A dhclient run script

+(Debian woody) +
+ #!/bin/sh
+ exec dhclient -e -d -cf ./config -lf ./leases -pf ./pid eth1
+
+
+

A dhcpcd run script

+(Linux, DHCP Client Daemon v.scriptconfig-0.1) +
+ #!/bin/sh
+ exec dhcpcd -a -d -D -H eth0
+
+
+

A dhcpd run script

+(Debian woody) +
+ #!/bin/sh
+ exec 2>&1
+ exec dhcpd-2.2.x -f -d -cf ./config eth0
+
+This service needs a +log service +to be set up. +

+(Solaris 8, uses additional dsvclockd service, would get fired off +automatically, but then it's not supervised) +

+ #!/bin/sh
+ exec 2>&1
+ exec envdir ./env /usr/lib/inet/dsvclockd -f
+
+
+ #!/bin/sh
+ if svok /service/dsvclockd; then
+   sleep 2 # wait to make sure dsvclockd is initialized
+   exec 2>&1
+   exec envdir ./env /usr/lib/inet/in.dhcpd -b manual -d # -v
+ fi
+ echo dsvclockd is not running - aborting
+ exec /usr/bin/sleep 5
+
+The in.dhcpd service needs a +log service +to be set up. +
+

A dictd run script

+(Debian sarge) +
+ #!/bin/sh
+ exec 2>&1
+ exec dictd -d nodetach
+
+
+

A dropbear run script

+(Linux) +
+ #!/bin/sh
+ exec 2>&1
+ exec dropbear -F -E -p 22
+
+This service needs a +log service +to be set up. +

+(Linux, running under +tcpsvd) +

+ #!/bin/sh
+ exec 2>&1
+ exec tcpsvd -v -i./peers 0 22 dropbear -i -E
+
+This service needs a +log service +to be set up. +
+

An exim run script

+(Linux, FreeBSD) +
+ #!/bin/sh
+ exec /usr/local/sbin/exim -bdf -q30m
+
+
+

+expireproctitle run script examples

+(Linux) +
+ #!/bin/sh
+ echo -n .
+ exec sleep 300
+
+
+

A fam run script

+(Slackware Linux 9.0) +
+ #!/bin/sh
+ exec 2>&1
+ exec fam -L -f -v
+
+This service needs a +log service +to be set up. +

+(Debian sarge) +

+ #!/bin/sh
+ exec 2>&1
+ sv start /service/portmap || exit 1
+ exec famd -T 0 -f
+
+
+

A postfix master run script

+(Debian etch) +
+ #!/bin/sh
+ exec 1>&2
+ 
+ daemon_directory=/usr/lib/postfix \
+ command_directory=/usr/sbin \
+ config_directory=/etc/postfix \
+ queue_directory=/var/spool/postfix \
+ mail_owner=postfix \
+ setgid_group=postdrop \
+   /etc/postfix/postfix-script check || exit 1
+ 
+ exec /usr/lib/postfix/master
+
+
+

A fcron run script

+(LFS) +
+ #!/bin/sh
+ exec 2>&1
+ exec fcron -f -y
+
+This service needs a +log service +to be set up. +
+

A fetchmail run script

+(Linux) +
+ #!/bin/sh
+ INTERVAL=551
+ exec 2>&1
+ echo "*** Starting fetchmail service..."
+ exec env FETCHMAILHOME="./pid" \
+   chpst -u fetchmail fetchmail -v \
+     -f ./fetchmail.conf \
+     --nodetach \
+     --daemon ${INTERVAL}
+
+
+

A gdm run script

+(Debian woody) +
+ #!/bin/sh
+ exec gdm -nodaemon
+
+
+

A mingetty run script

+(Debian) +
+ #!/bin/sh
+ exec mingetty tty5
+
+The runit package does not care about utmp records +for getties. You should choose a getty that handles its own utmp and wtmp +records. +Debian's mingetty creates its own utmp record. +

An agetty run script

+(Slackware Linux 9.0) +
+ #!/bin/sh
+ exec agetty 38400 tty1 linux
+
+

A fgetty run script

+(Linux) +
+ #!/bin/sh
+ exec chpst -P fgetty tty4
+
+The runsv program does not automatically create +a new session and separate process group for run scripts, which can +cause some getties to fail due to limited permissions. +The chpst program can be used to alter the +process state for those getties. +
+

A gpm run script

+(LFS) +
+ #!/bin/sh
+ exec 2>&1
+ . /etc/sysconfig/mouse
+ exec gpm -D -m $MDEVICE -t $PROTOCOL
+
+
+

A hotwayd run script

+(LFS) +
+ #!/bin/sh
+ exec 2>&1
+ exec tcpsvd -l0 -u nobody 127.0.0.1 110 hotwayd
+
+
+

An oidentd run script

+(Linux, oidentd version 2.0.6) +
+ #!/bin/sh
+ exec 2>&1
+ exec oidentd -i -S -t 10 -u daemon -g daemon
+
+This service needs a +log service +to be set up. +

+(Debian) +

+ #!/bin/sh
+ exec /usr/local/sbin/oidentd --nosyslog -i -u ident -g ident -l 15 -m \
+   -C /etc/oidentd/oidentd.conf 2>&1
+
+This service needs a +log service +to be set up. +
+

An innd run script

+(Linux) +
+ #!/bin/sh
+ MEM="`head -1 ./env/MEM`"
+ exec softlimit -m "${MEM}" \
+   setuidgid news \
+   /usr/sw/bin/news/inndstart -f -r
+
+
+

jabberd run scripts

+(RedHat 7) +
+ #!/bin/sh
+ exec 2>&1
+ if [ -f /usr/local/jabber/jabber.pid ]; then
+   rm /usr/local/jabber/jabber.pid
+ fi
+ exec setuidgid jabberd \
+   /usr/local/jabber/jabberd/jabberd -D -c /etc/jabber.xml
+
+This service needs a +log service +to be set up. +
+ #!/bin/sh
+ exec 2>&1
+ sleep 5 # so that jit starts after jabberd is up
+ exec setuidgid jabberd \
+   /usr/local/jabber/jit/jabberd/jabberd -c /etc/jit.xml
+
+This service needs a +log service +to be set up. +
+

A junkbuster run script

+(Debian sarge) +
+ #!/bin/sh
+ exec 2>&1
+ DAEMON=junkbuster
+ exec "$DAEMON" /etc/junkbuster/config
+
+
+

A kdm run script

+(Debian sid, FreeBSD 5.3-REL) +
+ #!/bin/sh
+ sv start /service/getty-* || exit 1
+ exec kdm -nodaemon
+
+
+

A keepalived run script

+(Linux) +
+ #!/bin/sh
+ exec 2>&1
+ exec keepalived -n
+
+
+

A klogd run script

+(Debian woody) +
+ #!/bin/sh
+ exec klogd -n
+
+
+

A leafnode run script

+(Linux) +
+ #!/bin/sh
+ exec 2>&1
+ exec envuidgid news \
+   tcpserver -v -x rules.cdb -c 10 -U 0 119 \
+   leafnode
+
+This service needs a +log service +to be set up. +
+

+A run script for logging Linux kernel messages with multilog

+(Linux) +
+ #!/bin/sh -e
+ exec < /proc/kmsg \
+ setuidgid loguser \
+ multilog t n64 ./main
+
+
+

A mdadm run script

+(Debian sarge) +
+ #!/bin/sh
+ DEBIANCONFIG=/etc/default/mdadm
+ MAIL_TO=root
+ test -f $DEBIANCONFIG && . $DEBIANCONFIG
+ exec mdadm --monitor --scan --mail $MAIL_TO
+
+
+

A minidentd run script

+(Linux) +
+ #!/bin/sh
+ exec 2>&1
+ exec envuidgid nobody \
+   tcpserver -vUR 0 113 \
+   timeoutafter 60 \
+   minidentd -v
+
+This service needs a +log service +to be set up. +
+

A mpd run script

+(Debian sid, FreeBSD 5.3-REL) +
+ #!/bin/sh
+ MPDCONF=/etc/mpd.conf
+ exec mpd --stdout --no-daemon $MPDCONF
+
+This service needs a +log service +to be set up. +
+

A nscd run script

+(Debian sarge) +
+ #!/bin/sh
+ secure=""
+ for table in passwd group
+   do
+     if egrep '^'$table':.*nisplus' /etc/nsswitch.conf >/dev/null
+       then
+         nscd_nischeck $table || secure="$secure -S $table,yes"
+     fi
+ done
+ exec nscd -d -- $secure
+
+
+

A ntpd run script

+(Linux) +
+ #!/bin/sh
+ MEM=`head -1 ./env/MEM`
+ exec softlimit -m "${MEM}" \
+   ntpd -n
+
+(OpenNTPD on OpenBSD/Linux) +
+ #!/bin/sh
+ exec /usr/sbin/ntpd -s -d 2>&1
+
+This service needs a +log service +to be set up. +
+

A nullidentd run script

+(Debian sarge) +
+ #!/bin/sh
+ exec 2>&1
+ exec tcpsvd -u nobody -x nullidentd-cdb -t 60 0 113 nullidentd
+
+This service needs a +log service +to be set up. +
+

A polipo run script

+(Linux) +
+ #!/bin/sh
+ exec 2>&1
+ exec setuidgid polipo \
+   polipo -c config forbiddenFile="`pwd`"/forbidden diskCacheRoot="`pwd`"/cache
+
+This service needs a +log service +to be set up. +
+

A pop3-ssl run script

+(BSD) +
+ #!/bin/sh
+ exec tcpserver -R -v -c 50 0 995 /usr/local/sbin/stunnel
+ -f  -p /etc/ssl/stunnel.pem \
+ -l /var/qmail/bin/qmail-popup -- /var/qmail/bin/qmail-popup
+ "`cat /var/qmail/control/me`" vchkpw /var/qmail/bin/qmail-pop3d Maildir 2>&1
+
+This service needs a +log service +to be set up. +
+

A pop3vscan run script

+(RedHat 7) +
+ #!/bin/sh
+ exec 2>&1
+ exec setuidgid pop3vscan pop3vscan -d
+
+This service needs a +log service +to be set up. +
+

A portmap run script

+(LFS, Debian sarge) +
+ #!/bin/sh
+ exec 2>&1
+ exec portmap -d
+
+
+

A postgresql run script

+(Debian, SunOS) +
+ #!/bin/sh
+ exec setuidgid postgres /usr/lib/postgresql/bin/postmaster \
+   -D /var/lib/postgres/data 2>&1
+
+This service needs a +log service +to be set up. +
+

A powernowd run script

+(Debian) +
+ #!/bin/sh
+ set -e  # barf if modprobe fails
+ modprobe cpufreq-userspace
+ test ! -f /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor ||
+   exec /usr/sbin/powernowd -d
+ 
+ echo "required sysfs objects not found!"
+ echo "Read /usr/share/doc/powernowd/README.Debian for more information."
+ sv down "$(pwd)"
+
+
+

A ppp run script

+(FreeBSD) +
+ #!/bin/sh
+ exec 2>&1
+ echo "ppp -ddial dsl "
+ exec ppp -unit0 -foreground dsl
+
+

A pppd run script

+(Linux) +
+ #!/bin/sh
+ exec 2>&1
+ exec chpst -P pppd call isp nodetach
+
+
+

A privoxy run script

+(Debian sarge) +
+ #!/bin/sh
+ exec 2>&1
+ exec chpst -u privoxy:nogroup privoxy --no-daemon /etc/privoxy/config
+
+This service needs a +log service +to be set up. +
+

A proftpd run script

+(Linux, ProFTPD Version 1.2.8rc1, +configure it to use 'ErrorLog "/dev/stdout"') +
+ #!/bin/sh
+ exec 2>&1
+ exec proftpd -n -d 1
+
+This service needs a +log service +to be set up. +
+

A pure-ftpd run script

+(Debian woody) +
+ #!/bin/sh
+ exec 2>&1
+ exec pure-ftpd -a 50 -E -l pam -u 100
+
+
+

A radiusd run script

+(Slackware Linux 9.0, cistron radius 1.6.1) +
+ #!/bin/sh
+ exec 2>&1
+ exec radiusd -f -y -z -lstdout
+
+This service needs a +log service +to be set up. +
+

A rmrtg run script

+() +
+ #!/bin/sh
+ MRTGUID=`id -u mrtg`
+ MRTGGID=`id -g mrtg`
+ exec 2>&1
+ exec tcpserver -l 0 -R -H -q \
+   -u"${MRTGUID}" -g"${MRTGGID}" 0 5660 /home/mrtg/ext/rmrtg
+
+
+

A rsyncd run script

+(SunOS) +
+ #!/bin/sh
+ exec 2>&1
+ exec softlimit -d 100000000 tcpserver \
+   -x /pack/rsync/rsync.service/tcp.rsync.cdb -v -c 100 -U -H -l 0 -R \
+   1.2.3.4 873 nice -2 /pack/rsync/bin/rsync --daemon --no-detach \
+   --config /pack/rsync/etc/rsyncd.conf
+
+This service needs a +log service +to be set up. +
+

A smbd run script

+(Linux) +
+ #!/bin/sh
+ PATH="/usr/local/samba/bin"
+ exec 2>&1
+ exec smbd -F -S -d3
+
+This service needs a +log service +to be set up. +

A nmbd run script

+(Linux) +
+ #!/bin/sh
+ PATH="/usr/local/samba/bin"
+ exec 2>&1
+ exec nmbd -F -S -d1
+
+This service needs a +log service +to be set up. +
+

A shoutcast run script

+(RedHat 7) +
+ #!/bin/sh
+ exec 2>&1
+ exec setuidgid sc_serv \
+   /usr/local/sc_serv/bin/sc_serv /etc/sc_serv.conf
+
+This service needs a +log service +to be set up. +
+

A spamd run script

+(Debian woody) +
+ #!/bin/sh
+ exec spamd -m 20 -a -H -s stderr 2>&1
+
+This service needs a +log service +to be set up. +
+

A squid run script

+(Debian woody) +
+ #!/bin/sh
+ exec squid -f ./config -sN
+
+
+

A sshd run script

+(Debian) +
+ #!/bin/sh
+ exec 2>&1
+ exec /usr/sbin/sshd -D -e
+
+This service needs a +log service +to be set up. +
+

+A sshd (under tcpserver) run script

+(Linux, sshd version OpenSSH_3.4p1) +
+ #!/bin/sh -e
+ exec 2>&1
+ exec \
+ tcpserver -1vpdl0 -Xxtcp.cdb 0 ssh \
+ sshd -ief config
+
+This service needs a +log service +to be set up. +
+

A statd run script

+(Debian woody) +
+ #!/bin/sh
+ exec 2>&1
+ NEED_LOCKD=yes
+ if test -f /proc/ksyms; then
+   # We need to be conservative and run lockd,
+   # unless we can prove that it isn't required.
+   grep -q lockdctl /proc/ksyms || NEED_LOCKD=no
+ fi
+ if [ "$NEED_LOCKD" = yes ]; then
+   rpc.lockd
+ fi
+ exec rpc.statd -F -d
+
+This service needs a +log service +to be set up. +

A mountd run script

+(Debian) +
+ #!/bin/sh
+ sv start portmap statd || exit 1
+ RPCNFSDCOUNT=8  # Number of servers to be started up by default
+ RPCMOUNTDOPTS=
+ 
+ trap '/usr/bin/killall -2 nfsd' 0
+ trap 'exit 2' 1 2 3 15
+ 
+ exportfs -r
+ rpc.nfsd -- $RPCNFSDCOUNT
+ rpcinfo -u localhost nfs 3 >/dev/null 2>&1 ||
+   RPCMOUNTDOPTS="$RPCMOUNTDOPTS --no-nfs-version 3"
+ exec rpc.mountd -F $RPCMOUNTDOPTS
+
+
+

A stunnel run script

+(BSD) +
+ #!/bin/sh
+ exec /usr/local/sbin/stunnel -f -d 1234 -r 25 -v3 -a /etc/ssl/mailcerts 2>&1
+
+
+

A svnserve run script

+(Debian) +
+ #!/bin/sh
+ exec 2>&1
+ exec /usr/bin/svnserve -d --foreground
+
+
+

A swat run script

+
+ #!/bin/sh
+ exec 2>&1
+ exec tcpsvd -l0 127.0.0.1 901 swat
+
+
+

A syslogd run script

+(Debian sarge) +
+ #!/bin/sh
+ exec syslogd -n
+
+
+

A taiclockd run script

+
+ #!/bin/sh
+ exec 2>&1
+ exec setuidgid taiclock /usr/local/clockspeed/bin/taiclockd
+
+
+

A tmda-ofmipd run script

+(RedHat 7) +
+ #!/bin/sh
+ exec /usr/local/tmda/bin/tmda-ofmipd -f -d -R pop3 -p my.host.name:8025 2>&1
+
+This service needs a +log service +to be set up. +
+

A tomcat run script

+(SunOS) +
+ #!/bin/sh
+ exec 2>&1
+ exec \
+ setuidgid apache \
+ /pack/tomcat/current/bin/catalina.sh run
+
+
+

A tor run script

+(Debian sarge) +
+ #!/bin/sh
+ exec 2>&1
+ exec chpst -P -u debian-tor:debian-tor tor
+
+
+

A vsftpd run script

+(RedHat 7) +
+ #!/bin/sh
+ exec 2>&1
+ exec tcpserver -c30 -Xv -llocalhost \
+   -x/etc/tcp.ftp.cdb -uvsftpd -gvsftpd 0 ftp \
+     softlimit -d300000 /var/vsftpd/bin/vsftpd
+
+This service needs a +log service +to be set up. +
+

A wvdial run script

+(Slackware Linux 9.0, the service should have a down +file, use svc -o /service/wvdial to bring up a ppp connection) +
+ #!/bin/sh
+ exec 2>&1
+ exec wvdial ISP
+
+This service needs a +log service +to be set up. +
+

A xdm run script

+(Linux) +
+ #!/bin/sh
+ sv start /service/vc-* || exit 1
+ exec xdm -nodaemon
+
+
+

A xfs run script

+(Debian sarge) +
+ #!/bin/sh
+ SOCKET_DIR=/tmp/.font-unix
+ mkdir -p $SOCKET_DIR
+ chown 0:0 $SOCKET_DIR
+ chmod 1777 $SOCKET_DIR
+ exec /usr/bin/X11/xfs -nodaemon
+
+
+
+Gerrit Pape <pape@smarden.org> +
+ + diff --git a/mirror_runit/runit-2.1.2/doc/runsv.8.html b/mirror_runit/runit-2.1.2/doc/runsv.8.html new file mode 100644 index 0000000..d27deeb --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/runsv.8.html @@ -0,0 +1,157 @@ + + + + + +runsv(8) manual page + + +G. Pape
runit

+ +

Name

+runsv - starts and monitors a service and optionally an appendant log +service +

Synopsis

+runsv service +

Description

+service must be a directory.

+runsv +switches to the directory service and starts ./run. If ./run exits and ./finish +exists, runsv starts ./finish. If ./finish doesn’t exist or ./finish exits, +runsv restarts ./run.

+If ./run or ./finish exit immediately, runsv waits a +second before starting ./finish or restarting ./run.

+Two arguments are given +to ./finish. The first one is ./run’s exit code, or -1 if ./run didn’t exit normally. +The second one is the least significant byte of the exit status as determined +by waitpid(2); for instance it is 0 if ./run exited normally, and the signal +number if ./run was terminated by a signal. If runsv cannot start ./run for +some reason, the exit code is 111 and the status is 0.

+If the file service/down +exists, runsv does not start ./run immediately. The control interface (see +below) can be used to start the service and to give other commands to runsv. +

+If the directory service/log exists, runsv creates a pipe, redirects service/run’s +and service/finish’s standard output to the pipe, switches to the directory +service/log and starts ./run (and ./finish) exactly as described above for +the service directory. The standard input of the log service is redirected +to read from the pipe.

+runsv maintains status information in a binary format +(compatible to the daemontools’ supervise program) in service/supervise/status +and service/log/supervise/status, and in a human-readable format in service/supervise/stat, +service/log/supervise/stat, service/supervise/pid, service/log/supervise/pid. + +

Control

+The named pipes service/supervise/control, and (optionally) service/log/supervise/control +are provided to give commands to runsv. You can use sv(8) to control the +service or just write one of the following characters to the named pipe: + +
+ +
u
+
Up. If the service is not running, start it. If the service stops, restart +it.
+ +
d
+
Down. If the service is running, send it a TERM signal, and then a +CONT signal. If ./run exits, start ./finish if it exists. After it stops, do +not restart service.
+ +
o
+
Once. If the service is not running, start it. Do not +restart it if it stops.
+ +
p
+
Pause. If the service is running, send it a STOP +signal.
+ +
c
+
Continue. If the service is running, send it a CONT signal.
+ +
h
+
Hangup. +If the service is running, send it a HUP signal.
+ +
a
+
Alarm. If the service +is running, send it a ALRM signal.
+ +
i
+
Interrupt. If the service is running, +send it a INT signal.
+ +
q
+
Quit. If the service is running, send it a QUIT signal.
+ +
1
+
User-defined 1. If the service is running, send it a USR1 signal.
+ +
2
+
User-defined 2. If the service is running, send it a USR2 signal.
+ +
t
+
Terminate. If the service +is running, send it a TERM signal.
+ +
k
+
Kill. If the service is running, send +it a KILL signal.
+ +
x
+
Exit. If the service is running, send it a TERM signal, +and then a CONT signal. Do not restart the service. If the service is down, +and no log service exists, runsv exits. If the service is down and a log +service exists, runsv closes the standard input of the log service, and +waits for it to terminate. If the log service is down, runsv exits. This +command is ignored if it is given to service/log/supervise/control.
+
+

+Example: +to send a TERM signal to the socklog-unix service, either do # sv term +/service/socklog-unix
+ or
+ # printf t >/service/socklog-unix/supervise/control
+

+printf(1) usually blocks if no runsv process is running in the service +directory. +

Customize Control

+For each control character c sent to the control +pipe, runsv first checks if service/control/c exists and is executable. +If so, it starts service/control/c and waits for it to terminate, before +interpreting the command. If the program exits with return code 0, runsv +refrains from sending the service the corresponding signal. The command +o is always considered as command u. On command d first service/control/t +is checked, and then service/control/d. On command x first service/control/t +is checked, and then service/control/x. The control of the optional log +service cannot be customized. +

Signals

+If runsv receives a TERM signal, it +acts as if the character x was written to the control pipe. +

Exit Codes

+runsv +exits 111 on an error on startup or if another runsv is running in service. +

+runsv exits 0 if it was told to exit. +

See Also

+sv(8), chpst(8), svlogd(8), +runit(8), runit-init(8), runsvdir(8), runsvchdir(8), utmpset(8)

+http://smarden.org/runit/ + +

Author

+Gerrit Pape <pape@smarden.org>

+ +


+Table of Contents

+

+ + diff --git a/mirror_runit/runit-2.1.2/doc/runsvchdir.8.html b/mirror_runit/runit-2.1.2/doc/runsvchdir.8.html new file mode 100644 index 0000000..54e66a5 --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/runsvchdir.8.html @@ -0,0 +1,52 @@ + + + + + +runsvchdir(8) manual page + + +G. Pape
runit

+ +

Name

+runsvchdir - change services directory of runsvdir(8) +

Synopsis

+runsvchdir +dir +

Description

+dir is a services directory for the use with runsvdir(8). +If dir does not start with a slash, it is searched in /etc/runit/runsvdir/. +dir must not start with a dot.

+runsvchdir switches to the directory /etc/runit/runsvdir/, +copies current to previous, and replaces current with a symlink pointing +to dir.

+Normally /service is a symlink to current, and runsvdir(8) is running +/service/. +

Exit Codes

+runsvchdir prints an error message and exits 111 on +error. runsvchdir exits 0 on success. +

Files

+ /etc/runit/runsvdir/previous
+ /etc/runit/runsvdir/current
+ /etc/runit/runsvdir/current.new
+ +

See Also

+runsvdir(8), runit(8), runit-init(8), sv(8), runsv(8)

+http://smarden.org/runit/ + +

Author

+Gerrit Pape <pape@smarden.org>

+ +


+Table of Contents

+

+ + diff --git a/mirror_runit/runit-2.1.2/doc/runsvdir.8.html b/mirror_runit/runit-2.1.2/doc/runsvdir.8.html new file mode 100644 index 0000000..f4053db --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/runsvdir.8.html @@ -0,0 +1,73 @@ + + + + + +runsvdir(8) manual page + + +G. Pape
runit

+ +

Name

+runsvdir - starts and monitors a collection of runsv(8) processes +

Synopsis

+runsvdir +[-P] dir [ log ] +

Description

+dir must be a directory. log is a space holder +for a readproctitle log, and must be at least seven characters long or +absent.

+runsvdir starts a runsv(8) process for each subdirectory, or symlink +to a directory, in the services directory dir, up to a limit of 1000 subdirectories, +and restarts a runsv(8) process if it terminates. runsvdir skips subdirectory +names starting with dots. runsv(8) must be in runsvdir’s PATH.

+At least every +five seconds runsvdir checks whether the time of last modification, the +inode, or the device, of the services directory dir has changed. If so, +it re-scans the service directory, and if it sees a new subdirectory, or +new symlink to a directory, in dir, it starts a new runsv(8) process; if +runsvdir sees a subdirectory being removed that was previously there, it +sends the corresponding runsv(8) process a TERM signal, stops monitoring +this process, and so does not restart the runsv(8) process if it exits. +

+If the log argument is given to runsvdir, all output to standard error +is redirected to this log, which is similar to the daemontools’ readproctitle +log. To see the most recent error messages, use a process-listing tool such +as ps(1). runsvdir writes a dot to the readproctitle log every 15 minutes +so that old error messages expire. +

Options

+ +
+ +
-P
+
use setsid(2) to run each runsv(8) +process in a new session and separate process group.
+
+ +

Signals

+If runsvdir +receives a TERM signal, it exits with 0 immediately.

+If runsvdir receives +a HUP signal, it sends a TERM signal to each runsv(8) process it is monitoring +and then exits with 111. +

See Also

+sv(8), runsv(8), runsvchdir(8), runit(8), +runit-init(8), chpst(8), svlogd(8), utmpset(8), setsid(2)

+http://smarden.org/runit/ + +

Author

+Gerrit Pape <pape@smarden.org>

+ +


+Table of Contents

+

+ + diff --git a/mirror_runit/runit-2.1.2/doc/sv.8.html b/mirror_runit/runit-2.1.2/doc/sv.8.html new file mode 100644 index 0000000..504b30b --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/sv.8.html @@ -0,0 +1,218 @@ + + + + + +sv(8) manual page + + +G. Pape
runit

+ +

Name

+sv - control and manage services monitored by runsv(8) +

Synopsis

+sv [-v] +[-w sec] command services

+/etc/init.d/service [-w sec] command +

Description

+The +sv program reports the current status and controls the state of services +monitored by the runsv(8) supervisor.

+services consists of one or more arguments, +each argument naming a directory service used by runsv(8). If service doesn’t +start with a dot or slash and doesn’t end with a slash, it is searched in +the default services directory /service/, otherwise relative to the current +directory.

+command is one of up, down, status, once, pause, cont, hup, alarm, +interrupt, 1, 2, term, kill, or exit, or start, stop, restart, shutdown, +force-stop, force-reload, force-restart, force-shutdown.

+The sv program can +be sym-linked to /etc/init.d/ to provide an LSB init script interface. The +service to be controlled then is specified by the base name of the ‘‘init +script’’. +

Commands

+ +
+ +
status
+
Report the current status of the service, and the +appendant log service if available, to standard output.
+ +
up
+
If the service +is not running, start it. If the service stops, restart it.
+ +
down
+
If the service +is running, send it the TERM signal, and the CONT signal. If ./run exits, +start ./finish if it exists. After it stops, do not restart service.
+ +
once +
+
If the service is not running, start it. Do not restart it if it stops.
+ +
pause +cont hup alarm interrupt quit 1 2 term kill
+
If the service is running, +send it the STOP, CONT, HUP, ALRM, INT, QUIT, USR1, USR2, TERM, or KILL +signal respectively.
+ +
exit
+
If the service is running, send it the TERM signal, +and the CONT signal. Do not restart the service. If the service is down, +and no log service exists, runsv(8) exits. If the service is down and a +log service exists, runsv(8) closes the standard input of the log service +and waits for it to terminate. If the log service is down, runsv(8) exits. +This command is ignored if it is given to an appendant log service.
+
+

+sv actually +looks only at the first character of these commands. +

Commands compatible +to LSB init script actions

+ +
+ +
status
+
Same as status.
+ +
start
+
Same as up, but wait +up to 7 seconds for the command to take effect. Then report the status or +timeout. If the script ./check exists in the service directory, sv runs this +script to check whether the service is up and available; it’s considered +to be available if ./check exits with 0.
+ +
stop
+
Same as down, but wait up to +7 seconds for the service to become down. Then report the status or timeout. +
+ +
reload
+
Same as hup, and additionally report the status afterwards.
+ +
restart +
+
Send the commands term, cont, and up to the service, and wait up to 7 seconds +for the service to restart. Then report the status or timeout. If the script +./check exists in the service directory, sv runs this script to check whether +the service is up and available again; it’s considered to be available if +./check exits with 0.
+ +
shutdown
+
Same as exit, but wait up to 7 seconds for +the runsv(8) process to terminate. Then report the status or timeout.
+ +
force-stop +
+
Same as down, but wait up to 7 seconds for the service to become down. Then +report the status, and on timeout send the service the kill command.
+ +
force-reload +
+
Send the service the term and cont commands, and wait up to 7 seconds for +the service to restart. Then report the status, and on timeout send the +service the kill command.
+ +
force-restart
+
Send the service the term, cont and +up commands, and wait up to 7 seconds for the service to restart. Then report +the status, and on timeout send the service the kill command. If the script +./check exists in the service directory, sv runs this script to check whether +the service is up and available again; it’s considered to be available if +./check exits with 0.
+ +
force-shutdown
+
Same as exit, but wait up to 7 seconds +for the runsv(8) process to terminate. Then report the status, and on timeout +send the service the kill command.
+ +
try-restart
+
if the service is running, +send it the term and cont commands, and wait up to 7 seconds for the service +to restart. Then report the status or timeout. +

+
+ +

Additional Commands

+ +
+ +
check +
+
Check for the service to be in the state that’s been requested. Wait up to +7 seconds for the service to reach the requested state, then report the +status or timeout. If the requested state of the service is up, and the +script ./check exists in the service directory, sv runs this script to check +whether the service is up and running; it’s considered to be up if ./check +exits with 0.
+
+ +

Options

+ +
+ +
-v
+
If the command is up, down, term, once, cont, or +exit, then wait up to 7 seconds for the command to take effect. Then report +the status or timeout.
+ +
-w sec
+
Override the default timeout of 7 seconds with +sec seconds. This option implies -v.
+
+ +

Environment

+ +
+ +
SVDIR
+
The environment variable +$SVDIR overrides the default services directory /service/.
+ +
SVWAIT
+
The environment +variable $SVWAIT overrides the default 7 seconds to wait for a command +to take effect. It is overridden by the -w option.
+
+ +

Exit Codes

+sv exits 0, if +the command was successfully sent to all services, and, if it was told +to wait, the command has taken effect to all services.

+For each service +that caused an error (e.g. the directory is not controlled by a runsv(8) +process, or sv timed out while waiting), sv increases the exit code by +one and exits non zero. The maximum is 99. sv exits 100 on error.

+If sv is +called with a base name other than sv: it exits 1 on timeout or trouble +sending the command; if the command is status, it exits 3 if the service +is down, and 4 if the status is unknown; it exits 2 on wrong usage, and +151 on error. +

See Also

+runsv(8), chpst(8), svlogd(8), runsvdir(8), runsvchdir(8), +runit(8), runit-init(8)

+http://smarden.org/runit/ +

Author

+Gerrit Pape <pape@smarden.org> +

+ +


+Table of Contents

+

+ + diff --git a/mirror_runit/runit-2.1.2/doc/svlogd.8.html b/mirror_runit/runit-2.1.2/doc/svlogd.8.html new file mode 100644 index 0000000..9d300ae --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/svlogd.8.html @@ -0,0 +1,264 @@ + + + + + +svlogd(8) manual page + + +G. Pape
runit

+ +

Name

+svlogd - runit’s service logging daemon +

Synopsis

+svlogd [-tttv] [-r c] [-R +xyz] [-l len] [-b buflen] logs +

Description

+logs consists of one or more arguments, +each specifying a directory.

+svlogd continuously reads log data from its +standard input, optionally filters log messages, and writes the data to +one or more automatically rotated logs.

+Recent log files can automatically +be processed by an arbitrary processor program when they are rotated, and +svlogd can be told to alert selected log messages to standard error, and +through udp.

+svlogd runs until it sees end-of-file on standard input or is +sent a TERM signal, see below. +

Log Directory

+A log directory log contains +some number of old log files, and the current log file current. Old log +files have a file name starting with @ followed by a precise timestamp +(see the daemontools’ tai64n program), indicating when current was rotated +and renamed to this file.

+A log directory additionally contains the lock +file lock, maybe state and newstate, and optionally the file config. svlogd +creates necessary files if they don’t exist.

+If svlogd has trouble opening +a log directory, it prints a warning, and ignores this log directory. If +svlogd is unable to open all log directories given at the command line, +it exits with an error. This can happen on start-up or after receiving a +HUP signal. +

Log File Rotation

+svlogd appends selected log messages to the +current log file. If current has size bytes or more (or there is a new-line +within the last len of size bytes), or is older than a specified amount +of time, current is rotated:

+svlogd closes current, changes permission +of current to 0755, renames current to @timestamp.s, and starts with a new +empty current. If svlogd sees num or more old log files in the log directory, +it removes the oldest one. Note that this doesn’t decrease the number of +log files if there are already more than num log files, this must be done +manually, e.g. for keeping 10 log files:

+ ls -1 \@* |sort |sed -ne ’10,$p’ |xargs +rm
+ +

Processor

+If svlogd is told to process recent log files, it saves current +to @timestamp.u, feeds @timestamp.u through ‘‘sh -c "processor"’’ and writes the +output to @timestamp.t. If the processor finishes successfully, @timestamp.t +is renamed to @timestamp.s, and @timestamp.u is deleted; otherwise @timestamp.t +is deleted and the processor is started again. svlogd also saves any output +that the processor writes to file descriptor 5, and makes that output available +on file descriptor 4 when running processor on the next log file rotation. +

+A processor is run in the background. If svlogd sees a previously started +processor still running when trying to start a new one for the same log, +it blocks until the currently running processor has finished successfully. +Only the HUP signal works in that situation. Note that this may block any +program feeding its log data to svlogd. +

+

Config

+On startup, and after receiving +a HUP signal, svlogd checks for each log directory log if the configuration +file log/config exists, and if so, reads the file line by line and adjusts +configuration for log as follows:

+If the line is empty, or starts with +a ‘‘#’’, it is ignored. A line of the form +

+ +
ssize
+
sets the maximum file size +of current when svlogd should rotate the current log file to size bytes. +Default is 1000000. If size is zero, svlogd doesn’t rotate log files. You +should set size to at least (2 * len).
+ +
nnum
+
sets the number of old log files +svlogd should maintain to num. If svlogd sees more that num old log files +in log after log file rotation, it deletes the oldest one. Default is 10. +If num is zero, svlogd doesn’t remove old log files.
+ +
Nmin
+
sets the minimum +number of old log files svlogd should maintain to min. min must be less +than num. If min is set, and svlogd cannot write to current because the +filesystem is full, and it sees more than min old log files, it deletes +the oldest one.
+ +
ttimeout
+
sets the maximum age of the current log file when +svlogd should rotate the current log file to timeout seconds. If current +is timeout seconds old, and is not empty, svlogd forces log file rotation. +
+ +
!processor
+
tells svlogd to feed each recent log file through processor +(see above) on log file rotation. By default log files are not processed. +
+ +
ua.b.c.d[:port]
+
tells svlogd to transmit the first len characters of selected +log messages to the IP address a.b.c.d, port number port. If port isn’t set, +the default port for syslog is used (514). len can be set through the -l +option, see below. If svlogd has trouble sending udp packets, it writes +error messages to the log directory. Attention: logging through udp is unreliable, +and should be used in private networks only.
+ +
Ua.b.c.d[:port]
+
is the same as +the u line above, but the log messages are no longer written to the log +directory, but transmitted through udp only. Error messages from svlogd +concerning sending udp packages still go to the log directory.
+ +
pprefix
+
tells +svlogd to prefix each line to be written to the log directory, to standard +error, or through UDP, with prefix.
+
+

+If a line starts with a -, +, e, or E, +svlogd matches the first len characters of each log message against pattern +and acts accordingly: +

+ +
-pattern
+
the log message is deselected.
+ +
+pattern
+
the +log message is selected.
+ +
epattern
+
the log message is selected to be printed +to standard error.
+ +
Epattern
+
the log message is deselected to be printed +to standard error.
+
+

+Initially each line is selected to be written to log/current. +Deselected log messages are discarded from log. Initially each line is deselected +to be written to standard err. Log messages selected for standard error +are written to standard error. +

Pattern Matching

+svlogd matches a log message +against the string pattern as follows:

+pattern is applied to the log message +one character by one, starting with the first. A character not a star (‘‘*’’) +and not a plus (‘‘+’’) matches itself. A plus matches the next character in +pattern in the log message one or more times. A star before the end of pattern +matches any string in the log message that does not include the next character +in pattern. A star at the end of pattern matches any string.

+Timestamps optionally +added by svlogd are not considered part of the log message.

+An svlogd pattern +is not a regular expression. For example consider a log message like this +

+ 2005-12-18_09:13:50.97618 tcpsvd: info: pid 1977 from 10.4.1.14
+

+The following pattern doesn’t match

+ -*pid*
+

+because the first star matches up to the first p in tcpsvd, and then the +match fails because i is not s. To match this log message, you can use a +pattern like this instead

+ -*: *: pid *
+ +

Options

+ +
+ +
-t
+
timestamp. Prefix each selected line with a precise timestamp +(see the daemontools’ tai64n program) when writing to log or to standard +error.
+ +
-tt
+
timestamp. Prefix each selected line with a human readable, sortable +UTC timestamp of the form YYYY-MM-DD_HH:MM:SS.xxxxx when writing to log or +to standard error.
+ +
-ttt
+
timestamp. Prefix each selected line with a human +readable, sortable UTC timestamp of the form YYYY-MM-DDTHH:MM:SS.xxxxx when +writing to log or to standard error.
+ +
-r c
+
replace. c must be a single character. +Replace non-printable characters in log messages with c. Characters are replaced +before pattern matching is applied.
+ +
-R xyz
+
replace charset. Additionally to +non-printable characters, replace all characters found in xyz with c (default +‘‘_’’).
+ +
-l len
+
line length. Pattern matching applies to the first len characters +of a log message only. Default is 1000.
+ +
-b buflen
+
buffer size. Set the size +of the buffer svlogd uses when reading from standard input and writing +to logs to buflen. Default is 1024. buflen must be greater than len. For svlogd +instances that process a lot of data in short time, the buffer size should +be increased to improve performance.
+ +
-v
+
verbose. Print verbose messages to +standard error.
+
+ +

Signals

+If svlogd is sent a HUP signal, it closes and reopens +all logs, and updates their configuration according to log/config. If svlogd +has trouble opening a log directory, it prints a warning, and discards +this log directory. If svlogd is unable to open all log directories given +at the command line, it exits with an error.

+If svlogd is sent a TERM signal, +or if it sees end-of-file on standard input, it stops reading standard input, +processes the data in the buffer, waits for all processor subprocesses +to finish if any, and exits 0 as soon as possible.

+If svlogd is sent an +ALRM signal, it forces log file rotation for all logs with a non empty +current log file. +

See Also

+sv(8), runsv(8), chpst(8), runit(8), runit-init(8), +runsvdir(8), runsvchdir(8)

+http://smarden.org/runit/ +

Author

+Gerrit Pape <pape@smarden.org> +

+ +


+Table of Contents

+

+ + diff --git a/mirror_runit/runit-2.1.2/doc/upgrade.html b/mirror_runit/runit-2.1.2/doc/upgrade.html new file mode 100644 index 0000000..83d12e1 --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/upgrade.html @@ -0,0 +1,105 @@ + + + +runit - upgrading from previous versions + + +G. Pape
+runit
+
+

runit - upgrading from previous versions

+
+

2.0.0 to 2.1.2

+The chpst program learned a new option -b to run +a program with a different name as the 0th argument. +

1.9.0 to 2.0.0

+No further action from you is required. +

1.8.0 to 1.9.0

+The default directory for services is now /service/, and no longer +/var/service/. +To be consistent with the new default location, create a symlink when +upgrading +
+ # ln -s /var/service /
+
+When installing runit on a system that should comply with the Filesystem +Hierarchy Standard (FHS), neither /service/ nor +/var/service/ should be chosen, but /etc/service/. +It is recommended to create a compatibility symlink /service +pointing to /etc/service in this case. +

1.7.x to 1.8.0

+The runit program, the process no 1, has been +fixed to reap dead processes that re-parented to process no 1 (zombies) +more thoroughly. +Instructions on how to run runit with upstart as init scheme have +been added, svlogd has been changed to use a +new source port for each log message sent through udp, and this release +includes a build fix for AIX. +

1.6.0 to 1.7.x

+With this version the runsv program starts to +run the ./finish script with two arguments, the exit code and the exit +status of the just finished ./run script. +The timestamp svlogd optionally prepends to log +messages can be specified to be in iso 8601 alike format. +See the man pages for details. +

1.5.x to 1.6.0

+svlogd has been changed to prepend the optional +timestamp also to log messages sent to the network through UDP, just as it +does for log messages written to a log directory or standard error. +

1.4.0 or 1.4.1 to 1.5.x

+The svlogd program supports a new configuration +option p to optionally prefix each line written to logs, standard error, or +through UDP with a string, and no longer strips empty lines from the logs. +

1.3.x to 1.4.0 or 1.4.1

+With this version the runsvctrl, runsvstat, +svwaitdown, and svwaitup programs no longer are being +installed, the functionality of these programs has been incorporated into +the sv program. +The documentation now suggest to put service directories by default into +the /etc/sv/ directory, and a list of frequently asked questions +with answers has been added. +The chpst program understands a new option -d +to limit memory of the data segment per process. +

1.2.x to 1.3.x

+This release introduces a first test version of the sv +program, which can be used to control the state and query the status of +services monitored by runsv. +Optionally it can be sym-linked into /etc/init.d/ to provide an +interface to LSB init script actions for services controlled by runit. +See the man page for details. +Thanks to Lars Uffmann, instructions on how to run runit under launchd on +MacOSX 10.4 have been added. +

1.1.0 to 1.2.x

+With this version the runsv program makes +controlling the service through commands normally sent by +runsvctrl configurable; +arbitrary actions through external programs can optionally be specified, and +signalling of the service disabled if desired. +See the man page for details. +

+runsv now reports the seconds since ./run +has been started when running the ./finish script, instead of the +seconds since ./finish has been started. +It no longer reports immediately failing ./run scripts as ``running'' +for up to one second, but as ``down, normally up, want up''. +

1.0.x to 1.1.0

+The svlogd program now interprets the ``e'' and +``E'' configuration options so that they can be combined to select or +deselect log messages to be written to standard error, similar to the ``+'' +and ``-'' options for the rotated log. +It also provides the new ``t'' and ``N'' configuration options, see the +man page for details. +The chpst program supports adjusting the nice +level through the new -n command line option. +

+Starting with this version, /etc/runit/2 by default runs the +runsvdir program with the -P option. +To adapt edit /etc/runit/2 and change the invocation of +runsvdir accordingly, see +here. +


+
+Gerrit Pape <pape@smarden.org> +
+ + diff --git a/mirror_runit/runit-2.1.2/doc/usedietlibc.html b/mirror_runit/runit-2.1.2/doc/usedietlibc.html new file mode 100644 index 0000000..70c5b2f --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/usedietlibc.html @@ -0,0 +1,35 @@ + + + +runit - use dietlibc + + +G. Pape
+runit
+
+

runit - use dietlibc

+
+To recompile the runit programs with the +diet libc, check that you have +the recent version of +dietlibc installed. +

+Change to the package directory of runit +

+ # cd /package/admin/runit/
+
+Change the conf-cc and conf-ld to use diet +
+ # echo 'diet -Os gcc -O2 -Wall' >src/conf-cc
+ # echo 'diet -Os gcc -s -Os -pipe' >src/conf-ld
+
+Rebuild and install the runit programs +
+ # package/install
+
+
+
+Gerrit Pape <pape@smarden.org> +
+ + diff --git a/mirror_runit/runit-2.1.2/doc/useinit.html b/mirror_runit/runit-2.1.2/doc/useinit.html new file mode 100644 index 0000000..a5c2853 --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/useinit.html @@ -0,0 +1,102 @@ + + + +runit - use with traditional init + + +G. Pape
+runit
+
+

runit - use with traditional init

+
+It's possible to use runit's service supervision without replacing +the init scheme of the system. +Simply run the stage 2 of runit as a service with your +current init. +

+Normally this is done by either adding an entry for +/sbin/runsvdir-start to /etc/inittab, or by adding +/sbin/runsvdir-start as command to /etc/rc.local, or by +adding /sbin/runsvdir-start to the system's StartupItems. +

+In any case, you first need to copy the stage 2 script to +/sbin/runsvdir-start, and create the services directory +/service/: +

+ # install -m0750 /package/admin/runit/etc/2 /sbin/runsvdir-start
+ # mkdir -p /service
+
+
+How to use with sysvinit and inittab
+How to use with sysvinit and upstart
+How to use with *BSD init
+How to use with MacOSX init +
+

Using with sysvinit and inittab

+If your system uses a sysvinit alike init scheme with a /etc/inittab +file, do: +
+ # cat >>/etc/inittab <<EOT
+ SV:123456:respawn:/sbin/runsvdir-start
+ EOT
+
+and tell init to re-read its configuration, e.g.: +
+ # init q
+
+
+

Using with sysvinit and upstart

+If your system uses a sysvinit alike init scheme that utilizes upstart +instead of inittab, and which has start and stop scripts located in +/etc/init/, do: +
+ # cat >/etc/init/runsvdir.conf <<\EOT
+ # for runit - manage /usr/sbin/runsvdir-start
+ start on runlevel 2
+ start on runlevel 3
+ start on runlevel 4
+ start on runlevel 5
+ stop on shutdown
+ respawn
+ exec /usr/sbin/runsvdir-start
+ EOT
+
+and tell init to start the new service, e.g.: +
+ # start runsvdir
+
+
+

Using with *BSD init

+If your system uses a BSD alike init scheme with a /etc/rc.local +script, do: +
+ # cat >>/etc/rc.local <<EOT
+ csh -cf '/sbin/runsvdir-start &'
+ EOT
+
+and reboot your system. +
+

Using with MacOSX init

+On MacOSX 10.2 create an entry for runit in +/System/Library/StartupItems/: +
+ # cd /System/Library/StartupItems
+ # mkdir -p runit
+ # cp -p /package/admin/runit/etc/macosx/StartupItems/* runit/
+
+and reboot your system. +

+On MacOSX 10.4 create an entry for runit in +/Library/LaunchDaemons/, and tell launchd to start the new +service: +

+ # cp /package/admin/runit/etc/macosx/org.smarden.runit.plist \
+     /Library/LaunchDaemons/
+ # launchctl load /Library/LaunchDaemons/org.smarden.runit.plist
+
+
+
+Gerrit Pape <pape@smarden.org> +
+ + diff --git a/mirror_runit/runit-2.1.2/doc/utmpset.8.html b/mirror_runit/runit-2.1.2/doc/utmpset.8.html new file mode 100644 index 0000000..3b96cb6 --- /dev/null +++ b/mirror_runit/runit-2.1.2/doc/utmpset.8.html @@ -0,0 +1,63 @@ + + + + + +utmpset(8) manual page + + +G. Pape
runit

+ +

Name

+utmpset - logout a line from utmp and wtmp file +

Synopsis

+utmpset [ -w +] line +

Description

+The utmpset program modifies the user accounting database +utmp(5) and optionally wtmp(5) to indicate that the user on the terminal +line has logged out.

+Ordinary init(8) processes handle utmp file records +for local login accounting. The runit(8) program doesn’t include code to +update the utmp file, the getty(8) processes are handled the same as all +other services.

+To enable local login accounting, add utmpset to the getty(8) +finish scripts, e.g.:

+ $ cat /service/getty-5/finish
+ #!/bin/sh
+ exec utmpset -w tty5
+ $
+ +

Options

+ +
+ +
-w
+
wtmp. Additionally to the utmp file, write an empty record for +line to the wtmp file.
+
+ +

Exit Codes

+utmpset returns 111 on error, 1 on wrong +usage, 0 in all other cases. +

See Also

+sv(8), runsv(8), runit(8), runit-init(8) +runsvdir(8), runsvchdir(8), chpst(8), svlogd(8), getty(8)

+http://smarden.org/runit/ + +

Author

+Gerrit Pape <pape@smarden.org>

+ +


+Table of Contents

+

+ + diff --git a/mirror_runit/runit-2.1.2/etc/2 b/mirror_runit/runit-2.1.2/etc/2 new file mode 100755 index 0000000..3bb822d --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/2 @@ -0,0 +1,6 @@ +#!/bin/sh + +PATH=/command:/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin + +exec env - PATH=$PATH \ +runsvdir -P /service 'log: ...........................................................................................................................................................................................................................................................................................................................................................................................................' diff --git a/mirror_runit/runit-2.1.2/etc/debian/1 b/mirror_runit/runit-2.1.2/etc/debian/1 new file mode 100755 index 0000000..4cd10cb --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/debian/1 @@ -0,0 +1,10 @@ +#!/bin/sh +# system one time tasks + +PATH=/command:/sbin:/bin:/usr/sbin:/usr/bin + +/etc/init.d/rcS +/etc/init.d/rmnologin + +touch /etc/runit/stopit +chmod 0 /etc/runit/stopit diff --git a/mirror_runit/runit-2.1.2/etc/debian/2 b/mirror_runit/runit-2.1.2/etc/debian/2 new file mode 120000 index 0000000..5fae01f --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/debian/2 @@ -0,0 +1 @@ +../2 \ No newline at end of file diff --git a/mirror_runit/runit-2.1.2/etc/debian/3 b/mirror_runit/runit-2.1.2/etc/debian/3 new file mode 100755 index 0000000..10354d7 --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/debian/3 @@ -0,0 +1,14 @@ +#!/bin/sh +exec 2>&1 + +PATH=/command:/sbin:/bin:/usr/sbin:/usr/bin + +LAST=0 +test -x /etc/runit/reboot && LAST=6 + +echo 'Waiting for services to stop...' +sv -w196 force-stop /service/* +sv exit /service/* + +echo 'Shutdown...' +/etc/init.d/rc $LAST diff --git a/mirror_runit/runit-2.1.2/etc/debian/ctrlaltdel b/mirror_runit/runit-2.1.2/etc/debian/ctrlaltdel new file mode 100755 index 0000000..6684457 --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/debian/ctrlaltdel @@ -0,0 +1,9 @@ +#!/bin/sh + +PATH=/bin:/usr/bin +MSG="System is going down in 14 seconds..." + +# echo 'disabled.' ; exit +touch /etc/runit/stopit +chmod 100 /etc/runit/stopit && echo "$MSG" | wall +/bin/sleep 14 diff --git a/mirror_runit/runit-2.1.2/etc/debian/getty-tty5/finish b/mirror_runit/runit-2.1.2/etc/debian/getty-tty5/finish new file mode 100755 index 0000000..72d719b --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/debian/getty-tty5/finish @@ -0,0 +1,2 @@ +#!/bin/sh +exec utmpset -w tty5 diff --git a/mirror_runit/runit-2.1.2/etc/debian/getty-tty5/run b/mirror_runit/runit-2.1.2/etc/debian/getty-tty5/run new file mode 100755 index 0000000..6767eae --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/debian/getty-tty5/run @@ -0,0 +1,2 @@ +#!/bin/sh +exec /sbin/getty 38400 tty5 linux diff --git a/mirror_runit/runit-2.1.2/etc/freebsd/1 b/mirror_runit/runit-2.1.2/etc/freebsd/1 new file mode 100755 index 0000000..2a4492d --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/freebsd/1 @@ -0,0 +1,17 @@ +#!/bin/sh +# system one time tasks + +PATH=/command:/sbin:/bin:/usr/sbin:/usr/bin +trap : 2 +trap : 3 + +sh /etc/rc autoboot +if test $? -ne 0; then + # /etc/rc crashed, start emergency shell. + echo '/etc/rc failed. Press for emergency shell...' + read input + sh -p + exec reboot +fi +touch /etc/runit/stopit +chmod 0 /etc/runit/stopit diff --git a/mirror_runit/runit-2.1.2/etc/freebsd/2 b/mirror_runit/runit-2.1.2/etc/freebsd/2 new file mode 120000 index 0000000..5fae01f --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/freebsd/2 @@ -0,0 +1 @@ +../2 \ No newline at end of file diff --git a/mirror_runit/runit-2.1.2/etc/freebsd/3 b/mirror_runit/runit-2.1.2/etc/freebsd/3 new file mode 100755 index 0000000..f7f9327 --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/freebsd/3 @@ -0,0 +1,15 @@ +#!/bin/sh +exec 2>&1 + +PATH=/command:/sbin:/bin:/usr/sbin:/usr/bin + +echo 'Waiting for services to stop...' +sv -w196 force-stop /service/* +sv exit /service/* + +echo 'Shutdown...' +if test -x /etc/runit/reboot; then + exec reboot +else + exec halt +fi diff --git a/mirror_runit/runit-2.1.2/etc/freebsd/ctrlaltdel b/mirror_runit/runit-2.1.2/etc/freebsd/ctrlaltdel new file mode 100755 index 0000000..6684457 --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/freebsd/ctrlaltdel @@ -0,0 +1,9 @@ +#!/bin/sh + +PATH=/bin:/usr/bin +MSG="System is going down in 14 seconds..." + +# echo 'disabled.' ; exit +touch /etc/runit/stopit +chmod 100 /etc/runit/stopit && echo "$MSG" | wall +/bin/sleep 14 diff --git a/mirror_runit/runit-2.1.2/etc/freebsd/getty-ttyv4/finish b/mirror_runit/runit-2.1.2/etc/freebsd/getty-ttyv4/finish new file mode 100755 index 0000000..b53d0af --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/freebsd/getty-ttyv4/finish @@ -0,0 +1,2 @@ +#!/bin/sh +exec utmpset -w ttyv4 diff --git a/mirror_runit/runit-2.1.2/etc/freebsd/getty-ttyv4/run b/mirror_runit/runit-2.1.2/etc/freebsd/getty-ttyv4/run new file mode 100755 index 0000000..2d5e3dc --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/freebsd/getty-ttyv4/run @@ -0,0 +1,2 @@ +#!/bin/sh +exec /usr/libexec/getty Pc ttyv4 diff --git a/mirror_runit/runit-2.1.2/etc/macosx/2 b/mirror_runit/runit-2.1.2/etc/macosx/2 new file mode 120000 index 0000000..5fae01f --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/macosx/2 @@ -0,0 +1 @@ +../2 \ No newline at end of file diff --git a/mirror_runit/runit-2.1.2/etc/macosx/StartupItems/StartupParameters.plist b/mirror_runit/runit-2.1.2/etc/macosx/StartupItems/StartupParameters.plist new file mode 100644 index 0000000..14b5116 --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/macosx/StartupItems/StartupParameters.plist @@ -0,0 +1,11 @@ +{ + Description = "runit service supervision"; + Provides = ("runit"); + Requires = ("Disks"); + OrderPreference = "None"; + Messages = + { + start = "Starting runit service supervision"; + stop = "Stopping runit service supervision"; + }; +} diff --git a/mirror_runit/runit-2.1.2/etc/macosx/StartupItems/runit b/mirror_runit/runit-2.1.2/etc/macosx/StartupItems/runit new file mode 100755 index 0000000..9f0eaf3 --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/macosx/StartupItems/runit @@ -0,0 +1,22 @@ +#!/bin/sh + +## +# runit +## + +. /etc/rc.common + +StartService() { + ConsoleMessage "Starting runit service supervision" + /bin/csh -cf '/sbin/runsvdir-start &' +} +StopService() { + ConsoleMessage "Stopping runit service supervision" + sv -w196 force-stop /service/* + sv exit /service/* +} +RestartService() { + return 0 +} + +RunService "$1" diff --git a/mirror_runit/runit-2.1.2/etc/macosx/org.smarden.runit.plist b/mirror_runit/runit-2.1.2/etc/macosx/org.smarden.runit.plist new file mode 100644 index 0000000..1331f8a --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/macosx/org.smarden.runit.plist @@ -0,0 +1,20 @@ + + + + + Label + org.smarden.runit + ServiceDescription + runsvdir - starts and monitors a collection of runsv(8) processes + QueueDirectories + + /service + + OnDemand + + ProgramArguments + + /sbin/runsvdir-start + + + diff --git a/mirror_runit/runit-2.1.2/etc/openbsd/1 b/mirror_runit/runit-2.1.2/etc/openbsd/1 new file mode 100755 index 0000000..eaa3d39 --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/openbsd/1 @@ -0,0 +1,17 @@ +#!/bin/sh +# system one time tasks + +PATH=/command:/sbin:/bin:/usr/sbin:/usr/bin +trap : 2 +trap : 3 + +sh /etc/rc autoboot +if test $? -ne 0; then + # /etc/rc crashed, start emergency shell. + echo '/etc/rc failed. Press for emergency shell...' + read input + sh -l + exec reboot +fi +touch /etc/runit/stopit +chmod 0 /etc/runit/stopit diff --git a/mirror_runit/runit-2.1.2/etc/openbsd/2 b/mirror_runit/runit-2.1.2/etc/openbsd/2 new file mode 120000 index 0000000..5fae01f --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/openbsd/2 @@ -0,0 +1 @@ +../2 \ No newline at end of file diff --git a/mirror_runit/runit-2.1.2/etc/openbsd/3 b/mirror_runit/runit-2.1.2/etc/openbsd/3 new file mode 100755 index 0000000..f7f9327 --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/openbsd/3 @@ -0,0 +1,15 @@ +#!/bin/sh +exec 2>&1 + +PATH=/command:/sbin:/bin:/usr/sbin:/usr/bin + +echo 'Waiting for services to stop...' +sv -w196 force-stop /service/* +sv exit /service/* + +echo 'Shutdown...' +if test -x /etc/runit/reboot; then + exec reboot +else + exec halt +fi diff --git a/mirror_runit/runit-2.1.2/etc/openbsd/ctrlaltdel b/mirror_runit/runit-2.1.2/etc/openbsd/ctrlaltdel new file mode 100755 index 0000000..6684457 --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/openbsd/ctrlaltdel @@ -0,0 +1,9 @@ +#!/bin/sh + +PATH=/bin:/usr/bin +MSG="System is going down in 14 seconds..." + +# echo 'disabled.' ; exit +touch /etc/runit/stopit +chmod 100 /etc/runit/stopit && echo "$MSG" | wall +/bin/sleep 14 diff --git a/mirror_runit/runit-2.1.2/etc/openbsd/getty-ttyC4/finish b/mirror_runit/runit-2.1.2/etc/openbsd/getty-ttyC4/finish new file mode 100755 index 0000000..b3c7aa7 --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/openbsd/getty-ttyC4/finish @@ -0,0 +1,2 @@ +#!/bin/sh +exec utmpset -w ttyC4 diff --git a/mirror_runit/runit-2.1.2/etc/openbsd/getty-ttyC4/run b/mirror_runit/runit-2.1.2/etc/openbsd/getty-ttyC4/run new file mode 100755 index 0000000..c1d9cb9 --- /dev/null +++ b/mirror_runit/runit-2.1.2/etc/openbsd/getty-ttyC4/run @@ -0,0 +1,2 @@ +#!/bin/sh +exec /usr/libexec/getty Pc ttyC4 diff --git a/mirror_runit/runit-2.1.2/man/chpst.8 b/mirror_runit/runit-2.1.2/man/chpst.8 new file mode 100644 index 0000000..43c0b8d --- /dev/null +++ b/mirror_runit/runit-2.1.2/man/chpst.8 @@ -0,0 +1,265 @@ +.TH chpst 8 +.SH NAME +chpst \- runs a program with a changed process state +.SH SYNOPSIS +.B chpst +[\-vP012] +[\-u +.IR user ] +[\-U +.IR user ] +[\-b +.IR argv0 ] +[-e +.IR dir ] +[\-/ +.IR root ] +[\-n +.IR inc ] +[-l|-L +.IR lock ] +[-m +.IR bytes ] +[-d +.IR bytes ] +[-o +.IR n ] +[-p +.IR n ] +[-f +.IR bytes ] +[-c +.IR bytes ] +.I prog +.SH DESCRIPTION +.I prog +consists of one or more arguments. +.P +.B chpst +changes the process state according to the given options, and runs +.IR prog . +.SH OPTIONS +.TP +.B \-u \fI[:]user[:group] +setuidgid. +Set uid and gid to the +.IR user 's +uid and gid, as found in +.IR /etc/passwd . +If +.I user +is followed by a colon and a +.IR group , +set the gid to +.IR group 's +gid, as found in +.IR /etc/group , +instead of +.IR user 's +gid. +If +.I group +consists of a colon-separated list of group names, +.B chpst +sets the group ids of all listed groups. +If +.I user +is prefixed with a colon, the +.I user +and all +.I group +arguments are interpreted as uid and gids respectivly, and not looked up in +the password or group file. +All initial supplementary groups are removed. +.TP +.B \-U \fI[:]user[:group] +envuidgid. +Set the environment variables $UID and $GID to the +.IR user 's +uid and gid, as found in +.IR /etc/passwd . +If +.I user +is followed by a colon and a +.IR group , +set $GID to the +.IR group 's +gid, as found in +.IR /etc/group , +instead of +.IR user 's +gid. +If +.I user +is prefixed with a colon, the +.I user +and +.I group +arguments are interpreted as uid and gid respectivly, and not looked up in +the password or group file. +.TP +.B \-b \fIargv0 +argv0. +Run +.I prog +with +.I argv0 +as the 0th argument. +.TP +.B \-e \fIdir +envdir. +Set various environment variables as specified by files in the directory +.IR dir : +If +.I dir +contains a file named +.I k +whose first line is +.IR v , +.B chpst +removes the environment variable +.I k +if it exists, and then adds the environment variable +.I k +with the value +.IR v . +The name +.I k +must not contain =. +Spaces and tabs at the end of +.I v +are removed, and nulls in +.I v +are changed to newlines. +If the file +.I k +is empty (0 bytes long), +.B chpst +removes the environment variable +.I k +if it exists, without adding a new variable. +.TP +.B \-/ \fIroot +chroot. +Change the root directory to +.I root +before starting +.IR prog . +.TP +.B \-n \fIinc +nice. +Add +.I inc +to the +.BR nice (2) +value before starting +.IR prog . +.I inc +must be an integer, and may start with a minus or plus. +.TP +.B \-l \fIlock +lock. +Open the file +.I lock +for writing, and obtain an exclusive lock on it. +.I lock +will be created if it does not exist. +If +.I lock +is locked by another process, wait until a new lock can be obtained. +.TP +.B \-L \fIlock +The same as \-l, but fail immediately if +.I lock +is locked by another process. +.TP +.B \-m \fIbytes +limit memory. +Limit the data segment, stack segment, locked physical pages, and total of +all segment per process to +.I bytes +bytes each. +.TP +.B \-d \fIbytes +limit data segment. +Limit the data segment per process to +.I bytes +bytes. +.TP +.B \-o \fIn +limit open files. +Limit the number of open file descriptors per process to +.IR n . +.TP +.B \-p \fIn +limit processes. +Limit the number of processes per uid to +.IR n . +.TP +.B \-f \fIbytes +limit output size. +Limit the output file size to +.I bytes +bytes. +.TP +.B \-c \fIbytes +limit core size. +Limit the core file size to +.I bytes +bytes. +.TP +.B \-v +verbose. +Print verbose messages to standard error. +This includes warnings about limits unsupported by the system. +.TP +.B \-P +pgrphack. +Run +.I prog +in a new process group. +.TP +.B \-0 +Close standard input before starting +.IR prog . +.TP +.B \-1 +Close standard output before starting +.IR prog . +.TP +.B \-2 +Close standard error before starting +.IR prog . +.SH EXIT CODES +.B chpst +exits 100 when called with wrong options. +It prints an error message and exits 111 if it has trouble changing the +process state. +Otherwise its exit code is the same as that of +.IR prog . +.SH EMULATION +If +.B chpst +is called as +.BR envdir , +.BR envuidgid , +.BR pgrphack , +.BR setlock , +.BR setuidgid , +or +.BR softlimit , +it emulates the functionality of these programs from the daemontools package +respectively. +.SH SEE ALSO +sv(8), +runsv(8), +setsid(2), +runit(8), +runit-init(8), +runsvdir(8), +runsvchdir(8) +.P + http://smarden.org/runit/ + http://cr.yp.to/daemontools.html +.SH AUTHOR +Gerrit Pape diff --git a/mirror_runit/runit-2.1.2/man/runit-init.8 b/mirror_runit/runit-2.1.2/man/runit-init.8 new file mode 100644 index 0000000..4ea33c2 --- /dev/null +++ b/mirror_runit/runit-2.1.2/man/runit-init.8 @@ -0,0 +1,63 @@ +.TH runit-init 8 +.SH NAME +init \- a UNIX process no 1 +.SH SYNOPSIS +.B init +[ 0 | 6 ] +.SH DESCRIPTION +.B runit-init +is the first process the kernel starts. +If +.B runit-init +is started as process no 1, it runs and replaces itself with +.BR runit (8). +.P +If +.B runit-init +is started while the system is up, it must be either called as +.B init 0 +or +.B init 6\fR: +.TP +.B init 0 +tells the Unix process no 1 to shutdown and halt the system. +To signal +.BR runit (8) +the system halt request, +.B runit-init +removes all permissions of the file +.I /etc/runit/reboot +(chmod 0), and sets the execute by owner permission of the file +.I /etc/runit/stopit +(chmod 100). +Then a CONT signal is sent to +.BR runit (8). +.TP +.B init 6 +tells the Unix process no 1 to shutdown and reboot the system. +To signal +.BR runit (8) +the system reboot request, +.B runit-init +sets the execute by owner permission of the files +.I /etc/runit/reboot +and +.I /etc/runit/stopit +(chmod 100). Then a CONT signal is sent to +.BR runit (8). +.SH EXIT CODES +.B runit-init +returns 111 on error, 0 in all other cases. +.SH SEE ALSO +runit(8), +runsvdir(8), +runsvchdir(8), +sv(8), +runsv(8), +chpst(8), +utmpset(8), +svlogd(8) +.P +http://smarden.org/runit/ +.SH AUTHOR +Gerrit Pape diff --git a/mirror_runit/runit-2.1.2/man/runit.8 b/mirror_runit/runit-2.1.2/man/runit.8 new file mode 100644 index 0000000..a53cf6e --- /dev/null +++ b/mirror_runit/runit-2.1.2/man/runit.8 @@ -0,0 +1,88 @@ +.TH runit 8 +.SH NAME +runit \- a UNIX process no 1 +.SH SYNOPSIS +.B runit +.SH DESCRIPTION +.B runit +must be run as Unix process no 1. +It performs the system's booting, running, and shutdown in three stages: +.SH STAGE 1 +.B runit +runs +.I /etc/runit/1 +and waits for it to terminate. +The system's one time tasks are done here. +.I /etc/runit/1 +has full control of +.I /dev/console +to be able to start an emergency shell if the one time initialization tasks +fail. If +.I /etc/runit/1 +crashes, or exits 100, +.B runit +will skip stage 2 and enter stage 3. +.SH STAGE 2 +.B runit +runs +.IR /etc/runit/2 , +which should not return until system shutdown; if it crashes, or exits 111, +it will be restarted. +Normally +.I /etc/runit/2 +starts +.BR runsvdir (8). +.B runit +is able to handle the ctrl-alt-del keyboard request in stage 2, see below. +.SH STAGE 3 +If +.B runit +is told to shutdown the system, or stage 2 returns, it terminates stage 2 if +it is running, and runs +.IR /etc/runit/3 . +The systems tasks to shutdown and possibly halt or reboot the system are +done here. +If stage 3 returns, +.B runit +checks if the file +.I /etc/runit/reboot +exists and has the execute by owner permission set. +If so, the system is rebooted, it's halted otherwise. +.SH CTRL-ALT-DEL +If +.B runit +receives the ctrl-alt-del keyboard request and the file +.I /etc/runit/ctrlaltdel +exists and has the execute by owner permission set, +.B runit +runs +.IR /etc/runit/ctrlaltdel , +waits for it to terminate, and then sends itself a CONT signal. +.SH SIGNALS +.B runit +only accepts signals in stage 2. +.P +If +.B runit +receives a CONT signal and the file +.I /etc/runit/stopit +exists and has the execute by owner permission set, +.B runit +is told to shutdown the system. +.P +if +.B runit +receives an INT signal, a ctrl-alt-del keyboard request is triggered. +.SH SEE ALSO +runit-init(8), +runsvdir(8), +runsvchdir(8), +sv(8), +runsv(8), +chpst(8), +utmpset(8), +svlogd(8) +.P +http://smarden.org/runit/ +.SH AUTHOR +Gerrit Pape diff --git a/mirror_runit/runit-2.1.2/man/runsv.8 b/mirror_runit/runit-2.1.2/man/runsv.8 new file mode 100644 index 0000000..7c5abfc --- /dev/null +++ b/mirror_runit/runit-2.1.2/man/runsv.8 @@ -0,0 +1,225 @@ +.TH runsv 8 +.SH NAME +runsv \- starts and monitors a service and optionally an appendant log +service +.SH SYNOPSIS +.B runsv +.I service +.SH DESCRIPTION +.I service +must be a directory. +.P +.B runsv +switches to the directory +.I service +and starts ./run. +If ./run exits and ./finish exists, +.B runsv +starts ./finish. +If ./finish doesn't exist or ./finish exits, +.B runsv +restarts ./run. +.P +If ./run or ./finish exit immediately, +.B runsv +waits a second before starting ./finish or restarting ./run. +.P +Two arguments are given to ./finish. +The first one is ./run's exit code, or -1 if ./run didn't exit normally. +The second one is the least significant byte of the exit status as +determined by +.BR waitpid (2); +for instance it is 0 if ./run exited normally, and the signal number +if ./run was terminated by a signal. +If +.B runsv +cannot start ./run for some reason, the exit code is 111 and the status is 0. +.P +If the file +.IR service /down +exists, +.B runsv +does not start ./run immediately. +The control interface (see below) can be used to start the service and to +give other commands to +.BR runsv . +.P +If the directory +.IR service /log +exists, +.B runsv +creates a pipe, redirects +.IR service /run's +and +.IR service /finish's +standard output to the pipe, switches to the directory +.IR service /log +and starts ./run (and ./finish) exactly as described above for the +.I service +directory. +The standard input of the log service is redirected to read from the pipe. +.P +.B runsv +maintains status information in a binary format (compatible to the +daemontools' +.B supervise +program) in +.IR service /supervise/status +and +.IR service /log/supervise/status, +and in a human-readable format in +.IR service /supervise/stat, +.IR service /log/supervise/stat, +.IR service /supervise/pid, +.IR service /log/supervise/pid. +.SH CONTROL +The named pipes +.IR service /supervise/control, +and (optionally) +.IR service /log/supervise/control +are provided to give commands to +.BR runsv . +You can use +.BR sv (8) +to control the service or just write one of the following characters to +the named pipe: +.TP +.B u +Up. +If the service is not running, start it. +If the service stops, restart it. +.TP +.B d +Down. +If the service is running, send it a TERM signal, and then a CONT signal. +If ./run exits, start ./finish if it exists. +After it stops, do not restart service. +.TP +.B o +Once. +If the service is not running, start it. +Do not restart it if it stops. +.TP +.B p +Pause. +If the service is running, send it a STOP signal. +.TP +.B c +Continue. +If the service is running, send it a CONT signal. +.TP +.B h +Hangup. +If the service is running, send it a HUP signal. +.TP +.B a +Alarm. +If the service is running, send it a ALRM signal. +.TP +.B i +Interrupt. +If the service is running, send it a INT signal. +.TP +.B q +Quit. +If the service is running, send it a QUIT signal. +.TP +.B 1 +User-defined 1. +If the service is running, send it a USR1 signal. +.TP +.B 2 +User-defined 2. +If the service is running, send it a USR2 signal. +.TP +.B t +Terminate. +If the service is running, send it a TERM signal. +.TP +.B k +Kill. +If the service is running, send it a KILL signal. +.TP +.B x +Exit. +If the service is running, send it a TERM signal, and then a CONT signal. +Do not restart the service. +If the service is down, and no log service exists, +.B runsv +exits. +If the service is down and a log service exists, +.B runsv +closes the standard input of the log service, and waits for it to terminate. +If the log service is down, +.B runsv +exits. +This command is ignored if it is given to +.IR service /log/supervise/control. +.P +Example: to send a TERM signal to the socklog-unix service, either do + # sv term /service/socklog-unix + or + # printf t >/service/socklog-unix/supervise/control +.P +.BR printf (1) +usually blocks if no +.B runsv +process is running in the service directory. +.SH CUSTOMIZE CONTROL +For each control character +.I c +sent to the control pipe, +.B runsv +first checks if +.I service\fR/control/\fIc +exists and is executable. +If so, it starts +.I service\fR/control/\fIc +and waits for it to terminate, before interpreting the command. +If the program exits with return code 0, +.B runsv +refrains from sending the service the corresponding signal. +The command +.I o +is always considered as command +.IR u . +On command +.I d +first +.I service\fR/control/t +is checked, and then +.I service\fR/control/d. +On command +.I x +first +.I service\fR/control/t +is checked, and then +.I service\fR/control/x. +The control of the optional log service cannot be customized. +.SH SIGNALS +If +.B runsv +receives a TERM signal, it acts as if the character x was written to the +control pipe. +.SH EXIT CODES +.B runsv +exits 111 on an error on startup or if another +.B runsv +is running in +.IR service . +.P +.B runsv +exits 0 if it was told to exit. +.SH SEE ALSO +sv(8), +chpst(8), +svlogd(8), +runit(8), +runit-init(8), +runsvdir(8), +runsvchdir(8), +utmpset(8) +.P +http://smarden.org/runit/ +.SH AUTHOR +Gerrit Pape diff --git a/mirror_runit/runit-2.1.2/man/runsvchdir.8 b/mirror_runit/runit-2.1.2/man/runsvchdir.8 new file mode 100644 index 0000000..f7f94dc --- /dev/null +++ b/mirror_runit/runit-2.1.2/man/runsvchdir.8 @@ -0,0 +1,55 @@ +.TH runsvchdir 8 +.SH NAME +runsvchdir \- change services directory of runsvdir(8) +.SH SYNOPSIS +.B runsvchdir +.I dir +.SH DESCRIPTION +.I dir +is a services directory for the use with +.BR runsvdir (8). +If +.I dir +does not start with a slash, it is searched in /etc/runit/runsvdir/. +.I dir +must not start with a dot. +.P +.B runsvchdir +switches to the directory +.IR /etc/runit/runsvdir/ , +copies +.I current +to +.IR previous , +and replaces +.I current +with a symlink pointing to +.IR dir . +.P +Normally +.I /service +is a symlink to +.IR current , +and +.BR runsvdir (8) +is running +.IR /service/ . +.SH EXIT CODES +.B runsvchdir +prints an error message and exits 111 on error. +.B runsvchdir +exits 0 on success. +.SH FILES + /etc/runit/runsvdir/previous + /etc/runit/runsvdir/current + /etc/runit/runsvdir/current.new +.SH SEE ALSO +runsvdir(8), +runit(8), +runit-init(8), +sv(8), +runsv(8) +.P +http://smarden.org/runit/ +.SH AUTHOR +Gerrit Pape diff --git a/mirror_runit/runit-2.1.2/man/runsvdir.8 b/mirror_runit/runit-2.1.2/man/runsvdir.8 new file mode 100644 index 0000000..adfa587 --- /dev/null +++ b/mirror_runit/runit-2.1.2/man/runsvdir.8 @@ -0,0 +1,102 @@ +.TH runsvdir 8 +.SH NAME +runsvdir \- starts and monitors a collection of runsv(8) processes +.SH SYNOPSIS +.B runsvdir +[\-P] +.I dir +[ +.I log +] +.SH DESCRIPTION +.I dir +must be a directory. +.I log +is a space holder for a readproctitle log, and must be at least seven +characters long or absent. +.P +.B runsvdir +starts a +.BR runsv (8) +process for each subdirectory, or symlink to a directory, in the services +directory +.IR dir , +up to a limit of 1000 subdirectories, +and restarts a +.BR runsv (8) +process if it terminates. +.B runsvdir +skips subdirectory names starting with dots. +.BR runsv (8) +must be in +.BR runsvdir 's +PATH. +.P +At least every five seconds +.B runsvdir +checks whether the time of last modification, the inode, or the device, of +the services directory +.I dir +has changed. +If so, it re-scans the service directory, and if it sees a new subdirectory, +or new symlink to a directory, in +.IR dir , +it starts a new +.BR runsv (8) +process; +if +.B runsvdir +sees a subdirectory being removed that was previously there, it sends the +corresponding +.BR runsv (8) +process a TERM signal, stops monitoring this process, and so does not +restart the +.BR runsv (8) +process if it exits. +.P +If the +.I log +argument is given to +.BR runsvdir , +all output to standard error is redirected to this +.IR log , +which is similar to the daemontools' +.B readproctitle +log. +To see the most recent error messages, use a process-listing tool such as +.BR ps (1). +.B runsvdir +writes a dot to the readproctitle log every 15 minutes so that old error +messages expire. +.SH OPTIONS +.TP +.B \-P +use +.BR setsid (2) +to run each +.BR runsv (8) +process in a new session and separate process group. +.SH SIGNALS +If +.B runsvdir +receives a TERM signal, it exits with 0 immediately. +.P +If +.B runsvdir +receives a HUP signal, it sends a TERM signal to each +.BR runsv (8) +process it is monitoring and then exits with 111. +.SH SEE ALSO +sv(8), +runsv(8), +runsvchdir(8), +runit(8), +runit-init(8), +chpst(8), +svlogd(8), +utmpset(8), +setsid(2) +.P +http://smarden.org/runit/ +.SH AUTHOR +Gerrit Pape diff --git a/mirror_runit/runit-2.1.2/man/sv.8 b/mirror_runit/runit-2.1.2/man/sv.8 new file mode 100644 index 0000000..7ed9852 --- /dev/null +++ b/mirror_runit/runit-2.1.2/man/sv.8 @@ -0,0 +1,285 @@ +.TH sv 8 +.SH NAME +sv \- control and manage services monitored by +.BR runsv (8) +.SH SYNOPSIS +.B sv +[\-v] [\-w +.I sec\fR] +.I command +.I services +.P +.BI /etc/init.d/ service +[\-w +.I sec\fR] +.I command +.SH DESCRIPTION +The +.B sv +program reports the current status and controls the state of services +monitored by the +.BR runsv (8) +supervisor. +.P +.I services +consists of one or more arguments, each argument naming a directory +.I service +used by +.BR runsv (8). +If +.I service +doesn't start with a dot or slash and doesn't end with a slash, it is +searched in the default services directory +.IR /service/ , +otherwise relative to the current directory. +.P +.I command +is one of up, down, status, once, pause, cont, hup, alarm, interrupt, 1, 2, +term, kill, or exit, or start, stop, restart, shutdown, force-stop, +force-reload, force-restart, force-shutdown. +.P +The +.B sv +program can be sym-linked to +.I /etc/init.d/ +to provide an LSB init script interface. +The +.I service +to be controlled then is specified by the base name of the ``init script''. +.SH COMMANDS +.TP +.B status +Report the current status of the service, and the appendant log service if +available, to standard output. +.TP +.B up +If the service is not running, start it. +If the service stops, restart it. +.TP +.B down +If the service is running, send it the TERM signal, and the CONT signal. +If ./run exits, start ./finish if it exists. +After it stops, do not restart service. +.TP +.B once +If the service is not running, start it. +Do not restart it if it stops. +.TP +.B pause cont hup alarm interrupt quit 1 2 term kill +If the service is running, send it the STOP, CONT, HUP, ALRM, INT, QUIT, +USR1, USR2, TERM, or KILL signal respectively. +.TP +.B exit +If the service is running, send it the TERM signal, and the CONT signal. +Do not restart the service. +If the service is down, and no log service exists, +.BR runsv (8) +exits. +If the service is down and a log service exists, +.BR runsv (8) +closes the standard input of the log service and waits for it to terminate. +If the log service is down, +.BR runsv (8) +exits. +This command is ignored if it is given to an appendant log service. +.P +.BR sv +actually looks only at the first character of these +.IR command s. +.SS Commands compatible to LSB init script actions +.TP +.B status +Same as +.IR status . +.TP +.B start +Same as +.IR up , +but wait up to 7 seconds for the command to take effect. +Then report the status or timeout. +If the script +.I ./check +exists in the service directory, +.B sv +runs this script to check whether the service is up and available; +it's considered to be available if +.I ./check +exits with 0. +.TP +.B stop +Same as +.IR down , +but wait up to 7 seconds for the service to become down. +Then report the status or timeout. +.TP +.B reload +Same as +.IR hup , +and additionally report the status afterwards. +.TP +.B restart +Send the commands +.IR term , +.IR cont , +and +.I up +to the service, and wait up to 7 seconds for the service to restart. +Then report the status or timeout. +If the script +.I ./check +exists in the service directory, +.B sv +runs this script to check whether the service is up and available again; +it's considered to be available if +.I ./check +exits with 0. +.TP +.B shutdown +Same as +.IR exit , +but wait up to 7 seconds for the +.BR runsv (8) +process to terminate. +Then report the status or timeout. +.TP +.B force-stop +Same as +.IR down , +but wait up to 7 seconds for the service to become down. +Then report the status, and on timeout send the service the +.I kill +command. +.TP +.B force-reload +Send the service the +.I term +and +.I cont +commands, and wait up to 7 seconds for the service to restart. +Then report the status, and on timeout send the service the +.I kill +command. +.TP +.B force-restart +Send the service the +.IR term , +.I cont +and +.I up +commands, and wait up to 7 seconds for the service to restart. +Then report the status, and on timeout send the service the +.I kill +command. +If the script +.I ./check +exists in the service directory, +.B sv +runs this script to check whether the service is up and available again; +it's considered to be available if +.I ./check +exits with 0. +.TP +.B force-shutdown +Same as +.IR exit , +but wait up to 7 seconds for the +.BR runsv (8) +process to terminate. +Then report the status, and on timeout send the service the +.I kill +command. +.TP +.B try-restart +if the service is running, send it the +.I term +and +.I cont +commands, and wait up to 7 seconds for the service to restart. +Then report the status or timeout. + +.SS Additional Commands +.TP +.B check +Check for the service to be in the state that's been requested. +Wait up to 7 seconds for the service to reach the requested state, then +report the status or timeout. +If the requested state of the service is +.IR up , +and the script +.I ./check +exists in the service directory, +.B sv +runs this script to check whether the service is up and running; it's +considered to be up if +.I ./check +exits with 0. +.SH OPTIONS +.TP +.B \-v +If the +.I command +is up, down, term, once, cont, or exit, then wait up to 7 seconds for the +command to take effect. +Then report the status or timeout. +.TP +.B \-w \fIsec +Override the default timeout of 7 seconds with +.I sec +seconds. +This option implies +.IR \-v . +.SH ENVIRONMENT +.TP +.B SVDIR +The environment variable $SVDIR overrides the default services directory +.IR /service/ . +.TP +.B SVWAIT +The environment variable $SVWAIT overrides the default 7 seconds to wait +for a command to take effect. +It is overridden by the \-w option. +.SH EXIT CODES +.B sv +exits 0, if the +.I command +was successfully sent to all +.IR services , +and, if it was told to wait, the +.I command +has taken effect to all services. +.P +For each +.I service +that caused an error (e.g. the directory is not controlled by a +.BR runsv (8) +process, or +.B sv +timed out while waiting), +.B sv +increases the exit code by one and exits non zero. +The maximum is 99. +.B sv +exits 100 on error. +.P +If +.B sv +is called with a base name other than +.BR sv : +it exits 1 on timeout or trouble sending the command; if the +.I command +is +.BR status , +it exits 3 if the service is down, and 4 if the status is unknown; +it exits 2 on wrong usage, and 151 on error. +.SH SEE ALSO +runsv(8), +chpst(8), +svlogd(8), +runsvdir(8), +runsvchdir(8), +runit(8), +runit-init(8) +.P +http://smarden.org/runit/ +.SH AUTHOR +Gerrit Pape diff --git a/mirror_runit/runit-2.1.2/man/svlogd.8 b/mirror_runit/runit-2.1.2/man/svlogd.8 new file mode 100644 index 0000000..01b2324 --- /dev/null +++ b/mirror_runit/runit-2.1.2/man/svlogd.8 @@ -0,0 +1,464 @@ +.TH svlogd 8 +.SH NAME +svlogd \- runit's service logging daemon +.SH SYNOPSIS +.B svlogd +[\-tttv] [\-r +.I c\fR] [\-R +.I xyz\fR] [\-l +.I len\fR] [\-b +.I buflen\fR] +.I logs +.SH DESCRIPTION +.I logs +consists of one or more arguments, each specifying a directory. +.P +.B svlogd +continuously reads log data from its standard input, optionally filters log +messages, and writes the data to one or more automatically rotated +.IR logs . +.P +Recent log files can automatically be processed by an arbitrary processor +program when they are rotated, and +.B svlogd +can be told to alert selected log messages to standard error, and through +udp. +.P +.B svlogd +runs until it sees end-of-file on standard input or is sent a TERM signal, +see below. +.SS LOG DIRECTORY +A log directory +.I log +contains some number of old log files, and the current log file +.IR current . +Old log files have a file name starting with +.I @ +followed by a precise timestamp (see the daemontools' +.B tai64n +program), indicating when +.I current +was rotated and renamed to this file. +.P +A log directory additionally contains the lock file +.IR lock , +maybe +.I state +and +.IR newstate , +and optionally the file +.IR config . +.B svlogd +creates necessary files if they don't exist. +.P +If +.B svlogd +has trouble opening a log directory, it prints a warning, and ignores this +log directory. +If +.B svlogd +is unable to open all log directories given at the command line, it exits +with an error. +This can happen on start-up or after receiving a HUP signal. +.SS LOG FILE ROTATION +.B svlogd +appends selected log messages to the +.I current +log file. +If +.I current +has +.I size +bytes or more (or there is a new-line within the last +.I len +of +.I size +bytes), or is older than a specified amount of +.IR time , +.I current +is rotated: +.P +.B svlogd +closes +.IR current , +changes permission of +.I current +to 0755, renames +.I current +to +.RI @ timestamp\fR.s, +and starts with a new empty +.IR current . +If +.B svlogd +sees +.I num +or more old log files in the log directory, it removes the oldest one. +Note that this doesn't decrease the number of log files if there are +already more than +.I num +log files, this must be done manually, e.g. for keeping 10 log files: +.P + ls \-1 \\@* |sort |sed \-ne '10,$p' |xargs rm +.SS PROCESSOR +If +.B svlogd +is told to process recent log files, it saves +.I current +to +.RI @ timestamp\fR.u, +feeds +.RI @ timestamp\fR.u +through ``sh \-c "\fIprocessor\fR"'' +and writes the output to +.RI @ timestamp\fR.t. +If the +.I processor +finishes successfully, +.RI @ timestamp\fR.t +is renamed to +.RI @ timestamp\fR.s, +and +.RI @ timestamp\fR.u +is deleted; otherwise +.RI @ timestamp\fR.t +is deleted and the +.I processor +is started again. +.B svlogd +also saves any output that the +.I processor +writes to file descriptor 5, and makes that output available on file +descriptor 4 when running +.I processor +on the next log file rotation. +.P +A +.I processor +is run in the background. +If +.B svlogd +sees a previously started +.I processor +still running when trying to start a new one for the same +.IR log , +it blocks until the currently running +.I processor +has finished successfully. +Only the HUP signal works in that situation. +Note that this may block any program feeding its log data to +.BR svlogd. + +.SS CONFIG +On startup, and after receiving a HUP signal, +.B svlogd +checks for each log directory +.I log +if the configuration file +.I log/config +exists, and if so, reads the file line by line and adjusts configuration for +.I log +as follows: +.P +If the line is empty, or starts with a ``#'', it is ignored. +A line of the form +.TP +.RI s size +sets the maximum file size of +.I current +when +.B svlogd +should rotate the current log file to +.I size +bytes. +Default is 1000000. +If +.I size +is zero, +.B svlogd +doesn't rotate log files. +You should set +.I size +to at least (2 * +.IR len ). +.TP +.RI n num +sets the number of old log files +.B svlogd +should maintain to +.IR num . +If +.B svlogd +sees more that +.I num +old log files in +.I log +after log file rotation, it deletes the oldest one. +Default is 10. +If +.I num +is zero, +.B svlogd +doesn't remove old log files. +.TP +.RI N min +sets the minimum number of old log files +.B svlogd +should maintain to +.IR min . +.I min +must be less than +.IR num . +If +.I min +is set, and +.B svlogd +cannot write to +.I current +because the filesystem is full, and it sees more than +.I min +old log files, it deletes the oldest one. +.TP +.RI t timeout +sets the maximum age of the +.I current +log file when +.B svlogd +should rotate the current log file to +.I timeout +seconds. +If +.I current +is +.I timeout +seconds old, and is not empty, +.B svlogd +forces log file rotation. +.TP +.RI ! processor +tells +.B svlogd +to feed each recent log file through +.I processor +(see above) on log file rotation. +By default log files are not processed. +.TP +.RI u a.b.c.d[:port] +tells +.B svlogd +to transmit the first +.I len +characters of selected log messages to the IP address +.IR a.b.c.d , +port number +.IR port . +If +.I port +isn't set, the default port for syslog is used (514). +.I len +can be set through the \-l option, see below. +If +.B svlogd +has trouble sending udp packets, it writes error messages to the log +directory. +Attention: +logging through udp is unreliable, and should be used in private networks +only. +.TP +.RI U a.b.c.d[:port] +is the same as the +.I u +line above, but the log messages are no longer written to the log directory, +but transmitted through udp only. +Error messages from +.B svlogd +concerning sending udp packages still go to the log directory. +.TP +.RI p prefix +tells +.B svlogd +to prefix each line to be written to the log directory, to standard error, +or through UDP, with +.IR prefix . +.P +If a line starts with a +.IR \- , +.IR + , +.IR e , +or +.IR E , +.B svlogd +matches the first +.I len +characters of each log message against +.I pattern +and acts accordingly: +.TP +.RI \- pattern +the log message is deselected. +.TP +.RI + pattern +the log message is selected. +.TP +.RI e pattern +the log message is selected to be printed to standard error. +.TP +.RI E pattern +the log message is deselected to be printed to standard error. +.P +Initially each line is selected to be written to +.IR log/current . +Deselected log messages are discarded from +.IR log . +Initially each line is deselected to be written to standard err. +Log messages selected for standard error are written to standard error. +.SH PATTERN MATCHING +.B svlogd +matches a log message against the string +.I pattern +as follows: +.P +.I pattern +is applied to the log message one character by one, starting with the first. +A character not a star (``*'') and not a plus (``+'') matches itself. +A plus matches the next character in +.I pattern +in the log message one or more times. +A star before the end of +.I pattern +matches any string in the log message that does not include the next +character in +.IR pattern . +A star at the end of +.I pattern +matches any string. +.P +Timestamps optionally added by +.B svlogd +are not considered part of the log message. +.P +An +.B svlogd +pattern is not a regular expression. +For example consider a log message like this +.P + 2005-12-18_09:13:50.97618 tcpsvd: info: pid 1977 from 10.4.1.14 +.P +The following pattern doesn't match +.P + -*pid* +.P +because the first star matches up to the first p in tcpsvd, and then the +match fails because i is not s. +To match this log message, you can use a pattern like this instead +.P + -*: *: pid * +.SH OPTIONS +.TP +.B \-t +timestamp. +Prefix each selected line with a precise timestamp (see the daemontools' +.B tai64n +program) when writing to +.I log +or to standard error. +.TP +.B \-tt +timestamp. +Prefix each selected line with a human readable, sortable UTC timestamp of +the form YYYY-MM-DD_HH:MM:SS.xxxxx when writing to +.I log +or to standard error. +.TP +.B \-ttt +timestamp. +Prefix each selected line with a human readable, sortable UTC timestamp of +the form YYYY-MM-DDTHH:MM:SS.xxxxx when writing to +.I log +or to standard error. +.TP +.B \-r \fIc +replace. +.I c +must be a single character. +Replace non-printable characters in log messages with +.IR c . +Characters are replaced before pattern matching is applied. +.TP +.B \-R \fIxyz +replace charset. +Additionally to non-printable characters, replace all characters found in +.I xyz +with +.I c +(default ``_''). +.TP +.B \-l \fIlen +line length. +Pattern matching applies to the first +.I len +characters of a log message only. +Default is 1000. +.TP +.B \-b \fIbuflen +buffer size. +Set the size of the buffer +.B svlogd +uses when reading from standard input and writing to +.I logs +to +.IR buflen . +Default is 1024. +.I buflen +must be greater than +.IR len . +For +.B svlogd +instances that process a lot of data in short time, the buffer size should +be increased to improve performance. +.TP +.B \-v +verbose. +Print verbose messages to standard error. +.SH SIGNALS +If +.B svlogd +is sent a HUP signal, it closes and reopens all +.IR logs , +and updates their configuration according to +.IR log/config . +If +.B svlogd +has trouble opening a log directory, it prints a warning, and discards this +log directory. +If +.B svlogd +is unable to open all log directories given at the command line, it exits +with an error. +.P +If +.B svlogd +is sent a TERM signal, or if it sees end-of-file on standard input, it stops +reading standard input, processes the data in the buffer, waits for all +.I processor +subprocesses to finish if any, and exits 0 as soon as possible. +.P +If +.B svlogd +is sent an ALRM signal, it forces log file rotation for all +.I logs +with a non empty +.I current +log file. +.SH SEE ALSO +sv(8), +runsv(8), +chpst(8), +runit(8), +runit-init(8), +runsvdir(8), +runsvchdir(8) +.P +http://smarden.org/runit/ +.SH AUTHOR +Gerrit Pape diff --git a/mirror_runit/runit-2.1.2/man/utmpset.8 b/mirror_runit/runit-2.1.2/man/utmpset.8 new file mode 100644 index 0000000..4f9b4ef --- /dev/null +++ b/mirror_runit/runit-2.1.2/man/utmpset.8 @@ -0,0 +1,63 @@ +.TH utmpset 8 +.SH NAME +utmpset \- logout a line from utmp and wtmp file +.SH SYNOPSIS +.B utmpset +[ +.B \-w +] +.I line +.SH DESCRIPTION +The +.B utmpset +program modifies the user accounting database +.BR utmp (5) +and optionally +.BR wtmp (5) +to indicate that the user on the terminal +.I line +has logged out. +.P +Ordinary +.BR init (8) +processes handle utmp file records for local login accounting. +The +.BR runit (8) +program doesn't include code to update the utmp file, the +.BR getty (8) +processes are handled the same as all other services. +.P +To enable local login accounting, add +.B utmpset +to the +.BR getty (8) +.I finish +scripts, e.g.: +.P + $ cat /service/getty-5/finish + #!/bin/sh + exec utmpset \-w tty5 + $ +.SH OPTIONS +.TP +.B \-w +wtmp. Additionally to the utmp file, write an empty record for +.I line +to the wtmp file. +.SH EXIT CODES +.B utmpset +returns 111 on error, 1 on wrong usage, 0 in all other cases. +.SH SEE ALSO +sv(8), +runsv(8), +runit(8), +runit-init(8) +runsvdir(8), +runsvchdir(8), +chpst(8), +svlogd(8), +getty(8) +.P +http://smarden.org/runit/ +.SH AUTHOR +Gerrit Pape diff --git a/mirror_runit/runit-2.1.2/package/CHANGES b/mirror_runit/runit-2.1.2/package/CHANGES new file mode 100644 index 0000000..da4ea27 --- /dev/null +++ b/mirror_runit/runit-2.1.2/package/CHANGES @@ -0,0 +1,688 @@ +2.1.2 +Sun, 10 Aug 2014 18:01:54 +0000 + * doc/index.html: reorder, cleanup links to distributions; add Linux + from Scratch, Finnix, VServer. + * sv.c: properly format status command's output on failure cases. + * sv.c: support optional LSB init script actions reload and + try-restart. + * man/sv.8: "sv exit" does not send a TERM signal to the log service + (thx Jonathan Nieder). + * fmt_ptime.c: 64 bits time_t fix for svlogd (tnx Jérémie + Courrèges-Anglas). + * sv.c: fix typo that may lead to wrong output from sv when reporting + status of multiple service directories. + * doc/index.html: add deepOfix Mail Server to list of distributions + that include runit (thx Debayan Banerjee). + * doc/useinit.html: update description on how to use with upstart + (thx Gabriel de Perthuis). + * doc/index.html: add Dragora GNU/Linux to list of distributions that + use runit as default init scheme (thx Matias A. Fonzo). + * doc/index.html: add ArchLinux to list of distributions that include + runit (thx Kevin Berry). + +2.1.1 +Sun, 04 Oct 2009 20:28:38 +0000 + * doc/upgrade.html: fix typo. + * sv.c: on 'down', send runsv the 'down' command properly if not yet + done (e.g. when taken up with 'once'). + +2.1.0 +Thu, 24 Sep 2009 22:49:33 +0000 + * pathexec_env.c, pathexec.h: add function pathexec_env_run(). + * chpst.c, man/chpst.8: new option -b argv0: run prog with different + 0th argument. + * sv.c: fix exit code of status command in lsb mode (thx Mathieu + Poumeyrol) + * chpst.c, svwaitdown.c, svwaitup.c: fix checks for return value of + open_* functions (thx David Reiss). + * runsv.c: exit with error if [log/]supervise/control exists, but is + not a fifo (thx Charlie Brady). + * man/sv.8: clarify which return values apply to the LSB init script + interface. + +2.0.0 +Sun, 15 Jun 2008 15:31:05 +0000 + +1.9.0 +Mon, 05 May 2008 22:00:13 +0000 + * doc/upgrade.html: typo. + * sv.c: service name is also relative to the current directory if it + ends with a slash. + * change default directory for services from /var/service/ to /service/. + * runsv.c: create temporary new status files for log/supervise/ actually + in log/supervise/. + * doc/benefits.html: minor additions. + +1.8.0 +Fri, 21 Sep 2007 00:33:56 +0000 + * man/svlogd.8: add hint on how to manually remove log files after the + number of log files svlogd should maintain has been reduced; add hint + about increasing the buffer size if lots of data is to be processed + in short time. + * chpst.c, uidgid.c: improve error reporting if getpwnam() or getgrnam() + fails; cleanup. + * svlogd.c: don't statically bind local udp socket, but request new + source port for each log message sent through udp. + * runit.c: fix typo in error messages (thx Matthew R. Dempsky); minor + rewording. + * doc/useinit.html: add instructions on how to use with upstart (thx + Lloyd Zusman). + * chpst.c: add explicit braces to avoid ambiguous 'else'. + * uw_tmp.h1: fallback to UTMP_FILE if _PATH_UTMP is not defined as seen + on AIX 5.2 ML1, AIX 5.3 ML5 (thx Daniel Clark). + * sv.c: fix race on check for down if pid is 0 and state is run or finish. + * runit.c: speed up collecting zombies. + * runit.c: force check for zombies after a 14 second timeout without + signals (CHLD, CONT, INT). + * doc/index.html: typo. + * doc/*.html: remove $Id$. + +1.7.2 +Tue, 21 Nov 2006 15:13:47 +0000 + * doc/index.html: add list of distributions that are known to include + or package runit; some reordering. + * doc/replaceinit.html: point to faq.html#create, faq.html#tell (thx + David Kaufman). + * doc/runscripts.html: point to faq.html#createlog. + * runit.c: fix arguments to wait_pid() after fork for reboot_system() + (thx Jan Kampe). + * man/runsv.8: suggest printf t instead of echo -n t. + * runsv.c: really don't act on commands in state finish; minor. + +1.7.1 +Sat, 04 Nov 2006 19:23:29 +0000 + * chpst.c, uidgid.c, uidgid.h: support numerical uid gid through + chpst -[u|U] :uid:gid... + * man/chpst.8: adapt; clarify that users and groups are looked up in + /etc/passwd and /etc/group only. + * sv.c: properly wait for a service to be restarted on 'restart'; + support checks through -v for pause, cont, kill. + * doc/runscripts.html: add contributed run scripts (thx Kevin, marlowe, + ed neville, xavier dutoit). + +1.7.0 +Sat, 07 Oct 2006 18:24:17 +0000 + * svlogd.c, fmt_ptime.*, man/svlogd.8: new option -ttt: prefix log + messages with sortable UTC timestamp YYYY-MM-DDTHH:MM:SS.xxxxx. + * runsv.c, runsv.8: give two arguments to ./finish: exit code and exit + status of ./run (mostly copied from pipe-tools' npt-supervise, thx + Laurent Bercot). + * runit.c: don't make console the controlling terminal for process 1, + but for stage 1 only; fork before initiating system halt or reboot, + the linux kernel calls do_exit(0) in kernel/sys.c (thx Jan Kampe). + +1.6.0 +Thu, 29 Jun 2006 07:52:35 +0000 + * svlogd.c: cleanup *.t files possibly leftover by processor when + interrupted by signal, also on startup (thx Andras Korn, + http://bugs.debian.org/369840); 1st rename .t to .s, then remove .u. + * man/svlogd.8: adapt. + * svlogd.c: prepend optional timestamp to log messages sent through UDP, + as done for messages written to dir and to stderr. + * uidgid.c: properly fixup user/group argument on getpwnam() error. + * doc/benefits.html: typo; wording. + +1.5.1 +Wed, 10 May 2006 20:55:35 +0000 + * runsv.c: delay restart of log service at least 1 sec, just as the main + service. + * runsvdir.c: don't double-copy filedescriptor. + * package/README, package/COPYING: 2006. + * man/runsvctrl.8, man/runsvstat.8, man/svwaitup.8, man/svwaitdown.8, + doc/runsvctrl.html, doc/runsvstat.html, doc/svwaitdown.html, + doc/svwaitup.html: remove; obsolete. + +1.5.0 +Sun, 16 Apr 2006 12:26:50 +0000 + * man/runsvdir.8: document that the services directory is re-scanned if + the time of last modification, the inode, or the device has changed. + * sv.c: don't report success on 'sv start' if the service is in state + finish (thx Matthew R. Dempsky). + * svlogd.c: new config line p: optionally prefix each line written to + logs, stderr, or through udp; no longer skip empty lines (just + containing '\n'), old behavior can be restored with '-' in config. + * man/svlogd.8: document new p config line; adapt. + +1.4.1 +Mon, 20 Mar 2006 18:54:41 +0000 + * doc/faq.html: typos; add usercontrol, userservices; minor. + * src/uidgid.h: use uid_t, git_t (fix setting of multiple groups with + dietlibc, thx Tino Keitel, http://bugs.debian.org/356016) + +runit 1.4.0 +Mon, 06 Mar 2006 12:45:08 +0000 + * doc/faq.html: new. + * doc/benefits.html: use sv program instead of runsvstat, runsvctrl; + minor. + * doc/replaceinit.html, doc/runlevels.html: put getty service directory + into /etc/sv/. + * doc/runscripts.html: use sv program instead of svwaitup. + * etc/*/3, etc/macosx/StartupItems/runit: use sv program instead of + svwaitdown. + * man/runsv.8: use sv program instead of runsvctrl. + * man/sv.8: minor. + * Makefile, package/commands: no longer build/install runsvctrl, + runsvstat, svwaitdown, svwaitup. + * man/runsvctrl.8, man/runsvstat.8, man/svwaitdown.8, man/svwaitup.8: + remove; obsolete. + * doc/index.html: add faq; remove runsvctrl, runsvstat, svwaitdown, + svwaitup. + * sv: fix usage output. + * chpst: new option -d, limit data segment per process; don't use nested + functions. + +runit 1.3.3 +Mon, 02 Jan 2006 20:35:34 +0000 + * chpst.c: adjust nice value and set limits before dropping permissions. + * sv.c: new additional command 'check'; with -v check for CONT through + ./check if service is up. + * man/sv.8: adapt. + +runit 1.3.2 +Sun, 18 Dec 2005 11:22:04 +0000 + * svlogd.c: don't print extra newlines to the log if additionally writing + to the network through udp (thx Andras Korn, + http://bugs.debian.org/339030). + * runsvdir.c: also process svdir changes if mtime of svdir has changed into + the past (thx Martin Dickopp). + * doc/index.html: update description; Please contact this list and not me + privately. + * doc/replaceinit.html, doc/runscripts.html: minor. + * man/chpst.8: -U doesn't support a list of groups. + * man/svlogd.8: update PATTERN MATCHING section, add example (based on + sugesstions from Joshua N Pritikin). + * man/*8: update SEE ALSO sections: runsvctrl, runsvstat, svwaitdown, + svwaitup will become obsolete; remove references to man pages for + programs from the daemontools package. + +runit 1.3.1 +Wed, 24 Aug 2005 20:14:17 +0000 + * doc/runscripts.html: typo; openssh needs absolute path (thx Kevin Berry); + exec into dhcpcd. + * uidgid.c, uidgid.h, chpst.c: support colon-separated list of groups. + * sv.c: utilize optional ./check script in service directory to check for + availablity of service. + * runsv.c: wait_pid() might be interupted. + * man/chpst.8, man/sv.8: adapt. + +runit 1.3.0 +Sun, 24 Jul 2005 16:50:55 +0000 + * man/runsv.8: typo; no longer document the e control character; clarify + custom control on d and x. + * doc/useinit.html: how to use runit with macosx 10.4 (thx Lars Uffmann). + * etc/macosx/org.smarden.runit.plist: new; launchd plist file for + runsvdir-start (thx Lars Uffmann). + * doc/runscripts.html: don't use absolute pathnames for programs in $PATH; + add contributed run scripts (thx Sascha Huedepohl); typos. + * runsvchdir.c, runsvstat.c: optimize output buffer handling. + * runsvctrl.c: write x control character to runsv on e. + * svlogd.c: write to log dir after possibly writing through udp (fixes + line break issue). + * runsv.c, runsv.check: optimize output buffer handling; porperly run + custom t, d, x, k, when stopping service; no longer support e control + character. + * sv.c: new sv program to control services, optionally can be linked to + /etc/init.d/ as lsb "init script" command line interface. + * Makefile, TARGETS: adapt. + * chpst.c: fix pointer types. + * man/sv.8: new. + * package/TODO: new. + +runit 1.2.3 +Mon, 18 Apr 2005 17:08:35 +0000 + * doc/runscripts.html: add contributed run scripts (thx Kevin Berry); + remove mysql run scripts. + * svlogd.dist, svwaitdown.dist, svwaitup.dist: fix program selftest's + false alarms (thx Ian Stokes-Rees). + +runit 1.2.2 +Sun, 03 Apr 2005 09:21:52 +0000 + * doc/index.html, doc/replaceinit.html: no longer refer to sysvinit's + shutdown program. + * man/svlogd.8: svlogd doesn't decrease the number of log files in a log + directory; with n0 don't remove any log files. + * svlogd.c: properly prefix log messages written to standard error with + optional timestamp. + * runsvctrl.c, svwaitdown.c, svwaitup.c: supervise not running -> runsv + not running. + * package/README: 2005. + +runit 1.2.1 +Sat, 15 Jan 2005 11:57:46 +0000 + * chpst.c: typo. + * svwaitdown.c: minimum timeout is 1 second; service directories no longer + must start with /. + * svwaitup.c: minimum uptime of services is 1 second; service directories + no longer must start with /; print number of seconds a service is up if + verbose. + * man/svwaitdown.8, man/svwaitup.8: adapt. + * doc/runscripts.html: add contributed run scripts (thx Stefan Karrmann, + Kevin Berry, Karl Chen). + * runsv.c: typos; bugfix: run optional control/x when receiving SIGTERM + (thx Vladimir Smelhaus); minor. + * man/runsvctrl.8: minor. + * package/COPYING: adapt, 2005. + +runit 1.2.0 +Fri, 17 Dec 2004 21:08:50 +0000 + * doc/upgrade.html: typo. + * runsv.c: support custom control commands through control/ directory, + optionally switch off sending signal; don't update timestamp in status + when running ./finish; only sleep for a second if ./run has been + restarted within a second, and after updating status to down, normally + up, want up. + * man/runsv.8: document custom control commands. + * runsv.check, runsv.dist: check custom control commands. + * doc/runscripts.html: add contributed run scripts (thx Stefan Karrmann, + Kevin Berry). + +runit 1.1.0 +Sat, 06 Nov 2004 17:21:11 +0000 + * svlogd.c: new config option t timeout (thx Enrico Scholz); config + options e and E select and deselect lines for stderr respectively (thx + Vladimir Smelhaus); new config option N. + * man/svlogd.8: adapt. + * runsv.c: on commands down and exit send CONT after TERM. + * man/runsv.8: adapt. + * etc/2: use -P option to runsvdir. + * src/svlogd.check: add check for t config option. + * chpst.c: new option -n: adjust nice level. + * man/chpst.8: adapt. + +runit 1.0.5 +Tue, 21 Sep 2004 18:18:14 +0000 + * svlogd.c: fix line buffer handling for pattern matching (thx Enrico + Scholz); properly retry writing to current on error; minor. + * doc/index.html: wording; add link to useinit.html; remove link to runit + on linuxfromscratch. + * doc/runscripts.html: add hint, some getties need to be run in a new + session/process group (thx Dan Melomedman). + * man/svlogd.8: minor fixes. + * man/svwaitdown.8: remove hint about -x option. + * package/check, package/compile, package/install, package/install-man, + package/upgrade: use set -e instead of #!/bin/sh -e. + * runsvdir.c: new option -P, run each runsv process in a new session and + process group (thx Charlie Brady). + * man/runsvdir.8: adapt; typo. + +runit 1.0.4 +Sun, 01 Aug 2004 18:29:36 +0000 + * doc/runlevels.html, doc/upgrade.html, doc/useinit.html, man/runsvdir.8, + man/runsvchdir.8: minor changes in wording, notations. + * runsvdir.c: check services dir again after one second until it's + unchanged (thx Eric Lammerts); sleep one second before scanning if + services dir mtime is now; loop while chdir to starting dir fails; + rename log, loglen to rplog, rploglen. + * etc/macosx/StartupItems/runit: use -x option to svwaitdown; timeout 14. + +runit 1.0.3 +Sat, 26 Jun 2004 14:50:41 +0000 + * chpst.c, man/chpst.8: new option -/ chroot. + * runit.c, man/runit.8: if stage 1 crashes or exits 100, stage 2 will be + skipped; if stage 2 crashes or exits 111, it will be restarted. + * package/check, package/compile, package/install-man, package/upgrade: + minor cleanup. + * doc/runscripts.html: add, adapt various run scripts (thx). + +runit 1.0.2 +Mon, 29 Mar 2004 17:52:50 +0000 + * man/svlogd.8: timestamps are not considered when matching patterns (thx + Andras KORN). + * runsv.c: on exit run the finish scripts when taking the service down + (thx X.). + * runsv.c, runsvctrl.c: handle sig_quit (thx Wayne Marshall). + * svlogd.c: don't crash on zero byte long config file (thx Alex Efros). + * man/*: minor cleanup. + * doc/index.html: add link to runit on linuxfromscratch doc (thx Richard + A Downing FBCS). + +runit 1.0.1 +Sun, 07 Mar 2004 10:40:40 +0000 + * doc/usedietlibc.html: minor. + * fmt_ptime.c: create timestamps in UTC, not localtime. + * chpst.c: -e dir: silently ignore directories, print warning if verbose. + * runsv.c: allow also log/supervise to be a dangling symlink; more + meaningful error message if opening lock or locking fails. + * check-diff, check-dist, check-local, package/check: new; run checks on + programs. + * package/install: run package/check. + * chpst.check, runit-init.check, runit.check, runsv.check, + runsvchdir.check, runsvctrl.check, runsvdir.check, runsvstat.check, + svlogd.check, svwaitdown.check, svwaitup.check, utmpset.check: new; + check program. + * chpst.dist, runit-init.dist, runit.dist, runsv.dist, runsvchdir.dist, + runsvctrl.dist, runsvdir.dist, runsvstat.dist, svlogd.dist, + svwaitdown.dist, svwaitup.dist, utmpset.dist: new; dist check program + output. + +runit 1.0.0 +Tue, 10 Feb 2004 13:37:28 +0000 + * doc/benefits.html, doc/dependencies.html, doc/index.html, + doc/replaceinit.html, doc/runlevels.html, doc/upgrade.html, + doc/useinit.html: cleanup; minor. + * man/utmpset.8: run utmpset in finish script, not run script. + * man/runsvdir.8: minor. + +runit 0.13.1 +Mon, 19 Jan 2004 18:32:58 +0000 + * doc/upgrade.html: typo. + * svlogd.c: bugfix: properly print new-line character to the log on end + of line (thx Pawel Chmielowski). + * trysocketlib.c: new; check for libraries needed for socket() on some + systems (fixes link failure on solaris, thx Uffe Jakobsen). + * Makefile: adapt. + * print-cc.sh, print-ld.sh: head -1 -> head -n1. + +runit 0.13.0 +Mon, 12 Jan 2004 14:39:38 +0000 + * doc/runscripts.html: use html named entities (thx Taj Khattra); add + more contributed run scripts (thx Marek Bartnikowski, Thomas Schwinge). + * svlogd.c: support sending log entries to remote host through udp, + configurable through u and U lines in log dir config file; minor. + * man/svlogd.8: adapt; document -tt option. + * package/compile, package/install-man, package/upgrade: exit 1 on + sub-shell failures. + * man/runsv.8: fix typos (thx Christian Hammers). + +runit 0.12.1 +Tue, 18 Nov 2003 15:42:44 +0000 + * doc/runscripts: add pppd run script (with chpst) next to the ppp one. + * man/chpst.8: typo. + * etc/debian/3: test -r -> test -x (thx Alejandro Mery). + * runsv.c: don't start new processes while collecting children. + +runit 0.12.0 +Wed, 29 Oct 2003 18:27:48 +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). + * doc/benefits.html, doc/index.html, doc/replaceinit.html, + doc/runlevels.html, doc/useinit.html: default service directory is + /var/service; minor. + * etc/2, etc/debian/3, etc/freebsd/3, etc/macosx/StartupItems/runit, + etc/openbsd/3, man/runsv.8, man/runsvchdir.8, man/runsvdir.8: default + service directory is /var/service. + * doc/runscripts.html: add more contributed run scripts (thx Tomasz + Nidecki). + +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 + when using runit service supervision with traditional init, use + /sbin/runsvdir-start instead. + * fmt_ptime.c: calculate UTC localtime correctly. + * runsv.c: support ./supervise as symbolic link, on dangling symlink create + link target. + +runit 0.11.1 +Thu, 4 Sep 2003 11:51:02 +0200 + * src/Makefile: add dependency to sysdeps to target fmt_ptime.o (thx Thomas + Schwinge). + * svlogd.c: barf if all log directories given at the command line fail. + * man/svlogd.8: adapt. + * doc/runscripts.html: adaptions (thx Erich Schubert, Lang Martin). + +runit 0.11.0 +Fri, 08 Aug 2003 12:37:14 +0200 + * uidgid.c, uidgid.h: new; get uid/gid by name. + * chpst: new; run program with a changed process state (includes envdir, + envuidgid, pgrphack, setlock, setuidgid, softlimit functionality). + * setuidgid.c: remove; obsolete (replaced by chpst). + +runit 0.10.0 +Sun, 22 Jun 2003 20:44:58 +0200 + * doc/index.html, doc/install.html, doc/replaceinit.html, doc/useinit.html: + how to install and configure runit on MacOSX. + * svlogd.c: typo; fix incorrect handling of processor's state file; minor + code cleanup; correctly calculate size for all types of timestamps. + * runit-init.c: exit 0 on wrong usage. + * package/versions: new. + +runit 0.9.5 +Tue, 17 Jun 2003 10:48:10 +0200 + * runit.c: use select() on systems that don't provide poll(). + * svlogd.c: reset match flag in lineflush() in all cases. + * Makefile: build setuidgid in default target. + * doc/useinit.html: add instruction to create /etc/runit/2 first. + * doc/install.html: minor. + +runit 0.9.4 +Wed, 04 Jun 2003 13:56:33 +0200 + * svlogd.c: default log file size is 1M; print verbose message only if + -v is set. + * man/svlogd.8: document -v option; minor. + * etc/freebsd/3, etc/openbsd/3: check if magic files in /etc/runit/ are + executable, not readable. + * 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). + * Makefile: build setuidgid. + * doc/index.html: update. + +runit 0.9.3 +Sun, 04 May 2003 11:30:58 +0200 + * Makefile: actually build runsvstat, runsvctrl before installing them, + fixes build failure (thx Lukas Beeler). + * runsvctrl.c, runsvstat.c: use _exit(). + +runit 0.9.2 +Sat, 03 May 2003 17:40:23 +0200 + * doc/runscripts.html: changes from Jesse Cablek. + * doc/dependencies.html, doc/useinit.html: new. + * doc/index.html: adapt; reorder programs; runsvstat, runsvctrl installed + by default. + * doc/install.html: remove dependency on daemontools; create /package. + * doc/replaceinit.html, man/runsv.8: typos. + * man/svwaitdown.8, man/svwaitup.8: refer to runit and supervise. + * svlogd.c: fix counter var namespace. + * package/commands: add runsvctrl, runsvstat. + +runit 0.9.1 +Wed, 30 Apr 2003 22:10:57 +0200 + * svlogd.c: reset match flag on deselection, fixes pattern matching. + +runit 0.9.0 +Fri, 25 Apr 2003 09:22:03 +0200 + * runsvdir.c: don't propagate sig_term to runsv processes when receiving + sig_term; send sig_term to all runsv processes and exit 111 when + receiving sig_hangup. + * runit.c: print warning for each state that exits non-zero; restart + stage 2 if it exits non-zero. + * svlogd.c: code cleanup. + * svwaitdown.c: send command 'd' (and 'x' if -x is set) to each service if + it's not in state 'want down'. + * svwaitup.c: minor code cleanup. + * man/runsvdir.8, man/svwaitdown.8: adapt. + * doc/runscripts.html: add contributed run scripts (thx!). + * doc/upgrade.html, doc/index.html: adapt. + +runit 0.8.4 +Sun, 20 Apr 2003 19:31:24 +0200 + * svlogd.c: new; runit's service logging daemon. + * fmt_ptime.h, fmt_ptime.c, pmatch.h, pmatch.c: new. + * man/svlogd.8, doc/svlogd.8.html: new. + * man/runsv.8, man/runsvstat.8, man/utmpset.8: minor cleanup. + +runit 0.8.1 +Wed, 12 Mar 2003 15:10:04 +0100 + * runsvdir.c, runsv.c: close-on-exec file descriptors of current dir and + lock files (thx Lukas Beeler). + * doc/runscripts.html: add contributed run scripts (thx Robin S. Socha, + Claus Alboege, Paul Jarc, clemens fischer, Jesse Cablek). + +runit 0.8.0 +Tue, 25 Feb 2003 16:17:34 +0100 + * doc/benefits.html: new. + * doc/index.html, doc/upgrade.html: adapt. + * etc/*/1, etc/*/3, etc/*/ctrlaltdel: set permissions on the magic files + instead of creating and removing them (can make them symbolic links + now); set PATH. + * runit.h: new; centralize runit's compiled in magic file names. + * runit.c: check permissions of magic files instead of sole existence; + conditionally call reboot(RB_AUTOBOOT), reboot(RB_POWER_OFF), + reboot(RB_HALT_SYSTEM) if possible; code cleanup. + * runit-init.c: set permissions on magic files instead of creating or + removing them; code cleanup. + * runsvdir.c: detect and tolerate system time warp; code cleanup. + * runsv.c, runsvchdir.c, runsvctrl.c, runsvstat.c, svwaitdown.c, + svwaitup.c, utmpset.c: code cleanup. + * man/runit.8, man/runit-init.8: adapt. + +runit 0.7.2 +Fri, 10 Jan 2003 21:34:13 +0100 + * runsv.c: close finish script file descriptor. + * runsv.c: close logpipe[] instead of sending sigterm to logservice when + told to exit, loggers should exit when they see EOF on stdin (thx Paul + Jarc). + * etc/*/1, etc/*/3: remove explicit 'exit'. + * error.h: include (upcoming glibc changes). + +runit 0.7.1 +Wed, 23 Oct 2002 11:40:24 +0200 + * man/runsv.8, doc/runlevels.html: typos. + * runsvctrl.c, runsvstat.c: exit 111 on error. + * runsvdir.c: continue reading directory when stat() on entry fails. + * doc/runsvstat.8.html,doc/runsvctrl.8.html: new. + * runsvstat, runsvctrl: new; optional svc, svstat replacements. + * doc/index.html: adapt; new example. + +runit 0.7.0 +Mon, 07 Oct 2002 11:26:27 +0200 + * runsvdir.c: check service directory's inode and device in addition + to mtime; sleep at least 1 second before restarting runsv processes. + * runsv.c: use status[19] for state information; control pipe supports e. + * runsvstat.c: new option -l: only show log service if -l is given; use + status[19] for state. + * runsvchdir: new; change directory runsvdir is running in (switch + runlevels). + * man/runsvchdir.8, doc/runsvchdir.8.html: new. + * svwaitdown.c: -k option: only kill service that still are up on timeout. + +runit 0.6.0 +Fri, 27 Sep 2002 16:34:57 +0200 + * man/runsv.8, man/runsvdir.8: new. + * doc: use runsvdir/runsv instead of svscanboot/supervise. + * svwaitdown.c, svwaitup.c, man/svwaitdown.8, man/svwaitup.8: services + must start with slash. + * svwaitdown: new option -x: wait for runsv to exit instead for the + service to be down; new option -k: SIGKILL still running services if + timeout is reached. + * stage 3: use new svwaitdown options. + +runit 0.5.3 +Mon, 23 Sep 2002 16:25:07 +0200 + * runsv, runsvdir: new; svscan/supervise replacement. + * etc/runit/2: use runsvdir instead of svscanboot. + * runsvstat.c: new; svstat for runsv. + * runsvctrl.c: new; svc for runsv. + * runsvdir.c, runsv.c: code cleanup. + * utmpset.c: setlock utmp and wtmp file. + +runit 0.5.0 +Wed, 28 Aug 2002 11:18:28 +0200 + * utmpset: avoids libutil; compiles with dietlibc; built by default. + * doc/usedietlibc.html: fix description. + * getty-*/run: add utmpset. + +runit 0.4.1 +Mon, 24 Jun 2002 15:53:11 +0200 + * utmpset.c: new option -w: additionally write wtmp record. + +runit 0.4.0 +Sun, 19 May 2002 12:28:29 +0200 + * src/: include public domain sources to build byte.a, unix.a, time.a: + runit builds without having daemontools' sources installed. + * utmpset.c: new utmpset program. + * doc/utmpset.html: new. + +runit 0.3.2 +Wed, 13 Feb 2002 10:56:17 +0100 + * runit.c: support ctrl-alt-del also on Linux/i386, dietlibc. + * runscripts.html: more samples. (thx Alessandro Bono) + +runit 0.3.1 +Sun, 3 Feb 2002 16:30:55 +0100 + * src: cleanup. + +runit 0.3.0 +Tue, 29 Jan 2002 19:38:33 +0100 + * doc: adapted. + * runit.8: changes documented. + * runscripts.html: more examples. + +runit 0.2.9 +Thu, 17 Jan 2002 19:00:44 +0100 + * reportedly runs on FreeBSD 4.3 (thx clemensF) + * svwaitdown: max timeout is 6000, really. (thx ska) + * runit.c: stage 1 gets no new session and full control of console; an + emergency shell or login program (if present) can be executed. + * openbsd, freebsd: support for 'single user' emergency shell in stage 1 + * runit.c: skip stage 2 if stage 1 crashes. + +runit 0.2.7 +Tue, 1 Jan 2002 16:20:14 +0100 + * tested on fresh freebsd 4.4 installation in vmware + * new etc/freebsd: stages and getty service + * doc: replaceinit: how to replace bsd init (freebsd) + * svwaitup: minor code cleanup + * doc: /service/getty-5/ as default getty service. + * doc: index: related links added. + * package: install-man added for installing manpages in /usr/local/man/ + +runit 0.2.6 +Sun, 30 Dec 2001 17:29:29 +0100 + * runs on openbsd 2.9 + * runit: console init and reinit + * runit: sig_pause() on end. + * new: etc/openbsd: stages and getty service + * doc: replaceinit: how to replace bsd init + +runit 0.2.3 +Thu, 27 Dec 2001 14:41:56 +0100 + * doc: runscripts.html integrated + +runit 0.2.2 +Sun, 23 Dec 2001 18:12:29 +0100 + * runit: checks for pid == 1 + * new: svwaitdown, svwaitup, svwaitdown.8, svwaitup.8 + * stage3: uses svwaitdown + * doc: runscripts.html added + +runit 0.2.0 +Mon, 26 Nov 2001 12:29:44 +0100 + * runit-halt, runit-reboot removed, integrated into runit-init + * tested with dietlibc + * doc: usedietlibs.html added. + * BSD license. + +runit 0.1.2 +Thu, 22 Nov 2001 18:29:05 +0100 + * collects all terminated children in all stages + * sends sigkill to whole process group if stage2 crashes and waits + 5 seconds before restarting + * ctraltdel not automatically shuts down, now respects /etc/runit/stopit + * /etc/runit/ctrlaltdel touches /etc/runit/stopit + * on shutdown request: send sigterm to stage 2, wait max 5 second, send + sigkill if still running, leave stage 2, enter stage 3 + +runit 0.1.1 +Tue, 20 Nov 2001 11:56:58 +0100 + * package moved to smarden.org + +runit 0.1.0 +Fri, 16 Nov 2001 14:01:27 +0100 + * documention + * debian package + +runit 0.0.4 +Sun, 11 Nov 2001 19:07:49 +0100 + * initial release diff --git a/mirror_runit/runit-2.1.2/package/COPYING b/mirror_runit/runit-2.1.2/package/COPYING new file mode 100644 index 0000000..d24d1d2 --- /dev/null +++ b/mirror_runit/runit-2.1.2/package/COPYING @@ -0,0 +1,24 @@ +Copyright (c) 2001-2008, Gerrit Pape +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/mirror_runit/runit-2.1.2/package/README b/mirror_runit/runit-2.1.2/package/README new file mode 100644 index 0000000..430fac5 --- /dev/null +++ b/mirror_runit/runit-2.1.2/package/README @@ -0,0 +1,3 @@ +Copyright 2001-2006 +G. Pape +http://smarden.org/runit/ diff --git a/mirror_runit/runit-2.1.2/package/THANKS b/mirror_runit/runit-2.1.2/package/THANKS new file mode 100644 index 0000000..b84e3fe --- /dev/null +++ b/mirror_runit/runit-2.1.2/package/THANKS @@ -0,0 +1,2 @@ +Thanks to D. J. Bernstein for his daemontools package and for putting the +daemontools' library code into the public domain. diff --git a/mirror_runit/runit-2.1.2/package/TODO b/mirror_runit/runit-2.1.2/package/TODO new file mode 100644 index 0000000..6c2bd6c --- /dev/null +++ b/mirror_runit/runit-2.1.2/package/TODO @@ -0,0 +1,8 @@ +rewrite doc/benefits.html +rewrite doc/index.html +add doc/uselsb.html +have sv replace runsvctrl, runsvstat, svwaitdown, svwaitup +rewrite doc/dependencies.html: weak/string deps +runsv: provide ./run's return code to ./finish, count startups of ./run and + provide number to ./run +chpst: -u user[:group0[:group1 ...]] diff --git a/mirror_runit/runit-2.1.2/package/check b/mirror_runit/runit-2.1.2/package/check new file mode 100755 index 0000000..7662e74 --- /dev/null +++ b/mirror_runit/runit-2.1.2/package/check @@ -0,0 +1,9 @@ +#!/bin/sh +set -e + +umask 022 +test -d package || sh -cx '! : Wrong working directory.' +test -d compile || sh -cx '! : Wrong working directory.' + +echo 'Checking commands in ./command...' +sh -cxe 'cd compile; exec make check' diff --git a/mirror_runit/runit-2.1.2/package/commands b/mirror_runit/runit-2.1.2/package/commands new file mode 100644 index 0000000..043d245 --- /dev/null +++ b/mirror_runit/runit-2.1.2/package/commands @@ -0,0 +1,9 @@ +chpst +runit +runit-init +runsv +runsvchdir +runsvdir +sv +svlogd +utmpset diff --git a/mirror_runit/runit-2.1.2/package/compile b/mirror_runit/runit-2.1.2/package/compile new file mode 100755 index 0000000..0ed142e --- /dev/null +++ b/mirror_runit/runit-2.1.2/package/compile @@ -0,0 +1,27 @@ +#!/bin/sh +set -e + +umask 022 +test -d package || sh -cx '! : Wrong working directory.' +test -d src || sh -cx '! : Wrong working directory.' + +here=`env - PATH=$PATH pwd` + +mkdir -p compile command +test -r compile/home || echo $here >compile/home +test -h compile/src || ln -s $here/src compile/src + +echo 'Linking ./src/* into ./compile...' +for i in `ls src`; do + test -h compile/$i || ln -s src/$i compile/$i +done + +echo 'Compiling everything in ./compile...' +sh -cxe 'cd compile; exec make' + +echo 'Copying commands into ./command...' +for i in `cat package/commands`; do + rm -f command/$i'{new}' + cp -p compile/$i command/$i'{new}' + mv -f command/$i'{new}' command/$i +done diff --git a/mirror_runit/runit-2.1.2/package/install b/mirror_runit/runit-2.1.2/package/install new file mode 100755 index 0000000..4e3c468 --- /dev/null +++ b/mirror_runit/runit-2.1.2/package/install @@ -0,0 +1,6 @@ +#!/bin/sh +set -e + +package/compile +package/check +package/upgrade diff --git a/mirror_runit/runit-2.1.2/package/install-man b/mirror_runit/runit-2.1.2/package/install-man new file mode 100755 index 0000000..cd49048 --- /dev/null +++ b/mirror_runit/runit-2.1.2/package/install-man @@ -0,0 +1,26 @@ +#!/bin/sh +set -e + +umask 022 +test -d package || sh -cx '! : Wrong working directory.' +test -d man || sh -cx '! : Wrong working directory.' + +here=`env - PATH=$PATH pwd` +parent=`dirname $here` + +echo 'Compressing manpages...' +for i in man/*.[1-8]; do + gzip -c $i >${i}.gz +done + +echo 'Making manpage links in /usr/local/man...' +cd man +for i in 8; do + mkdir -p /usr/local/man/man$i + for j in *.$i; do + rm -f /usr/local/man/man$i/$j.gz'{new}' + ln -s $parent/runit/man/$j.gz /usr/local/man/man$i/$j.gz'{new}' + mv -f /usr/local/man/man$i/$j.gz'{new}' /usr/local/man/man$i/$j.gz + done +done +cd .. diff --git a/mirror_runit/runit-2.1.2/package/sharing b/mirror_runit/runit-2.1.2/package/sharing new file mode 100644 index 0000000..303d3de --- /dev/null +++ b/mirror_runit/runit-2.1.2/package/sharing @@ -0,0 +1,3 @@ +command:syst +package:dist +src:dist diff --git a/mirror_runit/runit-2.1.2/package/upgrade b/mirror_runit/runit-2.1.2/package/upgrade new file mode 100755 index 0000000..fac8902 --- /dev/null +++ b/mirror_runit/runit-2.1.2/package/upgrade @@ -0,0 +1,29 @@ +#!/bin/sh +set -e + +umask 022 +test -d package || sh -cx '! : Wrong working directory.' +test -d src || sh -cx '! : Wrong working directory.' + +here=`env - PATH=$PATH pwd` +parent=`dirname $here` + +echo 'Creating symlink runit -> runit-2.1.2...' +rm -f runit +ln -s runit-2.1.2 runit +mv -f runit .. + +echo 'Making command links in /command...' +mkdir -p /command +for i in `cat package/commands`; do + rm -f /command/$i'{new}' + ln -s $parent/runit/command/$i /command/$i'{new}' + mv -f /command/$i'{new}' /command/$i +done +echo 'Making compatibility links in /usr/local/bin...' +mkdir -p /usr/local/bin +for i in `cat package/commands`; do + rm -f /usr/local/bin/$i'{new}' + ln -s /command/$i /usr/local/bin/$i'{new}' + mv -f /usr/local/bin/$i'{new}' /usr/local/bin/$i +done diff --git a/mirror_runit/runit-2.1.2/package/versions b/mirror_runit/runit-2.1.2/package/versions new file mode 100644 index 0000000..f1364f2 --- /dev/null +++ b/mirror_runit/runit-2.1.2/package/versions @@ -0,0 +1,54 @@ +0.4.0 +0.4.1 +0.5.0 +0.5.3 +0.6.0 +0.7.0 +0.7.1 +0.7.2 +0.8.0 +0.8.1 +0.8.4 +0.9.0 +0.9.1 +0.9.2 +0.9.3 +0.9.4 +0.9.5 +0.10.0 +0.11.0 +0.11.1 +0.11.2 +0.12.0 +0.12.1 +0.13.0 +0.13.1 +1.0.0 +1.0.1 +1.0.2 +1.0.3 +1.0.4 +1.0.5 +1.1.0 +1.2.0 +1.2.1 +1.2.2 +1.2.3 +1.3.0 +1.3.1 +1.3.2 +1.3.3 +1.4.0 +1.4.1 +1.5.0 +1.5.1 +1.6.0 +1.7.0 +1.7.1 +1.7.2 +1.8.0 +1.9.0 +2.0.0 +2.1.0 +2.1.1 +2.1.2 diff --git a/mirror_runit/runit-2.1.2/src/Makefile b/mirror_runit/runit-2.1.2/src/Makefile new file mode 100644 index 0000000..d9624de --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/Makefile @@ -0,0 +1,468 @@ +IT=chpst runit runit-init runsv runsvchdir runsvdir sv svlogd utmpset + +default: sysdeps $(IT) + +check: $(IT) + ./check-local $(IT) + +runit: load runit.o unix.a byte.a + ./load runit unix.a byte.a -static + +runit-init: load runit-init.o unix.a byte.a + ./load runit-init unix.a byte.a -static + +runsv: load runsv.o unix.a byte.a time.a + ./load runsv unix.a byte.a time.a + +runsvdir: load runsvdir.o unix.a byte.a time.a + ./load runsvdir unix.a byte.a time.a + +runsvstat: load runsvstat.o unix.a byte.a time.a + ./load runsvstat unix.a byte.a time.a + +runsvctrl: load runsvctrl.o unix.a byte.a + ./load runsvctrl unix.a byte.a + +sv: load sv.o unix.a byte.a time.a + ./load sv unix.a byte.a time.a + +svwaitup: load svwaitup.o unix.a byte.a time.a + ./load svwaitup unix.a byte.a time.a + +svwaitdown: load svwaitdown.o unix.a byte.a time.a + ./load svwaitdown unix.a byte.a time.a + +utmpset: load utmpset.o unix.a byte.a + ./load utmpset unix.a byte.a + +runsvchdir: load runsvchdir.o unix.a byte.a + ./load runsvchdir unix.a byte.a + +svlogd: load svlogd.o pmatch.o fmt_ptime.o unix.a byte.a time.a socket.lib + ./load svlogd pmatch.o fmt_ptime.o unix.a byte.a time.a \ + `cat socket.lib` + +chpst: load chpst.o uidgid.o unix.a byte.a + ./load chpst uidgid.o unix.a byte.a + +runit.o: compile sysdeps runit.c + ./compile runit.c + +runit-init.o: compile runit-init.c + ./compile runit-init.c + +runsv.o: compile sysdeps runsv.c + ./compile runsv.c + +runsvdir.o: compile sysdeps runsvdir.c + ./compile runsvdir.c + +runsvstat.o: compile sysdeps runsvstat.c + ./compile runsvstat.c + +runsvctrl.o: compile runsvctrl.c + ./compile runsvctrl.c + +sv.o: compile sysdeps sv.c + ./compile sv.c + +svwaitup.o: compile sysdeps svwaitup.c + ./compile svwaitup.c + +svwaitdown.o: compile sysdeps svwaitdown.c + ./compile svwaitdown.c + +utmpset.o: compile sysdeps utmpset.c + ./compile utmpset.c + +runsvchdir.o: compile runsvchdir.c + ./compile runsvchdir.c + +svlogd.o: compile sysdeps svlogd.c + ./compile svlogd.c + +chpst.o: compile sysdeps chpst.c + ./compile chpst.c + + +uidgid.o: compile uidgid.c uidgid.h + ./compile uidgid.c + +pmatch.o: compile pmatch.c + ./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 + +socket.lib: compile load trysocketlib.c + ./compile trysocketlib.c + ( ./load trysocketlib >/dev/null 2>&1 || \ + ( ./load trysocketlib -lxnet >/dev/null 2>&1 && echo '-lxnet' ) || \ + ( ./load trysocketlib -lsocket -lnsl >/dev/null 2>&1 && \ + echo '-lsocket -lnsl' ) \ + ) >socket.lib + rm -f trysocketlib.o trysocketlib + +clean: + find . -name \*~ -exec rm -f {} \; + find . -name .??*~ -exec rm -f {} \; + find . -name \#?* -exec rm -f {} \; + rm -f `cat TARGETS` + +alloc.o: alloc.c alloc.h compile error.h + ./compile alloc.c + +alloc_re.o: alloc.h alloc_re.c byte.h compile + ./compile alloc_re.c + +buffer.o: buffer.c buffer.h compile + ./compile buffer.c + +buffer_0.o: buffer.h buffer_0.c compile + ./compile buffer_0.c + +buffer_1.o: buffer.h buffer_1.c compile + ./compile buffer_1.c + +buffer_2.o: buffer.h buffer_2.c compile + ./compile buffer_2.c + +buffer_get.o: buffer.h buffer_get.c byte.h compile error.h + ./compile buffer_get.c + +buffer_put.o: buffer.h buffer_put.c byte.h compile error.h str.h + ./compile buffer_put.c + +buffer_read.o: buffer.h buffer_read.c compile + ./compile buffer_read.c + +buffer_write.o: buffer.h buffer_write.c compile + ./compile buffer_write.c + +byte.a: byte_chr.o byte_copy.o byte_cr.o byte_diff.o byte_rchr.o \ +fmt_uint.o fmt_uint0.o fmt_ulong.o makelib scan_ulong.o str_chr.o \ +str_diff.o str_len.o str_start.o + ./makelib byte.a byte_chr.o byte_copy.o byte_cr.o byte_diff.o \ + byte_rchr.o fmt_uint.o fmt_uint0.o fmt_ulong.o scan_ulong.o str_chr.o \ + str_diff.o str_len.o str_start.o + +byte_chr.o: byte.h byte_chr.c compile + ./compile byte_chr.c + +byte_copy.o: byte.h byte_copy.c compile + ./compile byte_copy.c + +byte_cr.o: byte.h byte_cr.c compile + ./compile byte_cr.c + +byte_diff.o: byte.h byte_diff.c compile + ./compile byte_diff.c + +byte_rchr.o: byte.h byte_rchr.c compile + ./compile byte_rchr.c + +chkshsgr: chkshsgr.o load + ./load chkshsgr + +chkshsgr.o: chkshsgr.c compile + ./compile chkshsgr.c + +choose: choose.sh warn-auto.sh + rm -f choose + cat warn-auto.sh choose.sh \ + > choose + chmod 555 choose + +coe.o: coe.c coe.h compile + ./compile coe.c + +compile: conf-cc print-cc.sh systype warn-auto.sh + rm -f compile + sh print-cc.sh > compile + chmod 555 compile + +direntry.h: choose compile direntry.h1 direntry.h2 trydrent.c + ./choose c trydrent direntry.h1 direntry.h2 > direntry.h + +env.o: compile env.c env.h str.h + ./compile env.c + +error.o: compile error.c error.h + ./compile error.c + +error_str.o: compile error.h error_str.c + ./compile error_str.c + +fd_copy.o: compile fd.h fd_copy.c + ./compile fd_copy.c + +fd_move.o: compile fd.h fd_move.c + ./compile fd_move.c + +fifo.o: compile fifo.c fifo.h hasmkffo.h + ./compile fifo.c + +fmt_uint.o: compile fmt.h fmt_uint.c + ./compile fmt_uint.c + +fmt_uint0.o: compile fmt.h fmt_uint0.c + ./compile fmt_uint0.c + +fmt_ulong.o: compile fmt.h fmt_ulong.c + ./compile fmt_ulong.c + +hasflock.h: choose compile hasflock.h1 hasflock.h2 load tryflock.c + ./choose cl tryflock hasflock.h1 hasflock.h2 > hasflock.h + +hasmkffo.h: choose compile hasmkffo.h1 hasmkffo.h2 load trymkffo.c + ./choose cl trymkffo hasmkffo.h1 hasmkffo.h2 > hasmkffo.h + +hassgact.h: choose compile hassgact.h1 hassgact.h2 load trysgact.c + ./choose cl trysgact hassgact.h1 hassgact.h2 > hassgact.h + +hassgprm.h: choose compile hassgprm.h1 hassgprm.h2 load trysgprm.c + ./choose cl trysgprm hassgprm.h1 hassgprm.h2 > hassgprm.h + +hasshsgr.h: chkshsgr choose compile hasshsgr.h1 hasshsgr.h2 load \ +tryshsgr.c warn-shsgr + ./chkshsgr || ( cat warn-shsgr; exit 1 ) + ./choose clr tryshsgr hasshsgr.h1 hasshsgr.h2 > hasshsgr.h + +haswaitp.h: choose compile haswaitp.h1 haswaitp.h2 load trywaitp.c + ./choose cl trywaitp haswaitp.h1 haswaitp.h2 > haswaitp.h + +iopause.h: choose compile iopause.h1 iopause.h2 load trypoll.c + ./choose clr trypoll iopause.h1 iopause.h2 > iopause.h + +iopause.o: compile iopause.c iopause.h select.h tai.h taia.h uint64.h + ./compile iopause.c + +load: conf-ld print-ld.sh systype warn-auto.sh + rm -f load + sh print-ld.sh > load + chmod 555 load + +lock_ex.o: compile hasflock.h lock.h lock_ex.c + ./compile lock_ex.c + +lock_exnb.o: compile hasflock.h lock.h lock_exnb.c + ./compile lock_exnb.c + +makelib: print-ar.sh systype warn-auto.sh + rm -f makelib + sh print-ar.sh > makelib + chmod 555 makelib + +ndelay_off.o: compile ndelay.h ndelay_off.c + ./compile ndelay_off.c + +ndelay_on.o: compile ndelay.h ndelay_on.c + ./compile ndelay_on.c + +open_append.o: compile open.h open_append.c + ./compile open_append.c + +open_read.o: compile open.h open_read.c + ./compile open_read.c + +open_trunc.o: compile open.h open_trunc.c + ./compile open_trunc.c + +open_write.o: compile open.h open_write.c + ./compile open_write.c + +openreadclose.o: compile error.h gen_alloc.h open.h openreadclose.c \ +openreadclose.h readclose.h stralloc.h + ./compile openreadclose.c + +pathexec_env.o: alloc.h byte.h compile env.h gen_alloc.h pathexec.h \ +pathexec_env.c str.h stralloc.h + ./compile pathexec_env.c + +pathexec_run.o: compile env.h error.h gen_alloc.h pathexec.h \ +pathexec_run.c str.h stralloc.h + ./compile pathexec_run.c + +prot.o: compile hasshsgr.h prot.c prot.h + ./compile prot.c + +readclose.o: compile error.h gen_alloc.h readclose.c readclose.h \ +stralloc.h + ./compile readclose.c + +scan_ulong.o: compile scan.h scan_ulong.c + ./compile scan_ulong.c + +seek_set.o: compile seek.h seek_set.c + ./compile seek_set.c + +select.h: choose compile select.h1 select.h2 trysysel.c + ./choose c trysysel select.h1 select.h2 > select.h + +sgetopt.o: buffer.h compile sgetopt.c sgetopt.h subgetopt.h + ./compile sgetopt.c + +sig.o: compile sig.c sig.h + ./compile sig.c + +sig_block.o: compile hassgprm.h sig.h sig_block.c + ./compile sig_block.c + +sig_catch.o: compile hassgact.h sig.h sig_catch.c + ./compile sig_catch.c + +sig_pause.o: compile hassgprm.h sig.h sig_pause.c + ./compile sig_pause.c + +str_chr.o: compile str.h str_chr.c + ./compile str_chr.c + +str_diff.o: compile str.h str_diff.c + ./compile str_diff.c + +str_len.o: compile str.h str_len.c + ./compile str_len.c + +str_start.o: compile str.h str_start.c + ./compile str_start.c + +stralloc_cat.o: byte.h compile gen_alloc.h stralloc.h stralloc_cat.c + ./compile stralloc_cat.c + +stralloc_catb.o: byte.h compile gen_alloc.h stralloc.h \ +stralloc_catb.c + ./compile stralloc_catb.c + +stralloc_cats.o: byte.h compile gen_alloc.h str.h stralloc.h \ +stralloc_cats.c + ./compile stralloc_cats.c + +stralloc_eady.o: alloc.h compile gen_alloc.h gen_allocdefs.h \ +stralloc.h stralloc_eady.c + ./compile stralloc_eady.c + +stralloc_opyb.o: byte.h compile gen_alloc.h stralloc.h \ +stralloc_opyb.c + ./compile stralloc_opyb.c + +stralloc_opys.o: byte.h compile gen_alloc.h str.h stralloc.h \ +stralloc_opys.c + ./compile stralloc_opys.c + +stralloc_pend.o: alloc.h compile gen_alloc.h gen_allocdefs.h \ +stralloc.h stralloc_pend.c + ./compile stralloc_pend.c + +strerr_die.o: buffer.h compile strerr.h strerr_die.c + ./compile strerr_die.c + +strerr_sys.o: compile error.h strerr.h strerr_sys.c + ./compile strerr_sys.c + +subgetopt.o: compile subgetopt.c subgetopt.h + ./compile subgetopt.c + +sysdeps: compile direntry.h hasflock.h hasmkffo.h hassgact.h \ +hassgprm.h hasshsgr.h haswaitp.h iopause.h load select.h systype \ +uint64.h reboot_system.h uw_tmp.h socket.lib + rm -f sysdeps + cat systype compile load socket.lib >>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 + sh find-systype.sh > systype + +tai_now.o: compile tai.h tai_now.c uint64.h + ./compile tai_now.c + +tai_pack.o: compile tai.h tai_pack.c uint64.h + ./compile tai_pack.c + +tai_sub.o: compile tai.h tai_sub.c uint64.h + ./compile tai_sub.c + +tai_unpack.o: compile tai.h tai_unpack.c uint64.h + ./compile tai_unpack.c + +taia_add.o: compile tai.h taia.h taia_add.c uint64.h + ./compile taia_add.c + +taia_approx.o: compile tai.h taia.h taia_approx.c uint64.h + ./compile taia_approx.c + +taia_frac.o: compile tai.h taia.h taia_frac.c uint64.h + ./compile taia_frac.c + +taia_less.o: compile tai.h taia.h taia_less.c uint64.h + ./compile taia_less.c + +taia_now.o: compile tai.h taia.h taia_now.c uint64.h + ./compile taia_now.c + +taia_pack.o: compile tai.h taia.h taia_pack.c uint64.h + ./compile taia_pack.c + +taia_sub.o: compile tai.h taia.h taia_sub.c uint64.h + ./compile taia_sub.c + +taia_uint.o: compile tai.h taia.h taia_uint.c uint64.h + ./compile taia_uint.c + +time.a: iopause.o makelib tai_now.o tai_pack.o tai_sub.o tai_unpack.o \ +taia_add.o taia_approx.o taia_frac.o taia_less.o taia_now.o \ +taia_pack.o taia_sub.o taia_uint.o + ./makelib time.a iopause.o tai_now.o tai_pack.o tai_sub.o \ + tai_unpack.o taia_add.o taia_approx.o taia_frac.o taia_less.o \ + taia_now.o taia_pack.o taia_sub.o taia_uint.o + +uint64.h: choose compile load tryulong64.c uint64.h1 uint64.h2 + ./choose clr tryulong64 uint64.h1 uint64.h2 > uint64.h + +unix.a: alloc.o alloc_re.o buffer.o buffer_0.o buffer_1.o buffer_2.o \ +buffer_get.o buffer_put.o buffer_read.o buffer_write.o coe.o env.o \ +error.o error_str.o fd_copy.o fd_move.o fifo.o lock_ex.o lock_exnb.o \ +makelib ndelay_off.o ndelay_on.o open_append.o open_read.o \ +open_trunc.o open_write.o openreadclose.o pathexec_env.o \ +pathexec_run.o prot.o readclose.o seek_set.o sgetopt.o sig.o \ +sig_block.o sig_catch.o sig_pause.o stralloc_cat.o stralloc_catb.o \ +stralloc_cats.o stralloc_eady.o stralloc_opyb.o stralloc_opys.o \ +stralloc_pend.o strerr_die.o strerr_sys.o subgetopt.o wait_nohang.o \ +wait_pid.o + ./makelib unix.a alloc.o alloc_re.o buffer.o buffer_0.o buffer_1.o \ + buffer_2.o buffer_get.o buffer_put.o buffer_read.o buffer_write.o \ + coe.o env.o error.o error_str.o fd_copy.o fd_move.o fifo.o lock_ex.o \ + lock_exnb.o ndelay_off.o ndelay_on.o open_append.o open_read.o \ + open_trunc.o open_write.o openreadclose.o pathexec_env.o \ + pathexec_run.o prot.o readclose.o seek_set.o sgetopt.o sig.o \ + sig_block.o sig_catch.o sig_pause.o stralloc_cat.o stralloc_catb.o \ + stralloc_cats.o stralloc_eady.o stralloc_opyb.o stralloc_opys.o \ + stralloc_pend.o strerr_die.o strerr_sys.o subgetopt.o wait_nohang.o \ + wait_pid.o + +wait_nohang.o: compile haswaitp.h wait_nohang.c + ./compile wait_nohang.c + +wait_pid.o: compile error.h haswaitp.h wait_pid.c + ./compile wait_pid.c + diff --git a/mirror_runit/runit-2.1.2/src/TARGETS b/mirror_runit/runit-2.1.2/src/TARGETS new file mode 100644 index 0000000..46981ce --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/TARGETS @@ -0,0 +1,143 @@ +runit +runit.o +runit-init +runit-init.o +runsv +runsv.o +runsvdir +runsvdir.o +runsvstat +runsvstat.o +runsvctrl +runsvctrl.o +sv +sv.o +svwaitdown +svwaitdown.o +svwaitup +svwaitup.o +utmpset +utmpset.o +runsvchdir +runsvchdir.o +svlogd +svlogd.o +chpst +chpst.o +pmatch.o +fmt_ptime.o +uidgid.o +reboot_system.h +uw_tmp.h +socket.lib +trysocketlib +trysocketlib.o +check +alloc.o +alloc_re.o +buffer.o +buffer_0.o +buffer_1.o +buffer_2.o +buffer_get.o +buffer_put.o +buffer_read.o +buffer_write.o +byte.a +byte_chr.o +byte_copy.o +byte_cr.o +byte_diff.o +byte_rchr.o +chkshsgr +chkshsgr.o +choose +coe.o +compile +direntry.h +env.o +error.o +error_str.o +fd_copy.o +fd_move.o +fifo.o +fmt_uint.o +fmt_uint0.o +fmt_ulong.o +hasflock.h +hasmkffo.h +hassgact.h +hassgprm.h +hasshsgr.h +haswaitp.h +iopause.h +iopause.o +load +lock_ex.o +lock_exnb.o +makelib +ndelay_off.o +ndelay_on.o +open_append.o +open_read.o +open_trunc.o +open_write.o +openreadclose.o +pathexec_env.o +pathexec_run.o +prot.o +readclose.o +scan_ulong.o +seek_set.o +select.h +sgetopt.o +sig.o +sig_block.o +sig_catch.o +sig_pause.o +str_chr.o +str_diff.o +str_len.o +str_start.o +stralloc_cat.o +stralloc_catb.o +stralloc_cats.o +stralloc_eady.o +stralloc_opyb.o +stralloc_opys.o +stralloc_pend.o +strerr_die.o +strerr_sys.o +subgetopt.o +sysdeps +systype +tai_now.o +tai_pack.o +tai_sub.o +tai_unpack.o +taia_add.o +taia_approx.o +taia_frac.o +taia_less.o +taia_now.o +taia_pack.o +taia_sub.o +taia_uint.o +time.a +uint64.h +unix.a +wait_nohang.o +wait_pid.o +chpst.local +runit-init.local +runit.local +runsv.local +runsvchdir.local +runsvctrl.local +runsvdir.local +runsvstat.local +sv.local +svlogd.local +svwaitdown.local +svwaitup.local +utmpset.local diff --git a/mirror_runit/runit-2.1.2/src/alloc.c b/mirror_runit/runit-2.1.2/src/alloc.c new file mode 100644 index 0000000..c741aa4 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/alloc.c @@ -0,0 +1,33 @@ +/* Public domain. */ + +#include +#include "alloc.h" +#include "error.h" + +#define ALIGNMENT 16 /* XXX: assuming that this alignment is enough */ +#define SPACE 2048 /* must be multiple of ALIGNMENT */ + +typedef union { char irrelevant[ALIGNMENT]; double d; } aligned; +static aligned realspace[SPACE / ALIGNMENT]; +#define space ((char *) realspace) +static unsigned int avail = SPACE; /* multiple of ALIGNMENT; 0<=avail<=SPACE */ + +/*@null@*//*@out@*/char *alloc(n) +unsigned int n; +{ + char *x; + n = ALIGNMENT + n - (n & (ALIGNMENT - 1)); /* XXX: could overflow */ + if (n <= avail) { avail -= n; return space + avail; } + x = malloc(n); + if (!x) errno = error_nomem; + return x; +} + +void alloc_free(x) +char *x; +{ + if (x >= space) + if (x < space + SPACE) + return; /* XXX: assuming that pointers are flat */ + free(x); +} diff --git a/mirror_runit/runit-2.1.2/src/alloc.h b/mirror_runit/runit-2.1.2/src/alloc.h new file mode 100644 index 0000000..21122fc --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/alloc.h @@ -0,0 +1,10 @@ +/* Public domain. */ + +#ifndef ALLOC_H +#define ALLOC_H + +extern /*@null@*//*@out@*/char *alloc(); +extern void alloc_free(); +extern int alloc_re(); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/alloc_re.c b/mirror_runit/runit-2.1.2/src/alloc_re.c new file mode 100644 index 0000000..1074609 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/alloc_re.c @@ -0,0 +1,19 @@ +/* Public domain. */ + +#include "alloc.h" +#include "byte.h" + +int alloc_re(x,m,n) +char **x; +unsigned int m; +unsigned int n; +{ + char *y; + + y = alloc(n); + if (!y) return 0; + byte_copy(y,m,*x); + alloc_free(*x); + *x = y; + return 1; +} diff --git a/mirror_runit/runit-2.1.2/src/buffer.c b/mirror_runit/runit-2.1.2/src/buffer.c new file mode 100644 index 0000000..38e6d77 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/buffer.c @@ -0,0 +1,12 @@ +/* Public domain. */ + +#include "buffer.h" + +void buffer_init(buffer *s,int (*op)(),int fd,char *buf,unsigned int len) +{ + s->x = buf; + s->fd = fd; + s->op = op; + s->p = 0; + s->n = len; +} diff --git a/mirror_runit/runit-2.1.2/src/buffer.h b/mirror_runit/runit-2.1.2/src/buffer.h new file mode 100644 index 0000000..8f2e572 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/buffer.h @@ -0,0 +1,61 @@ +/* Public domain. */ + +#ifndef BUFFER_H +#define BUFFER_H + +typedef struct buffer { + char *x; + unsigned int p; + unsigned int n; + int fd; + int (*op)(); +} buffer; + +#define BUFFER_INIT(op,fd,buf,len) { (buf), 0, (len), (fd), (op) } +#define BUFFER_INSIZE 8192 +#define BUFFER_OUTSIZE 8192 + +extern void buffer_init(buffer *,int (*)(),int,char *,unsigned int); + +extern int buffer_flush(buffer *); +extern int buffer_put(buffer *,const char *,unsigned int); +extern int buffer_putalign(buffer *,const char *,unsigned int); +extern int buffer_putflush(buffer *,const char *,unsigned int); +extern int buffer_puts(buffer *,const char *); +extern int buffer_putsalign(buffer *,const char *); +extern int buffer_putsflush(buffer *,const char *); + +#define buffer_PUTC(s,c) \ + ( ((s)->n != (s)->p) \ + ? ( (s)->x[(s)->p++] = (c), 0 ) \ + : buffer_put((s),&(c),1) \ + ) + +extern int buffer_get(buffer *,char *,unsigned int); +extern int buffer_bget(buffer *,char *,unsigned int); +extern int buffer_feed(buffer *); + +extern char *buffer_peek(buffer *); +extern void buffer_seek(buffer *,unsigned int); + +#define buffer_PEEK(s) ( (s)->x + (s)->n ) +#define buffer_SEEK(s,len) ( ( (s)->p -= (len) ) , ( (s)->n += (len) ) ) + +#define buffer_GETC(s,c) \ + ( ((s)->p > 0) \ + ? ( *(c) = (s)->x[(s)->n], buffer_SEEK((s),1), 1 ) \ + : buffer_get((s),(c),1) \ + ) + +extern int buffer_copy(buffer *,buffer *); + +extern int buffer_unixread(int,char *,unsigned int); +extern int buffer_unixwrite(int,const char *,unsigned int); + +extern buffer *buffer_0; +extern buffer *buffer_0small; +extern buffer *buffer_1; +extern buffer *buffer_1small; +extern buffer *buffer_2; + +#endif diff --git a/mirror_runit/runit-2.1.2/src/buffer_0.c b/mirror_runit/runit-2.1.2/src/buffer_0.c new file mode 100644 index 0000000..47d3263 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/buffer_0.c @@ -0,0 +1,13 @@ +/* Public domain. */ + +#include "buffer.h" + +int buffer_0_read(fd,buf,len) int fd; char *buf; int len; +{ + if (buffer_flush(buffer_1) == -1) return -1; + return buffer_unixread(fd,buf,len); +} + +char buffer_0_space[BUFFER_INSIZE]; +static buffer it = BUFFER_INIT(buffer_0_read,0,buffer_0_space,sizeof buffer_0_space); +buffer *buffer_0 = ⁢ diff --git a/mirror_runit/runit-2.1.2/src/buffer_1.c b/mirror_runit/runit-2.1.2/src/buffer_1.c new file mode 100644 index 0000000..f4bac3d --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/buffer_1.c @@ -0,0 +1,7 @@ +/* Public domain. */ + +#include "buffer.h" + +char buffer_1_space[BUFFER_OUTSIZE]; +static buffer it = BUFFER_INIT(buffer_unixwrite,1,buffer_1_space,sizeof buffer_1_space); +buffer *buffer_1 = ⁢ diff --git a/mirror_runit/runit-2.1.2/src/buffer_2.c b/mirror_runit/runit-2.1.2/src/buffer_2.c new file mode 100644 index 0000000..f255a92 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/buffer_2.c @@ -0,0 +1,7 @@ +/* Public domain. */ + +#include "buffer.h" + +char buffer_2_space[256]; +static buffer it = BUFFER_INIT(buffer_unixwrite,2,buffer_2_space,sizeof buffer_2_space); +buffer *buffer_2 = ⁢ diff --git a/mirror_runit/runit-2.1.2/src/buffer_get.c b/mirror_runit/runit-2.1.2/src/buffer_get.c new file mode 100644 index 0000000..3a6e1b6 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/buffer_get.c @@ -0,0 +1,69 @@ +/* Public domain. */ + +#include "buffer.h" +#include "byte.h" +#include "error.h" + +static int oneread(int (*op)(),int fd,char *buf,unsigned int len) +{ + int r; + + for (;;) { + r = op(fd,buf,len); + if (r == -1) if (errno == error_intr) continue; + return r; + } +} + +static int getthis(buffer *s,char *buf,unsigned int len) +{ + if (len > s->p) len = s->p; + s->p -= len; + byte_copy(buf,len,s->x + s->n); + s->n += len; + return len; +} + +int buffer_feed(buffer *s) +{ + int r; + + if (s->p) return s->p; + r = oneread(s->op,s->fd,s->x,s->n); + if (r <= 0) return r; + s->p = r; + s->n -= r; + if (s->n > 0) byte_copyr(s->x + s->n,r,s->x); + return r; +} + +int buffer_bget(buffer *s,char *buf,unsigned int len) +{ + int r; + + if (s->p > 0) return getthis(s,buf,len); + if (s->n <= len) return oneread(s->op,s->fd,buf,s->n); + r = buffer_feed(s); if (r <= 0) return r; + return getthis(s,buf,len); +} + +int buffer_get(buffer *s,char *buf,unsigned int len) +{ + int r; + + if (s->p > 0) return getthis(s,buf,len); + if (s->n <= len) return oneread(s->op,s->fd,buf,len); + r = buffer_feed(s); if (r <= 0) return r; + return getthis(s,buf,len); +} + +char *buffer_peek(buffer *s) +{ + return s->x + s->n; +} + +void buffer_seek(buffer *s,unsigned int len) +{ + s->n += len; + s->p -= len; +} diff --git a/mirror_runit/runit-2.1.2/src/buffer_put.c b/mirror_runit/runit-2.1.2/src/buffer_put.c new file mode 100644 index 0000000..23164b3 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/buffer_put.c @@ -0,0 +1,90 @@ +/* Public domain. */ + +#include "buffer.h" +#include "str.h" +#include "byte.h" +#include "error.h" + +static int allwrite(int (*op)(),int fd,const char *buf,unsigned int len) +{ + int w; + + while (len) { + w = op(fd,buf,len); + if (w == -1) { + if (errno == error_intr) continue; + return -1; /* note that some data may have been written */ + } + if (w == 0) ; /* luser's fault */ + buf += w; + len -= w; + } + return 0; +} + +int buffer_flush(buffer *s) +{ + int p; + + p = s->p; + if (!p) return 0; + s->p = 0; + return allwrite(s->op,s->fd,s->x,p); +} + +int buffer_putalign(buffer *s,const char *buf,unsigned int len) +{ + unsigned int n; + + while (len > (n = s->n - s->p)) { + byte_copy(s->x + s->p,n,buf); s->p += n; buf += n; len -= n; + if (buffer_flush(s) == -1) return -1; + } + /* now len <= s->n - s->p */ + byte_copy(s->x + s->p,len,buf); + s->p += len; + return 0; +} + +int buffer_put(buffer *s,const char *buf,unsigned int len) +{ + unsigned int n; + + n = s->n; + if (len > n - s->p) { + if (buffer_flush(s) == -1) return -1; + /* now s->p == 0 */ + if (n < BUFFER_OUTSIZE) n = BUFFER_OUTSIZE; + while (len > s->n) { + if (n > len) n = len; + if (allwrite(s->op,s->fd,buf,n) == -1) return -1; + buf += n; + len -= n; + } + } + /* now len <= s->n - s->p */ + byte_copy(s->x + s->p,len,buf); + s->p += len; + return 0; +} + +int buffer_putflush(buffer *s,const char *buf,unsigned int len) +{ + if (buffer_flush(s) == -1) return -1; + return allwrite(s->op,s->fd,buf,len); +} + +int buffer_putsalign(buffer *s,const char *buf) +{ + return buffer_putalign(s,buf,str_len(buf)); +} + +int buffer_puts(buffer *s,const char *buf) +{ + return buffer_put(s,buf,str_len(buf)); +} + +int buffer_putsflush(buffer *s,const char *buf) +{ + return buffer_putflush(s,buf,str_len(buf)); +} diff --git a/mirror_runit/runit-2.1.2/src/buffer_read.c b/mirror_runit/runit-2.1.2/src/buffer_read.c new file mode 100644 index 0000000..09db05f --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/buffer_read.c @@ -0,0 +1,9 @@ +/* Public domain. */ + +#include +#include "buffer.h" + +int buffer_unixread(int fd,char *buf,unsigned int len) +{ + return read(fd,buf,len); +} diff --git a/mirror_runit/runit-2.1.2/src/buffer_write.c b/mirror_runit/runit-2.1.2/src/buffer_write.c new file mode 100644 index 0000000..4ba13ef --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/buffer_write.c @@ -0,0 +1,9 @@ +/* Public domain. */ + +#include +#include "buffer.h" + +int buffer_unixwrite(int fd,const char *buf,unsigned int len) +{ + return write(fd,buf,len); +} diff --git a/mirror_runit/runit-2.1.2/src/byte.h b/mirror_runit/runit-2.1.2/src/byte.h new file mode 100644 index 0000000..09aab61 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/byte.h @@ -0,0 +1,15 @@ +/* Public domain. */ + +#ifndef BYTE_H +#define BYTE_H + +extern unsigned int byte_chr(); +extern unsigned int byte_rchr(); +extern void byte_copy(); +extern void byte_copyr(); +extern int byte_diff(); +extern void byte_zero(); + +#define byte_equal(s,n,t) (!byte_diff((s),(n),(t))) + +#endif diff --git a/mirror_runit/runit-2.1.2/src/byte_chr.c b/mirror_runit/runit-2.1.2/src/byte_chr.c new file mode 100644 index 0000000..fd56056 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/byte_chr.c @@ -0,0 +1,22 @@ +/* Public domain. */ + +#include "byte.h" + +unsigned int byte_chr(s,n,c) +char *s; +register unsigned int n; +int c; +{ + register char ch; + register char *t; + + ch = c; + t = s; + for (;;) { + if (!n) break; if (*t == ch) break; ++t; --n; + if (!n) break; if (*t == ch) break; ++t; --n; + if (!n) break; if (*t == ch) break; ++t; --n; + if (!n) break; if (*t == ch) break; ++t; --n; + } + return t - s; +} diff --git a/mirror_runit/runit-2.1.2/src/byte_copy.c b/mirror_runit/runit-2.1.2/src/byte_copy.c new file mode 100644 index 0000000..74c9e4a --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/byte_copy.c @@ -0,0 +1,16 @@ +/* Public domain. */ + +#include "byte.h" + +void byte_copy(to,n,from) +register char *to; +register unsigned int n; +register char *from; +{ + for (;;) { + if (!n) return; *to++ = *from++; --n; + if (!n) return; *to++ = *from++; --n; + if (!n) return; *to++ = *from++; --n; + if (!n) return; *to++ = *from++; --n; + } +} diff --git a/mirror_runit/runit-2.1.2/src/byte_cr.c b/mirror_runit/runit-2.1.2/src/byte_cr.c new file mode 100644 index 0000000..52dc251 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/byte_cr.c @@ -0,0 +1,18 @@ +/* Public domain. */ + +#include "byte.h" + +void byte_copyr(to,n,from) +register char *to; +register unsigned int n; +register char *from; +{ + to += n; + from += n; + for (;;) { + if (!n) return; *--to = *--from; --n; + if (!n) return; *--to = *--from; --n; + if (!n) return; *--to = *--from; --n; + if (!n) return; *--to = *--from; --n; + } +} diff --git a/mirror_runit/runit-2.1.2/src/byte_diff.c b/mirror_runit/runit-2.1.2/src/byte_diff.c new file mode 100644 index 0000000..0c4d17b --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/byte_diff.c @@ -0,0 +1,18 @@ +/* Public domain. */ + +#include "byte.h" + +int byte_diff(s,n,t) +register char *s; +register unsigned int n; +register char *t; +{ + for (;;) { + if (!n) return 0; if (*s != *t) break; ++s; ++t; --n; + if (!n) return 0; if (*s != *t) break; ++s; ++t; --n; + if (!n) return 0; if (*s != *t) break; ++s; ++t; --n; + if (!n) return 0; if (*s != *t) break; ++s; ++t; --n; + } + return ((int)(unsigned int)(unsigned char) *s) + - ((int)(unsigned int)(unsigned char) *t); +} diff --git a/mirror_runit/runit-2.1.2/src/byte_rchr.c b/mirror_runit/runit-2.1.2/src/byte_rchr.c new file mode 100644 index 0000000..7ea9948 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/byte_rchr.c @@ -0,0 +1,25 @@ +/* Public domain. */ + +#include "byte.h" + +unsigned int byte_rchr(s,n,c) +char *s; +register unsigned int n; +int c; +{ + register char ch; + register char *t; + register char *u; + + ch = c; + t = s; + u = 0; + for (;;) { + if (!n) break; if (*t == ch) u = t; ++t; --n; + if (!n) break; if (*t == ch) u = t; ++t; --n; + if (!n) break; if (*t == ch) u = t; ++t; --n; + if (!n) break; if (*t == ch) u = t; ++t; --n; + } + if (!u) u = t; + return u - s; +} diff --git a/mirror_runit/runit-2.1.2/src/check-diff b/mirror_runit/runit-2.1.2/src/check-diff new file mode 100755 index 0000000..d334238 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/check-diff @@ -0,0 +1,5 @@ +#!/bin/sh +while read i; do + read j 0<&7 || exit 1 + test "$i" = "$j" || exit 1 +done 7<$1.dist <$1.local diff --git a/mirror_runit/runit-2.1.2/src/check-dist b/mirror_runit/runit-2.1.2/src/check-dist new file mode 100755 index 0000000..f0c5dd5 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/check-dist @@ -0,0 +1,8 @@ +#!/bin/sh + +PATH=`pwd`:$PATH + +for i in `cat ../package/commands`; do + echo "Creating new $i.dist..." + env - PATH="$PATH" ctmp="`pwd`/check-tmp" $i.check 2>&1 |cat -v >$i.dist +done diff --git a/mirror_runit/runit-2.1.2/src/check-local b/mirror_runit/runit-2.1.2/src/check-local new file mode 100755 index 0000000..36b3ed4 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/check-local @@ -0,0 +1,9 @@ +#!/bin/sh + +PATH=`pwd`:$PATH + +for i in ${1+"$@"}; do + echo "Checking $i..." + env - PATH="$PATH" ctmp="`pwd`/check-tmp" $i.check 2>&1 |cat -v >$i.local + ./check-diff $i || ( cat $i.local; echo "$i failed."; exit 1 ) || exit 1 +done diff --git a/mirror_runit/runit-2.1.2/src/chkshsgr.c b/mirror_runit/runit-2.1.2/src/chkshsgr.c new file mode 100644 index 0000000..38c352d --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/chkshsgr.c @@ -0,0 +1,12 @@ +/* Public domain. */ + +#include + +int main() +{ + short x[4]; + + x[0] = x[1] = 0; + if (getgroups(1,x) == 0) if (setgroups(1,x) == -1) _exit(1); + _exit(0); +} diff --git a/mirror_runit/runit-2.1.2/src/choose.sh b/mirror_runit/runit-2.1.2/src/choose.sh new file mode 100644 index 0000000..feff2da --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/choose.sh @@ -0,0 +1,18 @@ + +result="$4" + +case "$1" in + *c*) ./compile $2.c >/dev/null 2>&1 || result="$3" ;; +esac + +case "$1" in + *l*) ./load $2 >/dev/null 2>&1 || result="$3" ;; +esac + +case "$1" in + *r*) ./$2 >/dev/null 2>&1 || result="$3" ;; +esac + +rm -f $2.o $2 + +exec cat "$result" diff --git a/mirror_runit/runit-2.1.2/src/chpst.c b/mirror_runit/runit-2.1.2/src/chpst.c new file mode 100644 index 0000000..f1b8ed9 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/chpst.c @@ -0,0 +1,475 @@ +#include +#include +#include +#include +#include +#include "sgetopt.h" +#include "error.h" +#include "strerr.h" +#include "str.h" +#include "uidgid.h" +#include "prot.h" +#include "strerr.h" +#include "scan.h" +#include "fmt.h" +#include "lock.h" +#include "pathexec.h" +#include "stralloc.h" +#include "byte.h" +#include "open.h" +#include "openreadclose.h" +#include "direntry.h" + +#define USAGE_MAIN " [-vP012] [-u user[:group]] [-U user[:group]] [-b argv0] [-e dir] [-/ root] [-n nice] [-l|-L lock] [-m n] [-d n] [-o n] [-p n] [-f n] [-c n] prog" +#define FATAL "chpst: fatal: " +#define WARNING "chpst: warning: " + +const char *progname; +static stralloc sa; + +void fatal(const char *m) { strerr_die3sys(111, FATAL, m, ": "); } +void fatal2(const char *m0, const char *m1) { + strerr_die5sys(111, FATAL, m0, ": ", m1, ": "); +} +void fatalx(const char *m0, const char *m1) { + strerr_die4x(111, FATAL, m0, ": ", m1); +} +void warn(const char *m) { strerr_warn2(WARNING, m, 0); } +void die_nomem() { strerr_die2x(111, FATAL, "out of memory."); } +void usage() { strerr_die4x(100, "usage: ", progname, USAGE_MAIN, "\n"); } + +char *set_user =0; +char *env_user =0; +const char *argv0 =0; +const char *env_dir =0; +unsigned int verbose =0; +unsigned int pgrp =0; +unsigned int nostdin =0; +unsigned int nostdout =0; +unsigned int nostderr =0; +long limitd =-2; +long limits =-2; +long limitl =-2; +long limita =-2; +long limito =-2; +long limitp =-2; +long limitf =-2; +long limitc =-2; +long limitr =-2; +long limitt =-2; +long nicelvl =0; +const char *lock =0; +const char *root =0; +unsigned int lockdelay; + +void suidgid(char *user, unsigned int ext) { + struct uidgid ugid; + + if (ext) { + if (! uidgids_get(&ugid, user)) { + if (*user == ':') fatalx("invalid uid/gids", user +1); + if (errno) fatal("unable to get password/group file entry"); + fatalx("unknown user/group", user); + } + } + else + if (! uidgid_get(&ugid, user)) { + if (errno) fatal("unable to get password file entry"); + fatalx("unknown account", user); + } + if (setgroups(ugid.gids, ugid.gid) == -1) fatal("unable to setgroups"); + if (setgid(*ugid.gid) == -1) fatal("unable to setgid"); + if (prot_uid(ugid.uid) == -1) fatal("unable to setuid"); +} + +void euidgid(char *user, unsigned int ext) { + struct uidgid ugid; + char bufnum[FMT_ULONG]; + + if (ext) { + if (! uidgids_get(&ugid, user)) { + if (*user == ':') fatalx("invalid uid/gids", user +1); + if (errno) fatal("unable to get password/group file entry"); + fatalx("unknown user/group", user); + } + } + else + if (! uidgid_get(&ugid, user)) { + if (errno) fatal("unable to get password file entry"); + fatalx("unknown account", user); + } + bufnum[fmt_ulong(bufnum, *ugid.gid)] =0; + if (! pathexec_env("GID", bufnum)) die_nomem(); + bufnum[fmt_ulong(bufnum, ugid.uid)] =0; + if (! pathexec_env("UID", bufnum)) die_nomem(); +} + +void edir(const char *dirname) { + int wdir; + DIR *dir; + direntry *d; + int i; + + if ((wdir =open_read(".")) == -1) + fatal("unable to open current working directory"); + if (chdir(dirname)) fatal2("unable to switch to directory", dirname); + if (! (dir =opendir("."))) fatal2("unable to open directory", dirname); + for (;;) { + errno =0; + d =readdir(dir); + if (! d) { + if (errno) fatal2("unable to read directory", dirname); + break; + } + if (d->d_name[0] == '.') continue; + if (openreadclose(d->d_name, &sa, 256) == -1) { + if ((errno == error_isdir) && env_dir) { + if (verbose) + strerr_warn6(WARNING, "unable to read ", dirname, "/", + d->d_name, ": ", &strerr_sys); + continue; + } + else + strerr_die6sys(111, FATAL, "unable to read ", dirname, "/", + d->d_name, ": "); + } + if (sa.len) { + sa.len =byte_chr(sa.s, sa.len, '\n'); + while (sa.len && (sa.s[sa.len -1] == ' ' || sa.s[sa.len -1] == '\t')) + --sa.len; + for (i =0; i < sa.len; ++i) if (! sa.s[i]) sa.s[i] ='\n'; + if (! stralloc_0(&sa)) die_nomem(); + if (! pathexec_env(d->d_name, sa.s)) die_nomem(); + } + else + if (! pathexec_env(d->d_name, 0)) die_nomem(); + } + closedir(dir); + if (fchdir(wdir) == -1) fatal("unable to switch to starting directory"); + close(wdir); +} + +void slock_die(const char *m, const char *f, unsigned int x) { + if (! x) fatal2(m, f); + _exit(0); +} +void slock(const char *f, unsigned int d, unsigned int x) { + int fd; + + if ((fd =open_append(f)) == -1) slock_die("unable to open lock", f, x); + if (d) { + if (lock_ex(fd) == -1) slock_die("unable to lock", f, x); + return; + } + if (lock_exnb(fd) == -1) slock_die("unable to lock", f, x); +} + +void limit(int what, long l) { + struct rlimit r; + + if (getrlimit(what, &r) == -1) fatal("unable to getrlimit()"); + if ((l < 0) || (l > r.rlim_max)) + r.rlim_cur =r.rlim_max; + else + r.rlim_cur =l; + if (setrlimit(what, &r) == -1) fatal("unable to setrlimit()"); +} +void slimit() { + if (limitd >= -1) { +#ifdef RLIMIT_DATA + limit(RLIMIT_DATA, limitd); +#else + if (verbose) warn("system does not support RLIMIT_DATA"); +#endif + } + if (limits >= -1) { +#ifdef RLIMIT_STACK + limit(RLIMIT_STACK, limits); +#else + if (verbose) warn("system does not support RLIMIT_STACK"); +#endif + } + if (limitl >= -1) { +#ifdef RLIMIT_MEMLOCK + limit(RLIMIT_MEMLOCK, limitl); +#else + if (verbose) warn("system does not support RLIMIT_MEMLOCK"); +#endif + } + if (limita >= -1) { +#ifdef RLIMIT_VMEM + limit(RLIMIT_VMEM, limita); +#else +#ifdef RLIMIT_AS + limit(RLIMIT_AS, limita); +#else + if (verbose) + warn("system does neither support RLIMIT_VMEM nor RLIMIT_AS"); +#endif +#endif + } + if (limito >= -1) { +#ifdef RLIMIT_NOFILE + limit(RLIMIT_NOFILE, limito); +#else +#ifdef RLIMIT_OFILE + limit(RLIMIT_OFILE, limito); +#else + if (verbose) + warn("system does neither support RLIMIT_NOFILE nor RLIMIT_OFILE"); +#endif +#endif + } + if (limitp >= -1) { +#ifdef RLIMIT_NPROC + limit(RLIMIT_NPROC, limitp); +#else + if (verbose) warn("system does not support RLIMIT_NPROC"); +#endif + } + if (limitf >= -1) { +#ifdef RLIMIT_FSIZE + limit(RLIMIT_FSIZE, limitf); +#else + if (verbose) warn("system does not support RLIMIT_FSIZE"); +#endif + } + if (limitc >= -1) { +#ifdef RLIMIT_CORE + limit(RLIMIT_CORE, limitc); +#else + if (verbose) warn("system does not support RLIMIT_CORE"); +#endif + } + if (limitr >= -1) { +#ifdef RLIMIT_RSS + limit(RLIMIT_RSS, limitr); +#else + if (verbose) warn("system does not support RLIMIT_RSS"); +#endif + } + if (limitt >= -1) { +#ifdef RLIMIT_CPU + limit(RLIMIT_CPU, limitt); +#else + if (verbose) warn("system does not support RLIMIT_CPU"); +#endif + } +} + +/* argv[0] */ +void setuidgid(int, const char *const *); +void envuidgid(int, const char *const *); +void envdir(int, const char *const *); +void pgrphack(int, const char *const *); +void setlock(int, const char *const *); +void softlimit(int, const char *const *); + +int main(int argc, const char **argv) { + int opt; + int i; + unsigned long ul; + + progname =argv[0]; + for (i =str_len(progname); i; --i) + if (progname[i -1] == '/') { + progname +=i; + break; + } + if (progname[0] == 'd') ++progname; + + /* argv[0] */ + if (str_equal(progname, "setuidgid")) setuidgid(argc, argv); + if (str_equal(progname, "envuidgid")) envuidgid(argc, argv); + if (str_equal(progname, "envdir")) envdir(argc, argv); + if (str_equal(progname, "pgrphack")) pgrphack(argc, argv); + if (str_equal(progname, "setlock")) setlock(argc, argv); + if (str_equal(progname, "softlimit")) softlimit(argc, argv); + + while ((opt =getopt(argc, argv, "u:U:b:e:m:d:o:p:f:c:r:t:/:n:l:L:vP012V")) + != opteof) + switch(opt) { + case 'u': set_user =(char*)optarg; break; + case 'U': env_user =(char*)optarg; break; + case 'b': argv0 =(char*)optarg; break; + case 'e': env_dir =optarg; break; + case 'm': + if (optarg[scan_ulong(optarg, &ul)]) usage(); + limits =limitl =limita =limitd =ul; + break; + case 'd': if (optarg[scan_ulong(optarg, &ul)]) usage(); limitd =ul; break; + case 'o': if (optarg[scan_ulong(optarg, &ul)]) usage(); limito =ul; break; + case 'p': if (optarg[scan_ulong(optarg, &ul)]) usage(); limitp =ul; break; + case 'f': if (optarg[scan_ulong(optarg, &ul)]) usage(); limitf =ul; break; + case 'c': if (optarg[scan_ulong(optarg, &ul)]) usage(); limitc =ul; break; + case 'r': if (optarg[scan_ulong(optarg, &ul)]) usage(); limitr =ul; break; + case 't': if (optarg[scan_ulong(optarg, &ul)]) usage(); limitt =ul; break; + case '/': root =optarg; break; + case 'n': + switch (*optarg) { + case '-': + if (optarg[scan_ulong(++optarg, &ul)]) usage(); nicelvl =ul; + nicelvl *=-1; + break; + case '+': ++optarg; + default: + if (optarg[scan_ulong(optarg, &ul)]) usage(); nicelvl =ul; + break; + } + break; + case 'l': if (lock) usage(); lock =optarg; lockdelay =1; break; + case 'L': if (lock) usage(); lock =optarg; lockdelay =0; break; + case 'v': verbose =1; break; + case 'P': pgrp =1; break; + case '0': nostdin =1; break; + case '1': nostdout =1; break; + case '2': nostderr =1; break; + case 'V': strerr_warn1("$Id: f279d44141c981dd7535a12260efcf1ef7beed26 $", 0); + case '?': usage(); + } + argv +=optind; + if (! argv || ! *argv) usage(); + + if (pgrp) setsid(); + if (env_dir) edir(env_dir); + if (root) { + if (chdir(root) == -1) fatal2("unable to change directory", root); + if (chroot(".") == -1) fatal("unable to change root directory"); + } + if (nicelvl) { + errno =0; + if (nice(nicelvl) == -1) if (errno) fatal("unable to set nice level"); + } + if (env_user) euidgid(env_user, 1); + if (set_user) suidgid(set_user, 1); + if (lock) slock(lock, lockdelay, 0); + if (nostdin) if (close(0) == -1) fatal("unable to close stdin"); + if (nostdout) if (close(1) == -1) fatal("unable to close stdout"); + if (nostderr) if (close(2) == -1) fatal("unable to close stderr"); + slimit(); + + progname =*argv; + if (argv0) *argv =argv0; + pathexec_env_run(progname, argv); + fatal2("unable to run", *argv); + return(0); +} + +/* argv[0] */ +#define USAGE_SETUIDGID " account child" +#define USAGE_ENVUIDGID " account child" +#define USAGE_ENVDIR " dir child" +#define USAGE_PGRPHACK " child" +#define USAGE_SETLOCK " [ -nNxX ] file program [ arg ... ]" +#define USAGE_SOFTLIMIT " [-a allbytes] [-c corebytes] [-d databytes] [-f filebytes] [-l lockbytes] [-m membytes] [-o openfiles] [-p processes] [-r residentbytes] [-s stackbytes] [-t cpusecs] child" + +void setuidgid_usage() { + strerr_die4x(100, "usage: ", progname, USAGE_SETUIDGID, "\n"); +} +void setuidgid(int argc, const char *const *argv) { + const char *account; + + if (! (account =*++argv)) setuidgid_usage(); + if (! *++argv) setuidgid_usage(); + suidgid((char*)account, 0); + pathexec(argv); + fatal2("unable to run", *argv); +} + +void envuidgid_usage() { + strerr_die4x(100, "usage: ", progname, USAGE_ENVUIDGID, "\n"); +} +void envuidgid(int argc, const char *const *argv) { + const char *account; + + if (! (account =*++argv)) envuidgid_usage(); + if (! *++argv) envuidgid_usage(); + euidgid((char*)account, 0); + pathexec(argv); + fatal2("unable to run", *argv); +} + +void envdir_usage() { + strerr_die4x(100, "usage: ", progname, USAGE_ENVDIR, "\n"); +} +void envdir(int argc, const char *const *argv) { + const char *dir; + + if (! (dir =*++argv)) envdir_usage(); + if (! *++argv) envdir_usage(); + edir(dir); + pathexec(argv); + fatal2("unable to run", *argv); +} + +void pgrphack_usage() { + strerr_die4x(100, "usage: ", progname, USAGE_PGRPHACK, "\n"); +} +void pgrphack(int argc, const char *const *argv) { + if (! *++argv) pgrphack_usage(); + setsid(); + pathexec(argv); + fatal2("unable to run", *argv); +} + +void setlock_usage() { + strerr_die4x(100, "usage: ", progname, USAGE_SETLOCK, "\n"); +} +void setlock(int argc, const char *const *argv) { + int opt; + unsigned int delay =0; + unsigned int x =0; + const char *fn; + + while ((opt =getopt(argc, argv, "nNxX")) != opteof) + switch(opt) { + case 'n': delay =1; break; + case 'N': delay =0; break; + case 'x': x =1; break; + case 'X': x =0; break; + default: setlock_usage(); + } + argv +=optind; + if (! (fn =*argv)) setlock_usage(); + if (! *++argv) setlock_usage(); + + slock(fn, delay, x); + pathexec(argv); + if (! x) fatal2("unable to run", *argv); + _exit(0); +} + +void softlimit_usage() { + strerr_die4x(100, "usage: ", progname, USAGE_SOFTLIMIT, "\n"); +} +void getlarg(long *l) { + unsigned long ul; + + if (str_equal(optarg, "=")) { *l =-1; return; } + if (optarg[scan_ulong(optarg, &ul)]) usage(); + *l =ul; +} +void softlimit(int argc, const char *const *argv) { + int opt; + + while ((opt =getopt(argc,argv,"a:c:d:f:l:m:o:p:r:s:t:")) != opteof) + switch(opt) { + case '?': softlimit_usage(); + case 'a': getlarg(&limita); break; + case 'c': getlarg(&limitc); break; + case 'd': getlarg(&limitd); break; + case 'f': getlarg(&limitf); break; + case 'l': getlarg(&limitl); break; + case 'm': getlarg(&limitd); limits =limitl =limita =limitd; break; + case 'o': getlarg(&limito); break; + case 'p': getlarg(&limitp); break; + case 'r': getlarg(&limitr); break; + case 's': getlarg(&limits); break; + case 't': getlarg(&limitt); break; + } + argv +=optind; + if (!*argv) softlimit_usage(); + slimit(); + pathexec(argv); + fatal2("unable to run", *argv); +} diff --git a/mirror_runit/runit-2.1.2/src/chpst.check b/mirror_runit/runit-2.1.2/src/chpst.check new file mode 100755 index 0000000..384113e --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/chpst.check @@ -0,0 +1,36 @@ +#!/bin/sh +rm -rf "${ctmp}" + +chpst +echo $? +chpst -V +echo $? + +# -u +# -U + +mkdir "${ctmp}" +echo 1 >"${ctmp}"/test +chpst -e"${ctmp}" env |sed -ne '/^test=1$/p' +echo $? +rm -rf "${ctmp}" + +chpst -l"${ctmp}" true +echo $? +rm -f "${ctmp}" + +chpst -L"${ctmp}" true +echo $? +rm -f "${ctmp}" + +# -m +# -o +# -p +# -f +# -c + +chpst -P true +echo $? + +chpst -012 true +echo $? diff --git a/mirror_runit/runit-2.1.2/src/chpst.dist b/mirror_runit/runit-2.1.2/src/chpst.dist new file mode 100644 index 0000000..6779bfd --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/chpst.dist @@ -0,0 +1,13 @@ +usage: chpst [-vP012] [-u user[:group]] [-U user[:group]] [-b argv0] [-e dir] [-/ root] [-n nice] [-l|-L lock] [-m n] [-d n] [-o n] [-p n] [-f n] [-c n] prog + +100 +$Id: f279d44141c981dd7535a12260efcf1ef7beed26 $ +usage: chpst [-vP012] [-u user[:group]] [-U user[:group]] [-b argv0] [-e dir] [-/ root] [-n nice] [-l|-L lock] [-m n] [-d n] [-o n] [-p n] [-f n] [-c n] prog + +100 +test=1 +0 +0 +0 +0 +0 diff --git a/mirror_runit/runit-2.1.2/src/coe.c b/mirror_runit/runit-2.1.2/src/coe.c new file mode 100644 index 0000000..50b2397 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/coe.c @@ -0,0 +1,9 @@ +/* Public domain. */ + +#include +#include "coe.h" + +int coe(int fd) +{ + return fcntl(fd,F_SETFD,1); +} diff --git a/mirror_runit/runit-2.1.2/src/coe.h b/mirror_runit/runit-2.1.2/src/coe.h new file mode 100644 index 0000000..b17db54 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/coe.h @@ -0,0 +1,8 @@ +/* Public domain. */ + +#ifndef COE_H +#define COE_H + +extern int coe(int); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/conf-cc b/mirror_runit/runit-2.1.2/src/conf-cc new file mode 100644 index 0000000..984024f --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/conf-cc @@ -0,0 +1,5 @@ +gcc -O2 -Wall + +gcc -O2 -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wshadow -Wcast-qual -Wcast-align -Wwrite-strings + +This will be used to compile .c files. diff --git a/mirror_runit/runit-2.1.2/src/conf-ld b/mirror_runit/runit-2.1.2/src/conf-ld new file mode 100644 index 0000000..59a0de7 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/conf-ld @@ -0,0 +1,3 @@ +gcc -s + +This will be used to link .o files into an executable. diff --git a/mirror_runit/runit-2.1.2/src/direntry.h1 b/mirror_runit/runit-2.1.2/src/direntry.h1 new file mode 100644 index 0000000..6cb088d --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/direntry.h1 @@ -0,0 +1,12 @@ +/* Public domain. */ + +#ifndef DIRENTRY_H +#define DIRENTRY_H + +/* sysdep: -dirent */ + +#include +#include +#define direntry struct direct + +#endif diff --git a/mirror_runit/runit-2.1.2/src/direntry.h2 b/mirror_runit/runit-2.1.2/src/direntry.h2 new file mode 100644 index 0000000..bfd4d19 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/direntry.h2 @@ -0,0 +1,12 @@ +/* Public domain. */ + +#ifndef DIRENTRY_H +#define DIRENTRY_H + +/* sysdep: +dirent */ + +#include +#include +#define direntry struct dirent + +#endif diff --git a/mirror_runit/runit-2.1.2/src/env.c b/mirror_runit/runit-2.1.2/src/env.c new file mode 100644 index 0000000..1b3ef62 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/env.c @@ -0,0 +1,17 @@ +/* Public domain. */ + +#include "str.h" +#include "env.h" + +extern /*@null@*/char *env_get(const char *s) +{ + int i; + unsigned int len; + + if (!s) return 0; + len = str_len(s); + for (i = 0;environ[i];++i) + if (str_start(environ[i],s) && (environ[i][len] == '=')) + return environ[i] + len + 1; + return 0; +} diff --git a/mirror_runit/runit-2.1.2/src/env.h b/mirror_runit/runit-2.1.2/src/env.h new file mode 100644 index 0000000..834d331 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/env.h @@ -0,0 +1,10 @@ +/* Public domain. */ + +#ifndef ENV_H +#define ENV_H + +extern char **environ; + +extern /*@null@*/char *env_get(const char *); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/error.c b/mirror_runit/runit-2.1.2/src/error.c new file mode 100644 index 0000000..ea5f9c2 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/error.c @@ -0,0 +1,132 @@ +/* Public domain. */ + +#include +#include "error.h" + +/* warning: as coverage improves here, should update error_{str,temp} */ + +int error_intr = +#ifdef EINTR +EINTR; +#else +-1; +#endif + +int error_nomem = +#ifdef ENOMEM +ENOMEM; +#else +-2; +#endif + +int error_noent = +#ifdef ENOENT +ENOENT; +#else +-3; +#endif + +int error_txtbsy = +#ifdef ETXTBSY +ETXTBSY; +#else +-4; +#endif + +int error_io = +#ifdef EIO +EIO; +#else +-5; +#endif + +int error_exist = +#ifdef EEXIST +EEXIST; +#else +-6; +#endif + +int error_timeout = +#ifdef ETIMEDOUT +ETIMEDOUT; +#else +-7; +#endif + +int error_inprogress = +#ifdef EINPROGRESS +EINPROGRESS; +#else +-8; +#endif + +int error_wouldblock = +#ifdef EWOULDBLOCK +EWOULDBLOCK; +#else +-9; +#endif + +int error_again = +#ifdef EAGAIN +EAGAIN; +#else +-10; +#endif + +int error_pipe = +#ifdef EPIPE +EPIPE; +#else +-11; +#endif + +int error_perm = +#ifdef EPERM +EPERM; +#else +-12; +#endif + +int error_acces = +#ifdef EACCES +EACCES; +#else +-13; +#endif + +int error_nodevice = +#ifdef ENXIO +ENXIO; +#else +-14; +#endif + +int error_proto = +#ifdef EPROTO +EPROTO; +#else +-15; +#endif + +int error_isdir = +#ifdef EISDIR +EISDIR; +#else +-16; +#endif + +int error_connrefused = +#ifdef ECONNREFUSED +ECONNREFUSED; +#else +-17; +#endif + +int error_notdir = +#ifdef ENOTDIR +ENOTDIR; +#else +-18; +#endif diff --git a/mirror_runit/runit-2.1.2/src/error.h b/mirror_runit/runit-2.1.2/src/error.h new file mode 100644 index 0000000..8ecb400 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/error.h @@ -0,0 +1,33 @@ +/* Public domain. */ + +#ifndef ERROR_H +#define ERROR_H + +/* 20030124: include -upcoming glibc changes */ +#include + +/* extern int errno; */ + +extern int error_intr; +extern int error_nomem; +extern int error_noent; +extern int error_txtbsy; +extern int error_io; +extern int error_exist; +extern int error_timeout; +extern int error_inprogress; +extern int error_wouldblock; +extern int error_again; +extern int error_pipe; +extern int error_perm; +extern int error_acces; +extern int error_nodevice; +extern int error_proto; +extern int error_isdir; +extern int error_connrefused; +extern int error_notdir; + +extern const char *error_str(int); +extern int error_temp(int); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/error_str.c b/mirror_runit/runit-2.1.2/src/error_str.c new file mode 100644 index 0000000..e002efe --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/error_str.c @@ -0,0 +1,267 @@ +/* Public domain. */ + +#include +#include "error.h" + +#define X(e,s) if (i == e) return s; + +const char *error_str(int i) +{ + X(0,"no error") + X(error_intr,"interrupted system call") + X(error_nomem,"out of memory") + X(error_noent,"file does not exist") + X(error_txtbsy,"text busy") + X(error_io,"input/output error") + X(error_exist,"file already exists") + X(error_timeout,"timed out") + X(error_inprogress,"operation in progress") + X(error_again,"temporary failure") + X(error_wouldblock,"input/output would block") + X(error_pipe,"broken pipe") + X(error_perm,"permission denied") + X(error_acces,"access denied") + X(error_nodevice,"device not configured") + X(error_proto,"protocol error") + X(error_isdir,"is a directory") + X(error_connrefused,"connection refused") + X(error_notdir,"not a directory") +#ifdef ESRCH + X(ESRCH,"no such process") +#endif +#ifdef E2BIG + X(E2BIG,"argument list too long") +#endif +#ifdef ENOEXEC + X(ENOEXEC,"exec format error") +#endif +#ifdef EBADF + X(EBADF,"file descriptor not open") +#endif +#ifdef ECHILD + X(ECHILD,"no child processes") +#endif +#ifdef EDEADLK + X(EDEADLK,"operation would cause deadlock") +#endif +#ifdef EFAULT + X(EFAULT,"bad address") +#endif +#ifdef ENOTBLK + X(ENOTBLK,"not a block device") +#endif +#ifdef EBUSY + X(EBUSY,"device busy") +#endif +#ifdef EXDEV + X(EXDEV,"cross-device link") +#endif +#ifdef ENODEV + X(ENODEV,"device does not support operation") +#endif +#ifdef EINVAL + X(EINVAL,"invalid argument") +#endif +#ifdef ENFILE + X(ENFILE,"system cannot open more files") +#endif +#ifdef EMFILE + X(EMFILE,"process cannot open more files") +#endif +#ifdef ENOTTY + X(ENOTTY,"not a tty") +#endif +#ifdef EFBIG + X(EFBIG,"file too big") +#endif +#ifdef ENOSPC + X(ENOSPC,"out of disk space") +#endif +#ifdef ESPIPE + X(ESPIPE,"unseekable descriptor") +#endif +#ifdef EROFS + X(EROFS,"read-only file system") +#endif +#ifdef EMLINK + X(EMLINK,"too many links") +#endif +#ifdef EDOM + X(EDOM,"input out of range") +#endif +#ifdef ERANGE + X(ERANGE,"output out of range") +#endif +#ifdef EALREADY + X(EALREADY,"operation already in progress") +#endif +#ifdef ENOTSOCK + X(ENOTSOCK,"not a socket") +#endif +#ifdef EDESTADDRREQ + X(EDESTADDRREQ,"destination address required") +#endif +#ifdef EMSGSIZE + X(EMSGSIZE,"message too long") +#endif +#ifdef EPROTOTYPE + X(EPROTOTYPE,"incorrect protocol type") +#endif +#ifdef ENOPROTOOPT + X(ENOPROTOOPT,"protocol not available") +#endif +#ifdef EPROTONOSUPPORT + X(EPROTONOSUPPORT,"protocol not supported") +#endif +#ifdef ESOCKTNOSUPPORT + X(ESOCKTNOSUPPORT,"socket type not supported") +#endif +#ifdef EOPNOTSUPP + X(EOPNOTSUPP,"operation not supported") +#endif +#ifdef EPFNOSUPPORT + X(EPFNOSUPPORT,"protocol family not supported") +#endif +#ifdef EAFNOSUPPORT + X(EAFNOSUPPORT,"address family not supported") +#endif +#ifdef EADDRINUSE + X(EADDRINUSE,"address already used") +#endif +#ifdef EADDRNOTAVAIL + X(EADDRNOTAVAIL,"address not available") +#endif +#ifdef ENETDOWN + X(ENETDOWN,"network down") +#endif +#ifdef ENETUNREACH + X(ENETUNREACH,"network unreachable") +#endif +#ifdef ENETRESET + X(ENETRESET,"network reset") +#endif +#ifdef ECONNABORTED + X(ECONNABORTED,"connection aborted") +#endif +#ifdef ECONNRESET + X(ECONNRESET,"connection reset") +#endif +#ifdef ENOBUFS + X(ENOBUFS,"out of buffer space") +#endif +#ifdef EISCONN + X(EISCONN,"already connected") +#endif +#ifdef ENOTCONN + X(ENOTCONN,"not connected") +#endif +#ifdef ESHUTDOWN + X(ESHUTDOWN,"socket shut down") +#endif +#ifdef ETOOMANYREFS + X(ETOOMANYREFS,"too many references") +#endif +#ifdef ELOOP + X(ELOOP,"symbolic link loop") +#endif +#ifdef ENAMETOOLONG + X(ENAMETOOLONG,"file name too long") +#endif +#ifdef EHOSTDOWN + X(EHOSTDOWN,"host down") +#endif +#ifdef EHOSTUNREACH + X(EHOSTUNREACH,"host unreachable") +#endif +#ifdef ENOTEMPTY + X(ENOTEMPTY,"directory not empty") +#endif +#ifdef EPROCLIM + X(EPROCLIM,"too many processes") +#endif +#ifdef EUSERS + X(EUSERS,"too many users") +#endif +#ifdef EDQUOT + X(EDQUOT,"disk quota exceeded") +#endif +#ifdef ESTALE + X(ESTALE,"stale NFS file handle") +#endif +#ifdef EREMOTE + X(EREMOTE,"too many levels of remote in path") +#endif +#ifdef EBADRPC + X(EBADRPC,"RPC structure is bad") +#endif +#ifdef ERPCMISMATCH + X(ERPCMISMATCH,"RPC version mismatch") +#endif +#ifdef EPROGUNAVAIL + X(EPROGUNAVAIL,"RPC program unavailable") +#endif +#ifdef EPROGMISMATCH + X(EPROGMISMATCH,"program version mismatch") +#endif +#ifdef EPROCUNAVAIL + X(EPROCUNAVAIL,"bad procedure for program") +#endif +#ifdef ENOLCK + X(ENOLCK,"no locks available") +#endif +#ifdef ENOSYS + X(ENOSYS,"system call not available") +#endif +#ifdef EFTYPE + X(EFTYPE,"bad file type") +#endif +#ifdef EAUTH + X(EAUTH,"authentication error") +#endif +#ifdef ENEEDAUTH + X(ENEEDAUTH,"not authenticated") +#endif +#ifdef ENOSTR + X(ENOSTR,"not a stream device") +#endif +#ifdef ETIME + X(ETIME,"timer expired") +#endif +#ifdef ENOSR + X(ENOSR,"out of stream resources") +#endif +#ifdef ENOMSG + X(ENOMSG,"no message of desired type") +#endif +#ifdef EBADMSG + X(EBADMSG,"bad message type") +#endif +#ifdef EIDRM + X(EIDRM,"identifier removed") +#endif +#ifdef ENONET + X(ENONET,"machine not on network") +#endif +#ifdef ERREMOTE + X(ERREMOTE,"object not local") +#endif +#ifdef ENOLINK + X(ENOLINK,"link severed") +#endif +#ifdef EADV + X(EADV,"advertise error") +#endif +#ifdef ESRMNT + X(ESRMNT,"srmount error") +#endif +#ifdef ECOMM + X(ECOMM,"communication error") +#endif +#ifdef EMULTIHOP + X(EMULTIHOP,"multihop attempted") +#endif +#ifdef EREMCHG + X(EREMCHG,"remote address changed") +#endif + return "unknown error"; +} diff --git a/mirror_runit/runit-2.1.2/src/fd.h b/mirror_runit/runit-2.1.2/src/fd.h new file mode 100644 index 0000000..1c7a035 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/fd.h @@ -0,0 +1,9 @@ +/* Public domain. */ + +#ifndef FD_H +#define FD_H + +extern int fd_copy(int,int); +extern int fd_move(int,int); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/fd_copy.c b/mirror_runit/runit-2.1.2/src/fd_copy.c new file mode 100644 index 0000000..80e9d15 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/fd_copy.c @@ -0,0 +1,14 @@ +/* Public domain. */ + +#include +#include +#include "fd.h" + +int fd_copy(int to,int from) +{ + if (to == from) return 0; + if (fcntl(from,F_GETFL,0) == -1) return -1; + close(to); + if (fcntl(from,F_DUPFD,to) == -1) return -1; + return 0; +} diff --git a/mirror_runit/runit-2.1.2/src/fd_move.c b/mirror_runit/runit-2.1.2/src/fd_move.c new file mode 100644 index 0000000..49f723f --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/fd_move.c @@ -0,0 +1,12 @@ +/* Public domain. */ + +#include +#include "fd.h" + +int fd_move(int to,int from) +{ + if (to == from) return 0; + if (fd_copy(to,from) == -1) return -1; + close(from); + return 0; +} diff --git a/mirror_runit/runit-2.1.2/src/fifo.c b/mirror_runit/runit-2.1.2/src/fifo.c new file mode 100644 index 0000000..c14f683 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/fifo.c @@ -0,0 +1,12 @@ +/* Public domain. */ + +#include +#include +#include "hasmkffo.h" +#include "fifo.h" + +#ifdef HASMKFIFO +int fifo_make(const char *fn,int mode) { return mkfifo(fn,mode); } +#else +int fifo_make(const char *fn,int mode) { return mknod(fn,S_IFIFO | mode,0); } +#endif diff --git a/mirror_runit/runit-2.1.2/src/fifo.h b/mirror_runit/runit-2.1.2/src/fifo.h new file mode 100644 index 0000000..ba75678 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/fifo.h @@ -0,0 +1,8 @@ +/* Public domain. */ + +#ifndef FIFO_H +#define FIFO_H + +extern int fifo_make(const char *,int); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/find-systype.sh b/mirror_runit/runit-2.1.2/src/find-systype.sh new file mode 100644 index 0000000..9f6e565 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/find-systype.sh @@ -0,0 +1,143 @@ +# oper-:arch-:syst-:chip-:kern- +# oper = operating system type; e.g., sunos-4.1.4 +# arch = machine language; e.g., sparc +# syst = which binaries can run; e.g., sun4 +# chip = chip model; e.g., micro-2-80 +# kern = kernel version; e.g., sun4m +# dependence: arch --- chip +# \ \ +# oper --- syst --- kern +# so, for example, syst is interpreted in light of oper, but chip is not. +# anyway, no slashes, no extra colons, no uppercase letters. +# the point of the extra -'s is to ease parsing: can add hierarchies later. +# e.g., *:i386-*:*:pentium-*:* would handle pentium-100 as well as pentium, +# and i386-486 (486s do have more instructions, you know) as well as i386. +# the idea here is to include ALL useful available information. + +exec 2>/dev/null + +sys="`uname -s | tr '/:[A-Z]' '..[a-z]'`" +if [ x"$sys" != x ] +then + unamer="`uname -r | tr /: ..`" + unamem="`uname -m | tr /: ..`" + unamev="`uname -v | tr /: ..`" + + case "$sys" in + bsd.os|freebsd|netbsd|openbsd) + # in bsd 4.4, uname -v does not have useful info. + # in bsd 4.4, uname -m is arch, not chip. + oper="$sys-$unamer" + arch="$unamem" + syst="" + chip="`sysctl -n hw.model`" # hopefully + kern="" + ;; + linux) + # as in bsd 4.4, uname -v does not have useful info. + oper="$sys-$unamer" + syst="" + chip="$unamem" + kern="" + case "$chip" in + i386|i486|i586|i686) + arch="i386" + ;; + alpha) + arch="alpha" + ;; + esac + ;; + aix) + # naturally IBM has to get uname -r and uname -v backwards. dorks. + oper="$sys-$unamev-$unamer" + arch="`arch | tr /: ..`" + syst="" + chip="$unamem" + kern="" + ;; + sunos) + oper="$sys-$unamer-$unamev" + arch="`(uname -p || mach) | tr /: ..`" + syst="`arch | tr /: ..`" + chip="$unamem" # this is wrong; is there any way to get the real info? + kern="`arch -k | tr /: ..`" + ;; + unix_sv) + oper="$sys-$unamer-$unamev" + arch="`uname -m`" + syst="" + chip="$unamem" + kern="" + ;; + *) + oper="$sys-$unamer-$unamev" + arch="`arch | tr /: ..`" + syst="" + chip="$unamem" + kern="" + ;; + esac +else + gcc -c trycpp.c + gcc -o trycpp trycpp.o + case `./trycpp` in + nextstep) + oper="nextstep-`hostinfo | sed -n 's/^[ ]*NeXT Mach \([^:]*\):.*$/\1/p'`" + arch="`hostinfo | sed -n 's/^Processor type: \(.*\) (.*)$/\1/p' | tr /: ..`" + syst="" + chip="`hostinfo | sed -n 's/^Processor type: .* (\(.*\))$/\1/p' | tr ' /:' '...'`" + kern="" + ;; + *) + oper="unknown" + arch="" + syst="" + chip="" + kern="" + ;; + esac + rm -f trycpp.o trycpp +fi + +case "$chip" in +80486) + # let's try to be consistent here. (BSD/OS) + chip=i486 + ;; +i486DX) + # respect the hyphen hierarchy. (FreeBSD) + chip=i486-dx + ;; +i486.DX2) + # respect the hyphen hierarchy. (FreeBSD) + chip=i486-dx2 + ;; +Intel.586) + # no, you nitwits, there is no such chip. (NeXTStep) + chip=pentium + ;; +i586) + # no, you nitwits, there is no such chip. (Linux) + chip=pentium + ;; +i686) + # STOP SAYING THAT! (Linux) + chip=ppro +esac + +if gcc -c x86cpuid.c +then + if gcc -o x86cpuid x86cpuid.o + then + x86cpuid="`./x86cpuid | tr /: ..`" + case "$x86cpuid" in + ?*) + chip="$x86cpuid" + ;; + esac + fi +fi +rm -f x86cpuid x86cpuid.o + +echo "$oper-:$arch-:$syst-:$chip-:$kern-" | tr ' [A-Z]' '.[a-z]' diff --git a/mirror_runit/runit-2.1.2/src/fmt.h b/mirror_runit/runit-2.1.2/src/fmt.h new file mode 100644 index 0000000..8847fa6 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/fmt.h @@ -0,0 +1,27 @@ +/* Public domain. */ + +#ifndef FMT_H +#define FMT_H + +#define FMT_ULONG 40 /* enough space to hold 2^128 - 1 in decimal, plus \0 */ +#define FMT_LEN ((char *) 0) /* convenient abbreviation */ + +extern unsigned int fmt_uint(char *,unsigned int); +extern unsigned int fmt_uint0(char *,unsigned int,unsigned int); +extern unsigned int fmt_xint(char *,unsigned int); +extern unsigned int fmt_nbbint(char *,unsigned int,unsigned int,unsigned int,unsigned int); +extern unsigned int fmt_ushort(char *,unsigned short); +extern unsigned int fmt_xshort(char *,unsigned short); +extern unsigned int fmt_nbbshort(char *,unsigned int,unsigned int,unsigned int,unsigned short); +extern unsigned int fmt_ulong(char *,unsigned long); +extern unsigned int fmt_xlong(char *,unsigned long); +extern unsigned int fmt_nbblong(char *,unsigned int,unsigned int,unsigned int,unsigned long); + +extern unsigned int fmt_plusminus(char *,int); +extern unsigned int fmt_minus(char *,int); +extern unsigned int fmt_0x(char *,int); + +extern unsigned int fmt_str(char *,const char *); +extern unsigned int fmt_strn(char *,const char *,unsigned int); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/fmt_ptime.c b/mirror_runit/runit-2.1.2/src/fmt_ptime.c new file mode 100644 index 0000000..2ab5725 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/fmt_ptime.c @@ -0,0 +1,42 @@ +#include +#include "fmt_ptime.h" +#include "fmt.h" + +unsigned int fmt_ptime2(char *s, struct taia *ta, char sep) { + struct tm *t; + time_t u; + + if (ta->sec.x < 4611686018427387914ULL) return(0); /* impossible? */ + u =ta->sec.x -4611686018427387914ULL; + if (! (t =gmtime((time_t*)&u))) return(0); + fmt_ulong(s, 1900 +t->tm_year); + s[4] ='-'; fmt_uint0(&s[5], t->tm_mon +1, 2); + s[7] ='-'; fmt_uint0(&s[8], t->tm_mday, 2); + s[10] =sep; fmt_uint0(&s[11], t->tm_hour, 2); + s[13] =':'; fmt_uint0(&s[14], t->tm_min, 2); + s[16] =':'; fmt_uint0(&s[17], t->tm_sec, 2); + s[19] ='.'; fmt_uint0(&s[20], ta->nano, 9); + return(25); +} + +unsigned int fmt_ptime(char *s, struct taia *ta) { + return(fmt_ptime2(s, ta, '_')); +} + +unsigned int fmt_ptime_iso8601(char *s, struct taia *ta) { + return(fmt_ptime2(s, ta, 'T')); +} + +unsigned int fmt_taia(char *s, struct taia *t) { + static char hex[16] ="0123456789abcdef"; + static char pack[TAIA_PACK]; + int i; + + taia_pack(pack, t); + s[0] ='@'; + for (i =0; i < 12; ++i) { + s[i *2 +1] =hex[(pack[i] >>4) &15]; + s[i *2 +2] =hex[pack[i] &15]; + } + return(25); +} diff --git a/mirror_runit/runit-2.1.2/src/fmt_ptime.h b/mirror_runit/runit-2.1.2/src/fmt_ptime.h new file mode 100644 index 0000000..72ea008 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/fmt_ptime.h @@ -0,0 +1,14 @@ +#ifndef FMT_PTIME_H +#define FMT_PTIME_H + +#define FMT_PTIME 30 + +#include +#include +#include "taia.h" + +extern unsigned int fmt_ptime(char *, struct taia *); +extern unsigned int fmt_ptime_iso8601(char *, struct taia *); +extern unsigned int fmt_taia(char *, struct taia *); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/fmt_uint.c b/mirror_runit/runit-2.1.2/src/fmt_uint.c new file mode 100644 index 0000000..b8ec0b7 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/fmt_uint.c @@ -0,0 +1,8 @@ +/* Public domain. */ + +#include "fmt.h" + +unsigned int fmt_uint(register char *s,register unsigned int u) +{ + return fmt_ulong(s,u); +} diff --git a/mirror_runit/runit-2.1.2/src/fmt_uint0.c b/mirror_runit/runit-2.1.2/src/fmt_uint0.c new file mode 100644 index 0000000..728a5aa --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/fmt_uint0.c @@ -0,0 +1,12 @@ +/* Public domain. */ + +#include "fmt.h" + +unsigned int fmt_uint0(char *s,unsigned int u,unsigned int n) +{ + unsigned int len; + len = fmt_uint(FMT_LEN,u); + while (len < n) { if (s) *s++ = '0'; ++len; } + if (s) fmt_uint(s,u); + return len; +} diff --git a/mirror_runit/runit-2.1.2/src/fmt_ulong.c b/mirror_runit/runit-2.1.2/src/fmt_ulong.c new file mode 100644 index 0000000..168572f --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/fmt_ulong.c @@ -0,0 +1,15 @@ +/* Public domain. */ + +#include "fmt.h" + +unsigned int fmt_ulong(register char *s,register unsigned long u) +{ + register unsigned int len; register unsigned long q; + len = 1; q = u; + while (q > 9) { ++len; q /= 10; } + if (s) { + s += len; + do { *--s = '0' + (u % 10); u /= 10; } while(u); /* handles u == 0 */ + } + return len; +} diff --git a/mirror_runit/runit-2.1.2/src/gen_alloc.h b/mirror_runit/runit-2.1.2/src/gen_alloc.h new file mode 100644 index 0000000..bd55e5b --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/gen_alloc.h @@ -0,0 +1,9 @@ +/* Public domain. */ + +#ifndef GEN_ALLOC_H +#define GEN_ALLOC_H + +#define GEN_ALLOC_typedef(ta,type,field,len,a) \ + typedef struct ta { type *field; unsigned int len; unsigned int a; } ta; + +#endif diff --git a/mirror_runit/runit-2.1.2/src/gen_allocdefs.h b/mirror_runit/runit-2.1.2/src/gen_allocdefs.h new file mode 100644 index 0000000..3afd92b --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/gen_allocdefs.h @@ -0,0 +1,36 @@ +/* Public domain. */ + +#ifndef GEN_ALLOC_DEFS_H +#define GEN_ALLOC_DEFS_H + +#define GEN_ALLOC_ready(ta,type,field,len,a,i,n,x,base,ta_ready) \ +int ta_ready(register ta *x,register unsigned int n) \ +{ register unsigned int i; \ + if (x->field) { \ + i = x->a; \ + if (n > i) { \ + x->a = base + n + (n >> 3); \ + if (alloc_re(&x->field,i * sizeof(type),x->a * sizeof(type))) return 1; \ + x->a = i; return 0; } \ + return 1; } \ + x->len = 0; \ + return !!(x->field = (type *) alloc((x->a = n) * sizeof(type))); } + +#define GEN_ALLOC_readyplus(ta,type,field,len,a,i,n,x,base,ta_rplus) \ +int ta_rplus(register ta *x,register unsigned int n) \ +{ register unsigned int i; \ + if (x->field) { \ + i = x->a; n += x->len; \ + if (n > i) { \ + x->a = base + n + (n >> 3); \ + if (alloc_re(&x->field,i * sizeof(type),x->a * sizeof(type))) return 1; \ + x->a = i; return 0; } \ + return 1; } \ + x->len = 0; \ + return !!(x->field = (type *) alloc((x->a = n) * sizeof(type))); } + +#define GEN_ALLOC_append(ta,type,field,len,a,i,n,x,base,ta_rplus,ta_append) \ +int ta_append(register ta *x,register const type *i) \ +{ if (!ta_rplus(x,1)) return 0; x->field[x->len++] = *i; return 1; } + +#endif diff --git a/mirror_runit/runit-2.1.2/src/hasflock.h1 b/mirror_runit/runit-2.1.2/src/hasflock.h1 new file mode 100644 index 0000000..ac7dfc3 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/hasflock.h1 @@ -0,0 +1,3 @@ +/* Public domain. */ + +/* sysdep: -flock */ diff --git a/mirror_runit/runit-2.1.2/src/hasflock.h2 b/mirror_runit/runit-2.1.2/src/hasflock.h2 new file mode 100644 index 0000000..1878f64 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/hasflock.h2 @@ -0,0 +1,4 @@ +/* Public domain. */ + +/* sysdep: +flock */ +#define HASFLOCK 1 diff --git a/mirror_runit/runit-2.1.2/src/hasmkffo.h1 b/mirror_runit/runit-2.1.2/src/hasmkffo.h1 new file mode 100644 index 0000000..a562451 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/hasmkffo.h1 @@ -0,0 +1,3 @@ +/* Public domain. */ + +/* sysdep: -mkfifo */ diff --git a/mirror_runit/runit-2.1.2/src/hasmkffo.h2 b/mirror_runit/runit-2.1.2/src/hasmkffo.h2 new file mode 100644 index 0000000..8ac8943 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/hasmkffo.h2 @@ -0,0 +1,4 @@ +/* Public domain. */ + +/* sysdep: +mkfifo */ +#define HASMKFIFO 1 diff --git a/mirror_runit/runit-2.1.2/src/hassgact.h1 b/mirror_runit/runit-2.1.2/src/hassgact.h1 new file mode 100644 index 0000000..7639d24 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/hassgact.h1 @@ -0,0 +1,3 @@ +/* Public domain. */ + +/* sysdep: -sigaction */ diff --git a/mirror_runit/runit-2.1.2/src/hassgact.h2 b/mirror_runit/runit-2.1.2/src/hassgact.h2 new file mode 100644 index 0000000..60ff776 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/hassgact.h2 @@ -0,0 +1,4 @@ +/* Public domain. */ + +/* sysdep: +sigaction */ +#define HASSIGACTION 1 diff --git a/mirror_runit/runit-2.1.2/src/hassgprm.h1 b/mirror_runit/runit-2.1.2/src/hassgprm.h1 new file mode 100644 index 0000000..ef3eee9 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/hassgprm.h1 @@ -0,0 +1,3 @@ +/* Public domain. */ + +/* sysdep: -sigprocmask */ diff --git a/mirror_runit/runit-2.1.2/src/hassgprm.h2 b/mirror_runit/runit-2.1.2/src/hassgprm.h2 new file mode 100644 index 0000000..be9d0d7 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/hassgprm.h2 @@ -0,0 +1,4 @@ +/* Public domain. */ + +/* sysdep: +sigprocmask */ +#define HASSIGPROCMASK 1 diff --git a/mirror_runit/runit-2.1.2/src/hasshsgr.h1 b/mirror_runit/runit-2.1.2/src/hasshsgr.h1 new file mode 100644 index 0000000..3806277 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/hasshsgr.h1 @@ -0,0 +1,3 @@ +/* Public domain. */ + +/* sysdep: -shortsetgroups */ diff --git a/mirror_runit/runit-2.1.2/src/hasshsgr.h2 b/mirror_runit/runit-2.1.2/src/hasshsgr.h2 new file mode 100644 index 0000000..5624ed0 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/hasshsgr.h2 @@ -0,0 +1,4 @@ +/* Public domain. */ + +/* sysdep: +shortsetgroups */ +#define HASSHORTSETGROUPS 1 diff --git a/mirror_runit/runit-2.1.2/src/haswaitp.h1 b/mirror_runit/runit-2.1.2/src/haswaitp.h1 new file mode 100644 index 0000000..0d6f82c --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/haswaitp.h1 @@ -0,0 +1,3 @@ +/* Public domain. */ + +/* sysdep: -waitpid */ diff --git a/mirror_runit/runit-2.1.2/src/haswaitp.h2 b/mirror_runit/runit-2.1.2/src/haswaitp.h2 new file mode 100644 index 0000000..015413f --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/haswaitp.h2 @@ -0,0 +1,4 @@ +/* Public domain. */ + +/* sysdep: +waitpid */ +#define HASWAITPID 1 diff --git a/mirror_runit/runit-2.1.2/src/iopause.c b/mirror_runit/runit-2.1.2/src/iopause.c new file mode 100644 index 0000000..ea5a426 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/iopause.c @@ -0,0 +1,78 @@ +/* Public domain. */ + +#include "taia.h" +#include "select.h" +#include "iopause.h" + +void iopause(iopause_fd *x,unsigned int len,struct taia *deadline,struct taia *stamp) +{ + struct taia t; + int millisecs; + double d; + int i; + + if (taia_less(deadline,stamp)) + millisecs = 0; + else { + t = *stamp; + taia_sub(&t,deadline,&t); + d = taia_approx(&t); + if (d > 1000.0) d = 1000.0; + millisecs = d * 1000.0 + 20.0; + } + + for (i = 0;i < len;++i) + x[i].revents = 0; + +#ifdef IOPAUSE_POLL + + poll(x,len,millisecs); + /* XXX: some kernels apparently need x[0] even if len is 0 */ + /* XXX: how to handle EAGAIN? are kernels really this dumb? */ + /* XXX: how to handle EINVAL? when exactly can this happen? */ + +#else +{ + + struct timeval tv; + fd_set rfds; + fd_set wfds; + int nfds; + int fd; + + FD_ZERO(&rfds); + FD_ZERO(&wfds); + + nfds = 1; + for (i = 0;i < len;++i) { + fd = x[i].fd; + if (fd < 0) continue; + if (fd >= 8 * sizeof(fd_set)) continue; /*XXX*/ + + if (fd >= nfds) nfds = fd + 1; + if (x[i].events & IOPAUSE_READ) FD_SET(fd,&rfds); + if (x[i].events & IOPAUSE_WRITE) FD_SET(fd,&wfds); + } + + tv.tv_sec = millisecs / 1000; + tv.tv_usec = 1000 * (millisecs % 1000); + + if (select(nfds,&rfds,&wfds,(fd_set *) 0,&tv) <= 0) + return; + /* XXX: for EBADF, could seek out and destroy the bad descriptor */ + + for (i = 0;i < len;++i) { + fd = x[i].fd; + if (fd < 0) continue; + if (fd >= 8 * sizeof(fd_set)) continue; /*XXX*/ + + if (x[i].events & IOPAUSE_READ) + if (FD_ISSET(fd,&rfds)) x[i].revents |= IOPAUSE_READ; + if (x[i].events & IOPAUSE_WRITE) + if (FD_ISSET(fd,&wfds)) x[i].revents |= IOPAUSE_WRITE; + } + +} +#endif + +} diff --git a/mirror_runit/runit-2.1.2/src/iopause.h1 b/mirror_runit/runit-2.1.2/src/iopause.h1 new file mode 100644 index 0000000..5c53de7 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/iopause.h1 @@ -0,0 +1,21 @@ +/* Public domain. */ + +#ifndef IOPAUSE_H +#define IOPAUSE_H + +/* sysdep: -poll */ + +typedef struct { + int fd; + short events; + short revents; +} iopause_fd; + +#define IOPAUSE_READ 1 +#define IOPAUSE_WRITE 4 + +#include "taia.h" + +extern void iopause(iopause_fd *,unsigned int,struct taia *,struct taia *); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/iopause.h2 b/mirror_runit/runit-2.1.2/src/iopause.h2 new file mode 100644 index 0000000..8e58452 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/iopause.h2 @@ -0,0 +1,20 @@ +/* Public domain. */ + +#ifndef IOPAUSE_H +#define IOPAUSE_H + +/* sysdep: +poll */ +#define IOPAUSE_POLL + +#include +#include + +typedef struct pollfd iopause_fd; +#define IOPAUSE_READ POLLIN +#define IOPAUSE_WRITE POLLOUT + +#include "taia.h" + +extern void iopause(iopause_fd *,unsigned int,struct taia *,struct taia *); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/lock.h b/mirror_runit/runit-2.1.2/src/lock.h new file mode 100644 index 0000000..4a96cdc --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/lock.h @@ -0,0 +1,10 @@ +/* Public domain. */ + +#ifndef LOCK_H +#define LOCK_H + +extern int lock_ex(int); +extern int lock_un(int); +extern int lock_exnb(int); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/lock_ex.c b/mirror_runit/runit-2.1.2/src/lock_ex.c new file mode 100644 index 0000000..b75a764 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/lock_ex.c @@ -0,0 +1,13 @@ +/* Public domain. */ + +#include +#include +#include +#include "hasflock.h" +#include "lock.h" + +#ifdef HASFLOCK +int lock_ex(int fd) { return flock(fd,LOCK_EX); } +#else +int lock_ex(int fd) { return lockf(fd,1,0); } +#endif diff --git a/mirror_runit/runit-2.1.2/src/lock_exnb.c b/mirror_runit/runit-2.1.2/src/lock_exnb.c new file mode 100644 index 0000000..9ec2b9c --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/lock_exnb.c @@ -0,0 +1,13 @@ +/* Public domain. */ + +#include +#include +#include +#include "hasflock.h" +#include "lock.h" + +#ifdef HASFLOCK +int lock_exnb(int fd) { return flock(fd,LOCK_EX | LOCK_NB); } +#else +int lock_exnb(int fd) { return lockf(fd,2,0); } +#endif diff --git a/mirror_runit/runit-2.1.2/src/ndelay.h b/mirror_runit/runit-2.1.2/src/ndelay.h new file mode 100644 index 0000000..dbe91b2 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/ndelay.h @@ -0,0 +1,9 @@ +/* Public domain. */ + +#ifndef NDELAY_H +#define NDELAY_H + +extern int ndelay_on(int); +extern int ndelay_off(int); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/ndelay_off.c b/mirror_runit/runit-2.1.2/src/ndelay_off.c new file mode 100644 index 0000000..92d3244 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/ndelay_off.c @@ -0,0 +1,14 @@ +/* Public domain. */ + +#include +#include +#include "ndelay.h" + +#ifndef O_NONBLOCK +#define O_NONBLOCK O_NDELAY +#endif + +int ndelay_off(int fd) +{ + return fcntl(fd,F_SETFL,fcntl(fd,F_GETFL,0) & ~O_NONBLOCK); +} diff --git a/mirror_runit/runit-2.1.2/src/ndelay_on.c b/mirror_runit/runit-2.1.2/src/ndelay_on.c new file mode 100644 index 0000000..b96a6b2 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/ndelay_on.c @@ -0,0 +1,14 @@ +/* Public domain. */ + +#include +#include +#include "ndelay.h" + +#ifndef O_NONBLOCK +#define O_NONBLOCK O_NDELAY +#endif + +int ndelay_on(int fd) +{ + return fcntl(fd,F_SETFL,fcntl(fd,F_GETFL,0) | O_NONBLOCK); +} diff --git a/mirror_runit/runit-2.1.2/src/open.h b/mirror_runit/runit-2.1.2/src/open.h new file mode 100644 index 0000000..9939663 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/open.h @@ -0,0 +1,12 @@ +/* Public domain. */ + +#ifndef OPEN_H +#define OPEN_H + +extern int open_read(const char *); +extern int open_excl(const char *); +extern int open_append(const char *); +extern int open_trunc(const char *); +extern int open_write(const char *); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/open_append.c b/mirror_runit/runit-2.1.2/src/open_append.c new file mode 100644 index 0000000..d1b241b --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/open_append.c @@ -0,0 +1,8 @@ +/* Public domain. */ + +#include +#include +#include "open.h" + +int open_append(const char *fn) +{ return open(fn,O_WRONLY | O_NDELAY | O_APPEND | O_CREAT,0600); } diff --git a/mirror_runit/runit-2.1.2/src/open_read.c b/mirror_runit/runit-2.1.2/src/open_read.c new file mode 100644 index 0000000..99b3cd1 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/open_read.c @@ -0,0 +1,8 @@ +/* Public domain. */ + +#include +#include +#include "open.h" + +int open_read(const char *fn) +{ return open(fn,O_RDONLY | O_NDELAY); } diff --git a/mirror_runit/runit-2.1.2/src/open_trunc.c b/mirror_runit/runit-2.1.2/src/open_trunc.c new file mode 100644 index 0000000..6e0c4c2 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/open_trunc.c @@ -0,0 +1,8 @@ +/* Public domain. */ + +#include +#include +#include "open.h" + +int open_trunc(const char *fn) +{ return open(fn,O_WRONLY | O_NDELAY | O_TRUNC | O_CREAT,0644); } diff --git a/mirror_runit/runit-2.1.2/src/open_write.c b/mirror_runit/runit-2.1.2/src/open_write.c new file mode 100644 index 0000000..34cfa9b --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/open_write.c @@ -0,0 +1,8 @@ +/* Public domain. */ + +#include +#include +#include "open.h" + +int open_write(const char *fn) +{ return open(fn,O_WRONLY | O_NDELAY); } diff --git a/mirror_runit/runit-2.1.2/src/openreadclose.c b/mirror_runit/runit-2.1.2/src/openreadclose.c new file mode 100644 index 0000000..635933b --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/openreadclose.c @@ -0,0 +1,18 @@ +/* Public domain. */ + +#include "error.h" +#include "open.h" +#include "readclose.h" +#include "openreadclose.h" + +int openreadclose(const char *fn,stralloc *sa,unsigned int bufsize) +{ + int fd; + fd = open_read(fn); + if (fd == -1) { + if (errno == error_noent) return 0; + return -1; + } + if (readclose(fd,sa,bufsize) == -1) return -1; + return 1; +} diff --git a/mirror_runit/runit-2.1.2/src/openreadclose.h b/mirror_runit/runit-2.1.2/src/openreadclose.h new file mode 100644 index 0000000..728899c --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/openreadclose.h @@ -0,0 +1,10 @@ +/* Public domain. */ + +#ifndef OPENREADCLOSE_H +#define OPENREADCLOSE_H + +#include "stralloc.h" + +extern int openreadclose(const char *,stralloc *,unsigned int); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/pathexec.h b/mirror_runit/runit-2.1.2/src/pathexec.h new file mode 100644 index 0000000..d46ab17 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/pathexec.h @@ -0,0 +1,11 @@ +/* Public domain. */ + +#ifndef PATHEXEC_H +#define PATHEXEC_H + +extern void pathexec_run(const char *,const char * const *,const char * const *); +extern int pathexec_env(const char *,const char *); +extern void pathexec_env_run(const char *, const char * const *); +extern void pathexec(const char * const *); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/pathexec_env.c b/mirror_runit/runit-2.1.2/src/pathexec_env.c new file mode 100644 index 0000000..1305469 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/pathexec_env.c @@ -0,0 +1,74 @@ +/* Public domain. */ + +#include "stralloc.h" +#include "alloc.h" +#include "str.h" +#include "byte.h" +#include "env.h" +#include "pathexec.h" + +static stralloc plus; +static stralloc tmp; + +int pathexec_env(const char *s,const char *t) +{ + if (!s) return 1; + if (!stralloc_copys(&tmp,s)) return 0; + if (t) { + if (!stralloc_cats(&tmp,"=")) return 0; + if (!stralloc_cats(&tmp,t)) return 0; + } + if (!stralloc_0(&tmp)) return 0; + return stralloc_cat(&plus,&tmp); +} + +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); +} + +void pathexec(const char *const *argv) +{ + return pathexec_env_run(*argv, argv); +} diff --git a/mirror_runit/runit-2.1.2/src/pathexec_run.c b/mirror_runit/runit-2.1.2/src/pathexec_run.c new file mode 100644 index 0000000..1770ac7 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/pathexec_run.c @@ -0,0 +1,48 @@ +/* Public domain. */ + +#include "error.h" +#include "stralloc.h" +#include "str.h" +#include "env.h" +#include "pathexec.h" + +static stralloc tmp; + +void pathexec_run(const char *file,const char * const *argv,const char * const *envp) +{ + const char *path; + unsigned int split; + int savederrno; + + if (file[str_chr(file,'/')]) { + execve(file,argv,envp); + return; + } + + path = env_get("PATH"); + if (!path) path = "/bin:/usr/bin"; + + savederrno = 0; + for (;;) { + split = str_chr(path,':'); + if (!stralloc_copyb(&tmp,path,split)) return; + if (!split) + if (!stralloc_cats(&tmp,".")) return; + if (!stralloc_cats(&tmp,"/")) return; + if (!stralloc_cats(&tmp,file)) return; + if (!stralloc_0(&tmp)) return; + + execve(tmp.s,argv,envp); + if (errno != error_noent) { + savederrno = errno; + if ((errno != error_acces) && (errno != error_perm) && (errno != error_isdir)) return; + } + + if (!path[split]) { + if (savederrno) errno = savederrno; + return; + } + path += split; + path += 1; + } +} diff --git a/mirror_runit/runit-2.1.2/src/pmatch.c b/mirror_runit/runit-2.1.2/src/pmatch.c new file mode 100644 index 0000000..2fc9a53 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/pmatch.c @@ -0,0 +1,40 @@ + +int pmatch(const char *p, const char *s, unsigned int len) { + for (;;) { + char c =*p++; + if (! c) return(! len); + switch(c) { + case '*': + if (! (c =*p)) return(1); + for (;;) { + if (! len) return(0); + if (*s == c) break; + ++s; --len; + } + continue; + case '+': + if ((c =*p++) != *s) return(0); + for (;;) { + if (! len) return(1); + if (*s != c) break; + ++s; --len; + } + continue; + /* + case '?': + if (*p == '?') { + if (*s != '?') return(0); + ++p; + } + ++s; --len; + continue; + */ + default: + if (! len) return(0); + if (*s != c) return(0); + ++s; --len; + continue; + } + } + return(0); +} diff --git a/mirror_runit/runit-2.1.2/src/pmatch.h b/mirror_runit/runit-2.1.2/src/pmatch.h new file mode 100644 index 0000000..8d4eb8b --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/pmatch.h @@ -0,0 +1,6 @@ +#ifndef PMATCH_H +#define PMATCH_H + +extern unsigned int pmatch(const char *, const char *, unsigned int); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/print-ar.sh b/mirror_runit/runit-2.1.2/src/print-ar.sh new file mode 100644 index 0000000..99bc116 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/print-ar.sh @@ -0,0 +1,14 @@ +cat warn-auto.sh +echo 'main="$1"; shift' +echo 'rm -f "$main"' +echo 'ar cr "$main" ${1+"$@"}' +case "`cat systype`" in + sunos-5.*) ;; + unix_sv*) ;; + irix64-*) ;; + irix-*) ;; + dgux-*) ;; + hp-ux-*) ;; + sco*) ;; + *) echo 'ranlib "$main"' ;; +esac diff --git a/mirror_runit/runit-2.1.2/src/print-cc.sh b/mirror_runit/runit-2.1.2/src/print-cc.sh new file mode 100644 index 0000000..31f4ed3 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/print-cc.sh @@ -0,0 +1,5 @@ +cc="`head -n1 conf-cc`" +systype="`cat systype`" + +cat warn-auto.sh +echo exec "$cc" '-c ${1+"$@"}' diff --git a/mirror_runit/runit-2.1.2/src/print-ld.sh b/mirror_runit/runit-2.1.2/src/print-ld.sh new file mode 100644 index 0000000..59489a8 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/print-ld.sh @@ -0,0 +1,6 @@ +ld="`head -n1 conf-ld`" +systype="`cat systype`" + +cat warn-auto.sh +echo 'main="$1"; shift' +echo exec "$ld" '-o "$main" "$main".o ${1+"$@"}' diff --git a/mirror_runit/runit-2.1.2/src/prot.c b/mirror_runit/runit-2.1.2/src/prot.c new file mode 100644 index 0000000..79a88c5 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/prot.c @@ -0,0 +1,21 @@ +/* Public domain. */ + +#include "hasshsgr.h" +#include "prot.h" + +int prot_gid(int gid) +{ +#ifdef HASSHORTSETGROUPS + short x[2]; + x[0] = gid; x[1] = 73; /* catch errors */ + if (setgroups(1,x) == -1) return -1; +#else + if (setgroups(1,&gid) == -1) return -1; +#endif + return setgid(gid); /* _should_ be redundant, but on some systems it isn't */ +} + +int prot_uid(int uid) +{ + return setuid(uid); +} diff --git a/mirror_runit/runit-2.1.2/src/prot.h b/mirror_runit/runit-2.1.2/src/prot.h new file mode 100644 index 0000000..2e5cb81 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/prot.h @@ -0,0 +1,9 @@ +/* Public domain. */ + +#ifndef PROT_H +#define PROT_H + +extern int prot_gid(int); +extern int prot_uid(int); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/readclose.c b/mirror_runit/runit-2.1.2/src/readclose.c new file mode 100644 index 0000000..9d83007 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/readclose.c @@ -0,0 +1,23 @@ +/* Public domain. */ + +#include +#include "error.h" +#include "readclose.h" + +int readclose_append(int fd,stralloc *sa,unsigned int bufsize) +{ + int r; + for (;;) { + if (!stralloc_readyplus(sa,bufsize)) { close(fd); return -1; } + r = read(fd,sa->s + sa->len,bufsize); + if (r == -1) if (errno == error_intr) continue; + if (r <= 0) { close(fd); return r; } + sa->len += r; + } +} + +int readclose(int fd,stralloc *sa,unsigned int bufsize) +{ + if (!stralloc_copys(sa,"")) { close(fd); return -1; } + return readclose_append(fd,sa,bufsize); +} diff --git a/mirror_runit/runit-2.1.2/src/readclose.h b/mirror_runit/runit-2.1.2/src/readclose.h new file mode 100644 index 0000000..bde9889 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/readclose.h @@ -0,0 +1,11 @@ +/* Public domain. */ + +#ifndef READCLOSE_H +#define READCLOSE_H + +#include "stralloc.h" + +extern int readclose_append(int,stralloc *,unsigned int); +extern int readclose(int,stralloc *,unsigned int); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/reboot_system.h1 b/mirror_runit/runit-2.1.2/src/reboot_system.h1 new file mode 100644 index 0000000..d4950c9 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/reboot_system.h1 @@ -0,0 +1,8 @@ +#include +#include + +/* sysdep: -std reboot */ + +int reboot_system(int what) { + return(reboot(what, (char *)0)); +} diff --git a/mirror_runit/runit-2.1.2/src/reboot_system.h2 b/mirror_runit/runit-2.1.2/src/reboot_system.h2 new file mode 100644 index 0000000..b30d1e9 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/reboot_system.h2 @@ -0,0 +1,8 @@ +#include +#include + +/* sysdep: +std reboot */ + +int reboot_system(int what) { + return(reboot(what)); +} diff --git a/mirror_runit/runit-2.1.2/src/runit-init.c b/mirror_runit/runit-2.1.2/src/runit-init.c new file mode 100644 index 0000000..00dc3c9 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runit-init.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include "runit.h" +#include "strerr.h" +#include "sig.h" +#include "open.h" +#include "error.h" + +#define USAGE " 0|6" +#define FATAL "init: fatal: " +/* #define WARNING "init: warning: " */ + +const char *progname; + +void usage(void) { strerr_die4x(0, "usage: ", progname, USAGE, "\n"); } + +void runit_halt () { + if (open_trunc(STOPIT) == -1) + strerr_die4sys(111, FATAL, "unable to create ", STOPIT, ": "); + if (chmod(STOPIT, 0100) == -1) + strerr_die4sys(111, FATAL, "unable to chmod ", STOPIT, ": "); + if (chmod(REBOOT, 0) == -1) + if (errno != error_noent) + strerr_die4sys(111, FATAL, "unable to chmod ", REBOOT, ": "); + kill(1, sig_cont); + _exit(0); +} + +void runit_reboot () { + if (open_trunc(STOPIT) == -1) + strerr_die4sys(111, FATAL, "unable to create ", STOPIT, ": "); + if (chmod(STOPIT, 0100) == -1) + strerr_die4sys(111, FATAL, "unable to chmod ", STOPIT, ": "); + if (open_trunc(REBOOT) == -1) + strerr_die4sys(111, FATAL, "unable to create ", REBOOT, ": "); + if (chmod(REBOOT, 0100) == -1) + strerr_die4sys(111, FATAL, "unable to chmod ", REBOOT, ": "); + kill(1, sig_cont); + _exit(0); +} + +int main (int argc, const char * const *argv, char * const *envp) { + const char *prog[2]; + + progname =*argv++; + + if (getpid() == 1) { + prog[1] =0; + prog[0] ="runit"; + + /* kernel is starting init, runit does the job. */ + execve(RUNIT, (char *const *)prog, envp); + + /* serious error */ + strerr_die4sys(111, FATAL, "unable to start ", prog[0], ": "); + } + + if (! *argv || ! **argv) usage(); + switch (**argv) { + case '0': + runit_halt(); + break; + case '6': + runit_reboot(); + break; + case '-': + if ((*argv)[1] == 'V') + strerr_warn1("$Id: f075d98bf7dd17c893021f9572cbb970cdad8dcf $\n", 0); + default: + usage(); + } + /* not reached */ + _exit(0); +} diff --git a/mirror_runit/runit-2.1.2/src/runit-init.check b/mirror_runit/runit-2.1.2/src/runit-init.check new file mode 100755 index 0000000..088e833 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runit-init.check @@ -0,0 +1,3 @@ +#!/bin/sh +runit-init +echo $? diff --git a/mirror_runit/runit-2.1.2/src/runit-init.dist b/mirror_runit/runit-2.1.2/src/runit-init.dist new file mode 100644 index 0000000..cca0307 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runit-init.dist @@ -0,0 +1,3 @@ +usage: runit-init 0|6 + +0 diff --git a/mirror_runit/runit-2.1.2/src/runit.c b/mirror_runit/runit-2.1.2/src/runit.c new file mode 100644 index 0000000..48620b3 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runit.c @@ -0,0 +1,346 @@ +#include +#include +#include +#include +#include +#include +#include +#include "runit.h" +#include "sig.h" +#include "strerr.h" +#include "error.h" +#include "iopause.h" +#include "coe.h" +#include "ndelay.h" +#include "wait.h" +#include "open.h" +#include "reboot_system.h" + +/* #define DEBUG */ + +#define INFO "- runit: " +#define WARNING "- runit: warning: " +#define FATAL "- runit: fatal: " + +const char * const stage[3] ={ + "/etc/runit/1", + "/etc/runit/2", + "/etc/runit/3" }; + +int selfpipe[2]; +int sigc =0; +int sigi =0; + +void sig_cont_handler (void) { + sigc++; + write(selfpipe[1], "", 1); +} +void sig_int_handler (void) { + sigi++; + write(selfpipe[1], "", 1); +} +void sig_child_handler (void) { write(selfpipe[1], "", 1); } + +int main (int argc, const char * const *argv, char * const *envp) { + const char * prog[2]; + int pid, pid2; + int wstat; + int st; + iopause_fd x; +#ifndef IOPAUSE_POLL + fd_set rfds; + struct timeval t; +#endif + char ch; + int ttyfd; + struct stat s; + + if (getpid() != 1) strerr_die2x(111, FATAL, "must be run as process no 1."); + setsid(); + + sig_block(sig_alarm); + sig_block(sig_child); + sig_catch(sig_child, sig_child_handler); + sig_block(sig_cont); + sig_catch(sig_cont, sig_cont_handler); + sig_block(sig_hangup); + sig_block(sig_int); + sig_catch(sig_int, sig_int_handler); + sig_block(sig_pipe); + sig_block(sig_term); + + /* console */ + if ((ttyfd =open_write("/dev/console")) != -1) { + dup2(ttyfd, 0); dup2(ttyfd, 1); dup2(ttyfd, 2); + if (ttyfd > 2) close(ttyfd); + } + + /* create selfpipe */ + while (pipe(selfpipe) == -1) { + strerr_warn2(FATAL, "unable to create selfpipe, pausing: ", &strerr_sys); + sleep(5); + } + coe(selfpipe[0]); + coe(selfpipe[1]); + ndelay_on(selfpipe[0]); + ndelay_on(selfpipe[1]); + +#ifdef RB_DISABLE_CAD + /* activate ctrlaltdel handling, glibc, dietlibc */ + if (RB_DISABLE_CAD == 0) reboot_system(0); +#endif + + strerr_warn3(INFO, "$Id: 25da3b86f7bed4038b8a039d2f8e8c9bbcf0822b $", + ": booting.", 0); + + /* runit */ + for (st =0; st < 3; st++) { + /* if (st == 2) logwtmp("~", "reboot", ""); */ + while ((pid =fork()) == -1) { + strerr_warn4(FATAL, "unable to fork for \"", stage[st], "\" pausing: ", + &strerr_sys); + sleep(5); + } + if (!pid) { + /* child */ + prog[0] =stage[st]; + prog[1] =0; + + /* stage 1 gets full control of console */ + if (st == 0) { + if ((ttyfd =open("/dev/console", O_RDWR)) != -1) { +#ifdef TIOCSCTTY + ioctl(ttyfd, TIOCSCTTY, (char *)0); +#endif + dup2(ttyfd, 0); + if (ttyfd > 2) close(ttyfd); + } + else + strerr_warn2(WARNING, "unable to open /dev/console: ", &strerr_sys); + } + else + setsid(); + + sig_unblock(sig_alarm); + sig_unblock(sig_child); + sig_uncatch(sig_child); + sig_unblock(sig_cont); + sig_ignore(sig_cont); + sig_unblock(sig_hangup); + sig_unblock(sig_int); + sig_uncatch(sig_int); + sig_unblock(sig_pipe); + sig_unblock(sig_term); + + strerr_warn3(INFO, "enter stage: ", stage[st], 0); + execve(*prog, (char *const *)prog, envp); + strerr_die4sys(0, FATAL, "unable to start child: ", stage[st], ": "); + } + + x.fd =selfpipe[0]; + x.events =IOPAUSE_READ; + for (;;) { + int child; + + sig_unblock(sig_child); + sig_unblock(sig_cont); + sig_unblock(sig_int); +#ifdef IOPAUSE_POLL + poll(&x, 1, 14000); +#else + t.tv_sec =14; t.tv_usec =0; + FD_ZERO(&rfds); + FD_SET(x.fd, &rfds); + select(x.fd +1, &rfds, (fd_set*)0, (fd_set*)0, &t); +#endif + sig_block(sig_cont); + sig_block(sig_child); + sig_block(sig_int); + + while (read(selfpipe[0], &ch, 1) == 1) {} + while ((child =wait_nohang(&wstat)) > 0) + if (child == pid) break; + if (child == -1) { + strerr_warn2(WARNING, "wait_nohang, pausing: ", &strerr_sys); + sleep(5); + } + + /* reget stderr */ + if ((ttyfd =open_write("/dev/console")) != -1) { + dup2(ttyfd, 2); + if (ttyfd > 2) close(ttyfd); + } + + if (child == pid) { + if (wait_exitcode(wstat) != 0) { + if (wait_crashed(wstat)) + strerr_warn3(WARNING, "child crashed: ", stage[st], 0); + else + strerr_warn3(WARNING, "child failed: ", stage[st], 0); + if (st == 0) + /* this is stage 1 */ + if (wait_crashed(wstat) || (wait_exitcode(wstat) == 100)) { + strerr_warn3(INFO, "leave stage: ", stage[st], 0); + strerr_warn2(WARNING, "skipping stage 2...", 0); + st++; + break; + } + if (st == 1) + /* this is stage 2 */ + if (wait_crashed(wstat) || (wait_exitcode(wstat) == 111)) { + strerr_warn2(WARNING, "killing all processes in stage 2...", 0); + kill(-pid, 9); + sleep(5); + strerr_warn2(WARNING, "restarting.", 0); + st--; + break; + } + } + strerr_warn3(INFO, "leave stage: ", stage[st], 0); + break; + } + if (child != 0) { + /* collect terminated children */ + write(selfpipe[1], "", 1); + continue; + } + + /* sig? */ + if (!sigc && !sigi) { +#ifdef DEBUG + strerr_warn2(WARNING, "poll: ", &strerr_sys); +#endif + continue; + } + if (st != 1) { + strerr_warn2(WARNING, "signals only work in stage 2.", 0); + sigc =sigi =0; + continue; + } + if (sigi && (stat(CTRLALTDEL, &s) != -1) && (s.st_mode & S_IXUSR)) { + strerr_warn2(INFO, "ctrl-alt-del request...", 0); + prog[0] =CTRLALTDEL; prog[1] =0; + while ((pid2 =fork()) == -1) { + strerr_warn4(FATAL, "unable to fork for \"", CTRLALTDEL, + "\" pausing: ", &strerr_sys); + sleep(5); + } + if (!pid2) { + /* child */ + strerr_warn3(INFO, "enter stage: ", prog[0], 0); + execve(*prog, (char *const *) prog, envp); + strerr_die4sys(0, FATAL, "unable to start child: ", prog[0], ": "); + } + if (wait_pid(&wstat, pid2) == -1) + strerr_warn2(FATAL, "wait_pid: ", &strerr_sys); + if (wait_crashed(wstat)) + strerr_warn3(WARNING, "child crashed: ", CTRLALTDEL, 0); + strerr_warn3(INFO, "leave stage: ", prog[0], 0); + sigi =0; + sigc++; + } + if (sigc && (stat(STOPIT, &s) != -1) && (s.st_mode & S_IXUSR)) { + int i; + /* unlink(STOPIT); */ + chmod(STOPIT, 0); + + /* kill stage 2 */ +#ifdef DEBUG + strerr_warn2(WARNING, "sending sigterm...", 0); +#endif + kill(pid, sig_term); + i =0; + while (i < 5) { + if ((child =wait_nohang(&wstat)) == pid) { +#ifdef DEBUG + strerr_warn2(WARNING, "stage 2 terminated.", 0); +#endif + pid =0; + break; + } + if (child) continue; + if (child == -1) + strerr_warn2(WARNING, "wait_nohang: ", &strerr_sys); +#ifdef DEBUG + strerr_warn2(WARNING, "waiting...", 0); +#endif + sleep(1); + i++; + } + if (pid) { + /* still there */ + strerr_warn2(WARNING, + "stage 2 not terminated, sending sigkill...", 0); + kill(pid, 9); + if (wait_pid(&wstat, pid) == -1) + strerr_warn2(WARNING, "wait_pid: ", &strerr_sys); + } + sigc =0; + strerr_warn3(INFO, "leave stage: ", stage[st], 0); + + /* enter stage 3 */ + break; + } + sigc =sigi =0; +#ifdef DEBUG + strerr_warn2(WARNING, "no request.", 0); +#endif + } + } + + /* 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); + kill(-1, SIGKILL); + + pid =fork(); + switch (pid) { + case 0: + case -1: + if ((stat(REBOOT, &s) != -1) && (s.st_mode & S_IXUSR)) { + strerr_warn2(INFO, "system reboot.", 0); + sync(); + reboot_system(RB_AUTOBOOT); + } + else { +#ifdef RB_POWER_OFF + strerr_warn2(INFO, "power off...", 0); + sync(); + reboot_system(RB_POWER_OFF); + sleep(2); +#endif +#ifdef RB_HALT_SYSTEM + strerr_warn2(INFO, "system halt.", 0); + 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); + sync(); + reboot_system(RB_AUTOBOOT); +#endif +#endif + } + if (pid == 0) _exit(0); + break; + default: + sig_unblock(sig_child); + while (wait_pid(0, pid) == -1); + } +#endif + + for (;;) sig_pause(); + /* not reached */ + strerr_die2x(0, INFO, "exit."); + return(0); +} diff --git a/mirror_runit/runit-2.1.2/src/runit.check b/mirror_runit/runit-2.1.2/src/runit.check new file mode 100755 index 0000000..87f02d3 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runit.check @@ -0,0 +1,3 @@ +#!/bin/sh +runit +echo $? diff --git a/mirror_runit/runit-2.1.2/src/runit.dist b/mirror_runit/runit-2.1.2/src/runit.dist new file mode 100644 index 0000000..135c411 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runit.dist @@ -0,0 +1,2 @@ +- runit: fatal: must be run as process no 1. +111 diff --git a/mirror_runit/runit-2.1.2/src/runit.h b/mirror_runit/runit-2.1.2/src/runit.h new file mode 100644 index 0000000..ba98386 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runit.h @@ -0,0 +1,4 @@ +#define RUNIT "/sbin/runit" +#define STOPIT "/etc/runit/stopit" +#define REBOOT "/etc/runit/reboot" +#define CTRLALTDEL "/etc/runit/ctrlaltdel" diff --git a/mirror_runit/runit-2.1.2/src/runsv.c b/mirror_runit/runit-2.1.2/src/runsv.c new file mode 100644 index 0000000..0de2803 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runsv.c @@ -0,0 +1,607 @@ +#include +#include +#include +#include +#include +#include "strerr.h" +#include "error.h" +#include "taia.h" +#include "sig.h" +#include "env.h" +#include "coe.h" +#include "ndelay.h" +#include "fifo.h" +#include "open.h" +#include "lock.h" +#include "iopause.h" +#include "wait.h" +#include "fd.h" +#include "buffer.h" +#include "fmt.h" +#include "byte.h" + +#define USAGE " dir" + +#define VERSION "$Id: ecf467746d7b97ff0fddb88b9d44cca201c74160 $" + +char *progname; +int selfpipe[2]; + +/* state */ +#define S_DOWN 0 +#define S_RUN 1 +#define S_FINISH 2 +/* ctrl */ +#define C_NOOP 0 +#define C_TERM 1 +#define C_PAUSE 2 +/* want */ +#define W_UP 0 +#define W_DOWN 1 +#define W_EXIT 2 + +struct svdir { + int pid; + int state; + int ctrl; + int want; + struct taia start; + int wstat; + int fdlock; + int fdcontrol; + int fdcontrolwrite; + int islog; +}; +struct svdir svd[2]; + +int sigterm =0; +int haslog =0; +int pidchanged =1; +int logpipe[2]; +char *dir; + +void usage () { strerr_die4x(1, "usage: ", progname, USAGE, "\n"); } + +void fatal(char *m) { + strerr_die5sys(111, "runsv ", dir, ": fatal: ", 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); +} +void warn2(char *m1, char *m2) { + strerr_warn6("runsv ", dir, ": warning: ", m1, m2, ": ", &strerr_sys); +} +void warnx(char *m1, char *m2, char *m3) { + strerr_warn6("runsv ", dir, ": warning: ", m1, m2, m3, 0); +} + +void stopservice(struct svdir *); + +void s_child() { write(selfpipe[1], "", 1); } +void s_term() { + sigterm =1; + write(selfpipe[1], "", 1); /* XXX */ +} + +void update_status(struct svdir *s) { + unsigned long l; + int fd; + char status[20]; + char bspace[64]; + buffer b; + char spid[FMT_ULONG]; + char *fstatus ="supervise/status"; + char *fstatusnew ="supervise/status.new"; + char *fstat ="supervise/stat"; + char *fstatnew ="supervise/stat.new"; + char *fpid ="supervise/pid"; + char *fpidnew ="supervise/pid.new"; + + if (s->islog) { + fstatus ="log/supervise/status"; + fstatusnew ="log/supervise/status.new"; + fstat ="log/supervise/stat"; + fstatnew ="log/supervise/stat.new"; + fpid ="log/supervise/pid"; + fpidnew ="log/supervise/pid.new"; + } + + /* pid */ + if (pidchanged) { + if ((fd =open_trunc(fpidnew)) == -1) { + warn2("unable to open ", fpidnew); + return; + } + buffer_init(&b, buffer_unixwrite, fd, bspace, sizeof bspace); + spid[fmt_ulong(spid, (unsigned long)s->pid)] =0; + if (s->pid) { + buffer_puts(&b, spid); + buffer_puts(&b, "\n"); + buffer_flush(&b); + } + close(fd); + if (rename(fpidnew, fpid) == -1) { + warn2("unable to rename pid.new to ", fpid); + return; + } + pidchanged =0; + } + + /* stat */ + if ((fd =open_trunc(fstatnew)) == -1) { + warn2("unable to open ", fstatnew); + return; + } + buffer_init(&b, buffer_unixwrite, fd, bspace, sizeof bspace); + switch (s->state) { + case S_DOWN: + buffer_puts(&b, "down"); + break; + case S_RUN: + buffer_puts(&b, "run"); + break; + case S_FINISH: + buffer_puts(&b, "finish"); + break; + } + if (s->ctrl & C_PAUSE) buffer_puts(&b, ", paused"); + if (s->ctrl & C_TERM) buffer_puts(&b, ", got TERM"); + if (s->state != S_DOWN) + switch(s->want) { + case W_DOWN: + buffer_puts(&b, ", want down"); + break; + case W_EXIT: + buffer_puts(&b, ", want exit"); + break; + } + buffer_puts(&b, "\n"); + buffer_flush(&b); + close(fd); + if (rename(fstatnew, fstat) == -1) + warn2("unable to rename stat.new to ", fstat); + + /* supervise compatibility */ + taia_pack(status, &s->start); + l =(unsigned long)s->pid; + status[12] =l; l >>=8; + status[13] =l; l >>=8; + status[14] =l; l >>=8; + status[15] =l; + if (s->ctrl & C_PAUSE) + status[16] =1; + else + status[16] =0; + if (s->want == W_UP) + status[17] ='u'; + else + status[17] ='d'; + if (s->ctrl & C_TERM) + status[18] =1; + else + status[18] =0; + status[19] =s->state; + if ((fd =open_trunc(fstatusnew)) == -1) { + warn2("unable to open ", fstatusnew); + return; + } + if ((l =write(fd, status, sizeof status)) == -1) { + warn2("unable to write ", fstatusnew); + close(fd); + unlink(fstatusnew); + return; + } + close(fd); + if (l < sizeof status) { + warnx("unable to write ", fstatusnew, ": partial write."); + return; + } + if (rename(fstatusnew, fstatus) == -1) + warn2("unable to rename status.new to ", fstatus); +} +unsigned int custom(struct svdir *s, char c) { + int pid; + int w; + char a[10]; + struct stat st; + char *prog[2]; + + if (s->islog) return(0); + byte_copy(a, 10, "control/?"); + a[8] =c; + if (stat(a, &st) == 0) { + if (st.st_mode & S_IXUSR) { + if ((pid =fork()) == -1) { + warn2("unable to fork for ", a); + return(0); + } + if (! pid) { + if (haslog && fd_copy(1, logpipe[1]) == -1) + warn2("unable to setup stdout for ", a); + prog[0] =a; + prog[1] =0; + execve(a, prog, environ); + fatal("unable to run control/?"); + } + while (wait_pid(&w, pid) == -1) { + if (errno == error_intr) continue; + warn2("unable to wait for child ", a); + return(0); + } + return(! wait_exitcode(w)); + } + } + else { + if (errno == error_noent) return(0); + warn2("unable to stat ", a); + } + return(0); +} +void stopservice(struct svdir *s) { + if (s->pid && ! custom(s, 't')) { + kill(s->pid, SIGTERM); + s->ctrl |=C_TERM; + update_status(s); + } + if (s->want == W_DOWN) { + kill(s->pid, SIGCONT); + custom(s, 'd'); return; + } + if (s->want == W_EXIT) { + kill(s->pid, SIGCONT); + custom(s, 'x'); + } +} + +void startservice(struct svdir *s) { + int p; + char *run[4]; + char code[FMT_ULONG]; + char stat[FMT_ULONG]; + + if (s->state == S_FINISH) { + run[0] ="./finish"; + code[fmt_ulong(code, wait_exitcode(s->wstat))] =0; + run[1] =wait_crashed(s->wstat) ? "-1" : code; + stat[fmt_ulong(stat, s->wstat & 0xff)] =0; + run[2] =stat; + run[3] =0; + } + else { + run[0] ="./run"; + custom(s, 'u'); + run[1] =0; + } + + if (s->pid != 0) stopservice(s); /* should never happen */ + while ((p =fork()) == -1) { + warn("unable to fork, sleeping"); + sleep(5); + } + if (p == 0) { + /* child */ + if (haslog) { + if (s->islog) { + if (fd_copy(0, logpipe[0]) == -1) + fatal("unable to setup filedescriptor for ./log/run"); + close(logpipe[1]); + if (chdir("./log") == -1) + fatal("unable to change directory to ./log"); + } + else { + if (fd_copy(1, logpipe[1]) == -1) + fatal("unable to setup filedescriptor for ./run"); + close(logpipe[0]); + } + } + sig_uncatch(sig_child); + sig_unblock(sig_child); + sig_uncatch(sig_term); + sig_unblock(sig_term); + execve(*run, run, environ); + if (s->islog) + fatal2("unable to start log/", *run); + else + fatal2("unable to start ", *run); + } + if (s->state != S_FINISH) { + taia_now(&s->start); + s->state =S_RUN; + } + s->pid =p; + pidchanged =1; + s->ctrl =C_NOOP; + update_status(s); +} +int ctrl(struct svdir *s, char c) { + switch(c) { + case 'd': /* down */ + s->want =W_DOWN; + update_status(s); + if (s->state == S_RUN) stopservice(s); + break; + case 'u': /* up */ + s->want =W_UP; + update_status(s); + if (s->state == S_DOWN) startservice(s); + break; + case 'x': /* exit */ + if (s->islog) break; + s->want =W_EXIT; + update_status(s); + if (s->state == S_RUN) stopservice(s); + break; + case 't': /* sig term */ + if (s->state == S_RUN) stopservice(s); + break; + case 'k': /* sig kill */ + if ((s->state == S_RUN) && ! custom(s, c)) kill(s->pid, SIGKILL); + s->state =S_DOWN; + break; + case 'p': /* sig pause */ + if ((s->state == S_RUN) && ! custom(s, c)) kill(s->pid, SIGSTOP); + s->ctrl |=C_PAUSE; + update_status(s); + break; + case 'c': /* sig cont */ + if ((s->state == S_RUN) && ! custom(s, c)) kill(s->pid, SIGCONT); + if (s->ctrl & C_PAUSE) s->ctrl &=~C_PAUSE; + update_status(s); + break; + case 'o': /* once */ + s->want =W_DOWN; + update_status(s); + if (s->state == S_DOWN) startservice(s); + break; + case 'a': /* sig alarm */ + if ((s->state == S_RUN) && ! custom(s, c)) kill(s->pid, SIGALRM); + break; + case 'h': /* sig hup */ + if ((s->state == S_RUN) && ! custom(s, c)) kill(s->pid, SIGHUP); + break; + case 'i': /* sig int */ + if ((s->state == S_RUN) && ! custom(s, c)) kill(s->pid, SIGINT); + break; + case 'q': /* sig quit */ + if ((s->state == S_RUN) && ! custom(s, c)) kill(s->pid, SIGQUIT); + break; + case '1': /* sig usr1 */ + if ((s->state == S_RUN) && ! custom(s, c)) kill(s->pid, SIGUSR1); + break; + case '2': /* sig usr2 */ + if ((s->state == S_RUN) && ! custom(s, c)) kill(s->pid, SIGUSR2); + break; + } + return(1); +} + +int main(int argc, char **argv) { + struct stat s; + int fd; + int r; + char buf[256]; + + progname =argv[0]; + if (! argv[1] || argv[2]) usage(); + dir =argv[1]; + + if (pipe(selfpipe) == -1) fatal("unable to create selfpipe"); + coe(selfpipe[0]); + coe(selfpipe[1]); + ndelay_on(selfpipe[0]); + ndelay_on(selfpipe[1]); + + sig_block(sig_child); + sig_catch(sig_child, s_child); + sig_block(sig_term); + sig_catch(sig_term, s_term); + + if (chdir(dir) == -1) fatal("unable to change to directory"); + svd[0].pid =0; + svd[0].state =S_DOWN; + svd[0].ctrl =C_NOOP; + svd[0].want =W_UP; + svd[0].islog =0; + svd[1].pid =0; + taia_now(&svd[0].start); + if (stat("down", &s) != -1) svd[0].want =W_DOWN; + + if (stat("log", &s) == -1) { + if (errno != error_noent) + warn("unable to stat() ./log: "); + } + else { + if (! S_ISDIR(s.st_mode)) + warnx("./log", 0, ": not a directory."); + else { + haslog =1; + svd[1].state =S_DOWN; + svd[1].ctrl =C_NOOP; + svd[1].want =W_UP; + svd[1].islog =1; + taia_now(&svd[1].start); + if (stat("log/down", &s) != -1) + svd[1].want =W_DOWN; + if (pipe(logpipe) == -1) + fatal("unable to create log pipe"); + coe(logpipe[0]); + coe(logpipe[1]); + } + } + + if (mkdir("supervise", 0700) == -1) { + if ((r =readlink("supervise", buf, 256)) != -1) { + if (r == 256) + fatalx("unable to readlink ./supervise: ", "name too long"); + buf[r] =0; + mkdir(buf, 0700); + } + else { + if ((errno != ENOENT) && (errno != EINVAL)) + fatal("unable to readlink ./supervise"); + } + } + if ((svd[0].fdlock =open_append("supervise/lock")) == -1) + fatal("unable to open supervise/lock"); + if (lock_exnb(svd[0].fdlock) == -1) fatal("unable to lock supervise/lock"); + coe(svd[0].fdlock); + if (haslog) { + if (mkdir("log/supervise", 0700) == -1) { + if ((r =readlink("log/supervise", buf, 256)) != -1) { + if (r == 256) + fatalx("unable to readlink ./log/supervise: ", "name too long"); + buf[r] =0; + if ((fd =open_read(".")) == -1) + fatal("unable to open current directory"); + if (chdir("./log") == -1) + fatal("unable to change directory to ./log"); + mkdir(buf, 0700); + if (fchdir(fd) == -1) + fatal("unable to change back to service directory"); + close(fd); + } + else { + if ((errno != ENOENT) && (errno != EINVAL)) + fatal("unable to readlink ./log/supervise"); + } + } + if ((svd[1].fdlock =open_append("log/supervise/lock")) == -1) + fatal("unable to open log/supervise/lock"); + if (lock_ex(svd[1].fdlock) == -1) + fatal("unable to lock log/supervise/lock"); + coe(svd[1].fdlock); + } + + fifo_make("supervise/control", 0600); + if (stat("supervise/control", &s) == -1) + fatal("unable to stat supervise/control"); + if (!S_ISFIFO(s.st_mode)) + fatalx("supervise/control exists but is not a fifo", ""); + if ((svd[0].fdcontrol =open_read("supervise/control")) == -1) + fatal("unable to open supervise/control"); + coe(svd[0].fdcontrol); + if ((svd[0].fdcontrolwrite =open_write("supervise/control")) == -1) + fatal("unable to open supervise/control"); + coe(svd[0].fdcontrolwrite); + update_status(&svd[0]); + if (haslog) { + fifo_make("log/supervise/control", 0600); + if (stat("supervise/control", &s) == -1) + fatal("unable to stat log/supervise/control"); + if (!S_ISFIFO(s.st_mode)) + fatalx("log/supervise/control exists but is not a fifo", ""); + if ((svd[1].fdcontrol =open_read("log/supervise/control")) == -1) + fatal("unable to open log/supervise/control"); + coe(svd[1].fdcontrol); + if ((svd[1].fdcontrolwrite =open_write("log/supervise/control")) == -1) + fatal("unable to open log/supervise/control"); + coe(svd[1].fdcontrolwrite); + update_status(&svd[1]); + } + fifo_make("supervise/ok",0600); + if ((fd =open_read("supervise/ok")) == -1) + fatal("unable to read supervise/ok"); + coe(fd); + if (haslog) { + fifo_make("log/supervise/ok",0600); + if ((fd =open_read("log/supervise/ok")) == -1) + fatal("unable to read log/supervise/ok"); + coe(fd); + } + for (;;) { + iopause_fd x[3]; + struct taia deadline; + struct taia now; + char ch; + + if (haslog) + if (! svd[1].pid && (svd[1].want == W_UP)) startservice(&svd[1]); + if (! svd[0].pid) + if ((svd[0].want == W_UP) || (svd[0].state == S_FINISH)) + startservice(&svd[0]); + + x[0].fd =selfpipe[0]; + x[0].events =IOPAUSE_READ; + x[1].fd =svd[0].fdcontrol; + x[1].events =IOPAUSE_READ; + if (haslog) { + x[2].fd =svd[1].fdcontrol; + x[2].events =IOPAUSE_READ; + } + taia_now(&now); + taia_uint(&deadline, 3600); + taia_add(&deadline, &now, &deadline); + + sig_unblock(sig_term); + sig_unblock(sig_child); + iopause(x, 2 +haslog, &deadline, &now); + sig_block(sig_term); + sig_block(sig_child); + + while (read(selfpipe[0], &ch, 1) == 1) + ; + for (;;) { + int child; + int wstat; + + child =wait_nohang(&wstat); + if (!child) break; + if ((child == -1) && (errno != error_intr)) break; + if (child == svd[0].pid) { + svd[0].pid =0; + pidchanged =1; + svd[0].wstat =wstat; + svd[0].ctrl &=~C_TERM; + if (svd[0].state != S_FINISH) + if ((fd =open_read("finish")) != -1) { + close(fd); + svd[0].state =S_FINISH; + update_status(&svd[0]); + continue; + } + svd[0].state =S_DOWN; + taia_uint(&deadline, 1); + taia_add(&deadline, &svd[0].start, &deadline); + taia_now(&svd[0].start); + update_status(&svd[0]); + if (taia_less(&svd[0].start, &deadline)) sleep(1); + } + if (haslog) { + if (child == svd[1].pid) { + svd[1].pid =0; + pidchanged =1; + svd[1].state =S_DOWN; + svd[1].ctrl &=~C_TERM; + taia_uint(&deadline, 1); + taia_add(&deadline, &svd[1].start, &deadline); + taia_now(&svd[1].start); + update_status(&svd[1]); + if (taia_less(&svd[1].start, &deadline)) sleep(1); + } + } + } + if (read(svd[0].fdcontrol, &ch, 1) == 1) ctrl(&svd[0], ch); + if (haslog) + if (read(svd[1].fdcontrol, &ch, 1) == 1) ctrl(&svd[1], ch); + + if (sigterm) { ctrl(&svd[0], 'x'); sigterm =0; } + + if ((svd[0].want == W_EXIT) && (svd[0].state == S_DOWN)) { + if (svd[1].pid == 0) _exit(0); + if (svd[1].want != W_EXIT) { + svd[1].want =W_EXIT; + /* stopservice(&svd[1]); */ + update_status(&svd[1]); + if (close(logpipe[1]) == -1) warn("unable to close logpipe[1]"); + if (close(logpipe[0]) == -1) warn("unable to close logpipe[0]"); + } + } + } + _exit(0); +} diff --git a/mirror_runit/runit-2.1.2/src/runsv.check b/mirror_runit/runit-2.1.2/src/runsv.check new file mode 100755 index 0000000..edfd0c9 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runsv.check @@ -0,0 +1,59 @@ +#!/bin/sh +rm -rf "${ctmp}" + +runsv +echo $? + +mkdir "${ctmp}" +echo '#!/bin/sh' >"${ctmp}"/run +echo 'echo starting' >>"${ctmp}"/run +echo 'exec sleep 14' >>"${ctmp}"/run +chmod 700 "${ctmp}"/run +runsv "${ctmp}" & +sleep 1 +test -r "${ctmp}"/supervise/stat || sleep 2 +cat "${ctmp}"/supervise/stat +mkdir -p "${ctmp}"/control +echo '#!/bin/sh' >"${ctmp}"/control/t +echo 'echo term' >>"${ctmp}"/control/t +echo 'exit 1' >>"${ctmp}"/control/t +chmod 700 "${ctmp}"/control/t +echo t >"${ctmp}"/supervise/control +sleep 2 +echo x >"${ctmp}"/supervise/control +wait +echo $? + +mkdir "${ctmp}"/log +echo '#!/bin/sh' >"${ctmp}"/log/run +echo 'exec cat >foo' >>"${ctmp}"/log/run +chmod 700 "${ctmp}"/log/run +runsv "${ctmp}" & +sleep 1 +test -r "${ctmp}"/log/supervise/stat || sleep 2 +mkdir -p "${ctmp}"/control +echo '#!/bin/sh' >"${ctmp}"/control/i +echo 'echo no interrupt' >>"${ctmp}"/control/i +echo 'exit 0' >>"${ctmp}"/control/i +chmod 700 "${ctmp}"/control/i +echo i >"${ctmp}"/supervise/control +sleep 1 +echo x >"${ctmp}"/supervise/control +wait +echo $? +cat "${ctmp}"/log/foo + +rm -rf "${ctmp}"/supervise +rm -rf "${ctmp}"/log/supervise +rm -f "${ctmp}"/log/foo +ln -s foo "${ctmp}"/supervise +ln -s bar "${ctmp}"/log/supervise +runsv "${ctmp}" & +sleep 1 +test -r "${ctmp}"/supervise/stat || sleep 2 +test -r "${ctmp}"/log/supervise/stat || sleep 2 +echo x >"${ctmp}"/foo/control +wait +echo $? +cat "${ctmp}"/log/foo +rm -rf "${ctmp}" diff --git a/mirror_runit/runit-2.1.2/src/runsv.dist b/mirror_runit/runit-2.1.2/src/runsv.dist new file mode 100644 index 0000000..d2b05b7 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runsv.dist @@ -0,0 +1,16 @@ +usage: runsv dir + +1 +starting +run +term +starting +term +0 +0 +starting +no interrupt +term +0 +starting +term diff --git a/mirror_runit/runit-2.1.2/src/runsvchdir.c b/mirror_runit/runit-2.1.2/src/runsvchdir.c new file mode 100644 index 0000000..fe7e987 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runsvchdir.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include "strerr.h" +#include "error.h" +#include "buffer.h" + +#define USAGE " dir" +#define SVDIR "/etc/runit/runsvdir" + +#define VERSION "$Id: 9bf17f77e33c6b961e060aacffa3c8abd38fc64a $" + +char *progname; +char *new; + +void usage () { strerr_die4x(1, "usage: ", progname, USAGE, "\n"); } + +void fatal(char *m1, char *m2) { + strerr_die5sys(111, progname, ": fatal: ", m1, m2, ": "); +} +void fatalx(char *m1, char *m2) { + strerr_die4x(111, progname, ": fatal: ", m1, m2); +} +void warn(char *m1, char *m2) { + strerr_warn5(progname, ": fatal: ", m1, m2, ": ", &strerr_sys); +} + +int main (int argc, char **argv) { + struct stat s; + int dev; + int ino; + + progname =*argv++; + if (! argv || ! *argv) usage(); + + new =*argv; + if (new[0] == '.') fatalx(new, ": must not start with a dot."); + if (chdir(SVDIR) == -1) fatal("unable to chdir: ", SVDIR); + + if (stat(new, &s) == -1) { + if (errno == error_noent) fatal(new, 0); + fatal("unable to stat: ", new); + } + if (! S_ISDIR(s.st_mode)) fatalx(new, "not a directory."); + ino =s.st_ino; + dev =s.st_dev; + if (stat("current", &s) == -1) fatal("unable to stat: ", "current"); + if ((s.st_ino == ino) && (s.st_dev == dev)) { + buffer_puts(buffer_1, "runsvchdir: "); + buffer_puts(buffer_1, new); + buffer_puts(buffer_1, ": current.\n"); + buffer_flush(buffer_1); + _exit(0); + } + + if (unlink("current.new") == -1) + if (errno != error_noent) fatal("unable to unlink: ", "current.new"); + if (symlink(new, "current.new") == -1) + fatal("unable to create: current.new -> ", new); + if (unlink("previous") == -1) + if (errno != error_noent) fatal("unable to unlink: ", "previous"); + if (rename("current", "previous") == -1) + fatal("unable to copy: current to ", "previous"); + if (rename("current.new", "current") == -1) { + warn("unable to move: current.new to ", "current"); + if (rename("previous", "current") == -1) + fatal("unable to move previous back to ", "current"); + _exit(111); + } + buffer_puts(buffer_1, "runsvchdir: "); + buffer_puts(buffer_1, new); + buffer_puts(buffer_1, ": now current.\n"); + buffer_flush(buffer_1); + _exit(0); +} diff --git a/mirror_runit/runit-2.1.2/src/runsvchdir.check b/mirror_runit/runit-2.1.2/src/runsvchdir.check new file mode 100755 index 0000000..a8de02b --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runsvchdir.check @@ -0,0 +1,3 @@ +#!/bin/sh +runsvchdir +echo $? diff --git a/mirror_runit/runit-2.1.2/src/runsvchdir.dist b/mirror_runit/runit-2.1.2/src/runsvchdir.dist new file mode 100644 index 0000000..7664608 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runsvchdir.dist @@ -0,0 +1,3 @@ +usage: runsvchdir dir + +1 diff --git a/mirror_runit/runit-2.1.2/src/runsvctrl.c b/mirror_runit/runit-2.1.2/src/runsvctrl.c new file mode 100644 index 0000000..d8eb2c4 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runsvctrl.c @@ -0,0 +1,82 @@ +#include +#include "strerr.h" +#include "error.h" +#include "open.h" + +#define USAGE " u|d|o|p|c|h|a|i|q|1|2|t|k|x|e service ..." + +#define VERSION "$Id: ccf8fc8ee3c340d8de97b5ddd9270b55e0f437cb $" + +#define FATAL "runsvctrl: fatal: " +#define WARNING "runsvctrl: warning: " + +char *progname; +unsigned int rc =0; + +void usage() { strerr_die4x(1, "usage: ", progname, USAGE, "\n"); } + +void fatal(char *m1) { strerr_die3sys(111, FATAL, m1, ": "); } +void warn(char *m1, char *m2) { + rc++; + strerr_warn5(WARNING, m1, ": ", m2, ": ", &strerr_sys); +} +void warnx(char *m1, char *m2) { + rc++; + strerr_warn4(WARNING, m1, ": ", m2, 0); +} + +int ctrl(char *name, char c) { + int fd; + + if ((fd =open_write("supervise/control")) == -1) { + if (errno == error_nodevice) + warnx(name, "runsv not running."); + else + warn(name, "unable to open supervise/control"); + return(-1); + } + if (write(fd, &c, 1) != 1) { + warn(name, "unable to write to supervise/control"); + return(-1); + } + return(1); +} + +int main(int argc, char **argv) { + char **dir; + int curdir; + char c; + + progname =*argv++; + + if (! argv || ! *argv) usage(); + + switch ((c =**argv)) { + case 'e': c ='x'; + case 'u': case 'd': case 'o': case 'x': case 'p': case 'c': case 'h': + case 'a': case 'i': case 't': case 'k': case 'q': case '1': case '2': + break; + default: + usage(); + } + dir =++argv; + if (! dir || ! *dir) usage(); + + if ((curdir =open_read(".")) == -1) { + rc =100; + fatal("unable to open current directory"); + } + for (; dir && *dir; dir++) { + if (chdir(*dir) == -1) { + warn(*dir, "unable to change directory"); + continue; + } + ctrl(*dir, c); + if (fchdir(curdir) == -1) { + rc =100; + fatal("unable to change directory"); + } + } + if (rc > 100) rc =100; + _exit(rc); +} diff --git a/mirror_runit/runit-2.1.2/src/runsvctrl.check b/mirror_runit/runit-2.1.2/src/runsvctrl.check new file mode 100755 index 0000000..7911074 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runsvctrl.check @@ -0,0 +1,23 @@ +#!/bin/sh +rm -rf "${ctmp}" + +runsvctrl +echo $? + +mkdir "${ctmp}" +echo '#!/bin/sh' >"${ctmp}"/run +echo 'echo starting' >>"${ctmp}"/run +echo 'exec sleep 14' >>"${ctmp}"/run +chmod 700 "${ctmp}"/run +runsv "${ctmp}" & +sleep 1 +test -r "${ctmp}"/supervise/stat || sleep 2 +runsvctrl down "${ctmp}" +echo $? +sleep 1 +cat "${ctmp}"/supervise/stat +runsvctrl exit "${ctmp}" +echo $? +wait +echo $? +rm -rf "${ctmp}" diff --git a/mirror_runit/runit-2.1.2/src/runsvctrl.dist b/mirror_runit/runit-2.1.2/src/runsvctrl.dist new file mode 100644 index 0000000..b07cf8a --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runsvctrl.dist @@ -0,0 +1,8 @@ +usage: runsvctrl u|d|o|p|c|h|a|i|q|1|2|t|k|x|e service ... + +1 +starting +0 +down +0 +0 diff --git a/mirror_runit/runit-2.1.2/src/runsvdir.c b/mirror_runit/runit-2.1.2/src/runsvdir.c new file mode 100644 index 0000000..07c1d8e --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runsvdir.c @@ -0,0 +1,286 @@ +#include +#include +#include +#include +#include "direntry.h" +#include "strerr.h" +#include "error.h" +#include "wait.h" +#include "env.h" +#include "open.h" +#include "pathexec.h" +#include "fd.h" +#include "str.h" +#include "coe.h" +#include "iopause.h" +#include "sig.h" +#include "ndelay.h" + +#define USAGE " [-P] dir" +#define VERSION "$Id: ecebd0a50510e91639c6a45dda8b0947aa8eb885 $" + +#define MAXSERVICES 1000 + +char *progname; +char *svdir; +unsigned long dev =0; +unsigned long ino =0; +struct { + unsigned long dev; + unsigned long ino; + int pid; + int isgone; +} sv[MAXSERVICES]; +int svnum =0; +int check =1; +char *rplog =0; +int rploglen; +int logpipe[2]; +iopause_fd io[1]; +struct taia stamplog; +int exitsoon =0; +int pgrp =0; + +void usage () { strerr_die4x(1, "usage: ", progname, USAGE, "\n"); } +void fatal(char *m1, char *m2) { + strerr_die6sys(100, "runsvdir ", svdir, ": fatal: ", m1, m2, ": "); +} +void warn(char *m1, char *m2) { + strerr_warn6("runsvdir ", svdir, ": warning: ", m1, m2, ": ", &strerr_sys); +} +void warn3x(char *m1, char *m2, char *m3) { + strerr_warn6("runsvdir ", svdir, ": warning: ", m1, m2, m3, 0); +} +void s_term() { exitsoon =1; } +void s_hangup() { exitsoon =2; } + +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] ="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; +} + +void runsvdir() { + DIR *dir; + direntry *d; + int i; + struct stat s; + + if (! (dir =opendir("."))) { + warn("unable to open directory ", svdir); + return; + } + for (i =0; i < svnum; i++) sv[i].isgone =1; + errno =0; + while ((d =readdir(dir))) { + if (d->d_name[0] == '.') continue; + if (stat(d->d_name, &s) == -1) { + warn("unable to stat ", d->d_name); + errno =0; + continue; + } + if (! S_ISDIR(s.st_mode)) continue; + for (i =0; i < svnum; i++) { + if ((sv[i].ino == s.st_ino) && (sv[i].dev == s.st_dev)) { + sv[i].isgone =0; + if (! sv[i].pid) runsv(i, d->d_name); + break; + } + } + if (i == svnum) { + /* new service */ + if (svnum >= MAXSERVICES) { + warn3x("unable to start runsv ", d->d_name, ": too many services."); + continue; + } + sv[i].ino =s.st_ino; + sv[i].dev =s.st_dev; + sv[i].pid =0; + sv[i].isgone =0; + svnum++; + runsv(i, d->d_name); + check =1; + } + } + if (errno) { + warn("unable to read directory ", svdir); + closedir(dir); + check =1; + return; + } + closedir(dir); + + /* SIGTERM removed runsv's */ + for (i =0; i < svnum; i++) { + if (! sv[i].isgone) continue; + if (sv[i].pid) kill(sv[i].pid, SIGTERM); + sv[i] =sv[--svnum]; + check =1; + } +} + +int setup_log() { + if ((rploglen =str_len(rplog)) < 7) { + warn3x("log must have at least seven characters.", 0, 0); + return(0); + } + if (pipe(logpipe) == -1) { + warn3x("unable to create pipe for log.", 0, 0); + return(-1); + } + coe(logpipe[1]); + coe(logpipe[0]); + ndelay_on(logpipe[0]); + ndelay_on(logpipe[1]); + if (fd_copy(2, logpipe[1]) == -1) { + warn3x("unable to set filedescriptor for log.", 0, 0); + return(-1); + } + io[0].fd =logpipe[0]; + io[0].events =IOPAUSE_READ; + taia_now(&stamplog); + return(1); +} + +int main(int argc, char **argv) { + struct stat s; + time_t mtime =0; + int wstat; + int curdir; + int pid; + struct taia deadline; + struct taia now; + struct taia stampcheck; + char ch; + int i; + + progname =*argv++; + if (! argv || ! *argv) usage(); + if (**argv == '-') { + switch (*(*argv +1)) { + case 'P': pgrp =1; + case '-': ++argv; + } + if (! argv || ! *argv) usage(); + } + + sig_catch(sig_term, s_term); + sig_catch(sig_hangup, s_hangup); + svdir =*argv++; + if (argv && *argv) { + rplog =*argv; + if (setup_log() != 1) { + rplog =0; + warn3x("log service disabled.", 0, 0); + } + } + if ((curdir =open_read(".")) == -1) + fatal("unable to open current directory", 0); + coe(curdir); + + taia_now(&stampcheck); + + for (;;) { + /* collect children */ + for (;;) { + if ((pid =wait_nohang(&wstat)) <= 0) break; + for (i =0; i < svnum; i++) { + if (pid == sv[i].pid) { + /* runsv has gone */ + sv[i].pid =0; + check =1; + break; + } + } + } + + taia_now(&now); + if (now.sec.x < (stampcheck.sec.x -3)) { + /* time warp */ + warn3x("time warp: resetting time stamp.", 0, 0); + taia_now(&stampcheck); + taia_now(&now); + if (rplog) taia_now(&stamplog); + } + if (taia_less(&now, &stampcheck) == 0) { + /* wait at least a second */ + taia_uint(&deadline, 1); + taia_add(&stampcheck, &now, &deadline); + + if (stat(svdir, &s) != -1) { + if (check || \ + s.st_mtime != mtime || s.st_ino != ino || s.st_dev != dev) { + /* svdir modified */ + if (chdir(svdir) != -1) { + mtime =s.st_mtime; + dev =s.st_dev; + ino =s.st_ino; + check =0; + if (now.sec.x <= (4611686018427387914ULL +(uint64)mtime)) + sleep(1); + runsvdir(); + while (fchdir(curdir) == -1) { + warn("unable to change directory, pausing", 0); + sleep(5); + } + } + else + warn("unable to change directory to ", svdir); + } + } + else + warn("unable to stat ", svdir); + } + + if (rplog) + if (taia_less(&now, &stamplog) == 0) { + write(logpipe[1], ".", 1); + taia_uint(&deadline, 900); + taia_add(&stamplog, &now, &deadline); + } + taia_uint(&deadline, check ? 1 : 5); + taia_add(&deadline, &now, &deadline); + + sig_block(sig_child); + if (rplog) + iopause(io, 1, &deadline, &now); + else + iopause(0, 0, &deadline, &now); + sig_unblock(sig_child); + + if (rplog && (io[0].revents | IOPAUSE_READ)) + while (read(logpipe[0], &ch, 1) > 0) + if (ch) { + for (i =6; i < rploglen; i++) + rplog[i -1] =rplog[i]; + rplog[rploglen -1] =ch; + } + + switch(exitsoon) { + case 1: + _exit(0); + case 2: + for (i =0; i < svnum; i++) if (sv[i].pid) kill(sv[i].pid, SIGTERM); + _exit(111); + } + } + /* not reached */ + _exit(0); +} diff --git a/mirror_runit/runit-2.1.2/src/runsvdir.check b/mirror_runit/runit-2.1.2/src/runsvdir.check new file mode 100755 index 0000000..a7927eb --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runsvdir.check @@ -0,0 +1,3 @@ +#!/bin/sh +runsvdir +echo $? diff --git a/mirror_runit/runit-2.1.2/src/runsvdir.dist b/mirror_runit/runit-2.1.2/src/runsvdir.dist new file mode 100644 index 0000000..c553363 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runsvdir.dist @@ -0,0 +1,3 @@ +usage: runsvdir [-P] dir + +1 diff --git a/mirror_runit/runit-2.1.2/src/runsvstat.c b/mirror_runit/runit-2.1.2/src/runsvstat.c new file mode 100644 index 0000000..c0c0233 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runsvstat.c @@ -0,0 +1,167 @@ +#include +#include +#include +#include "strerr.h" +#include "error.h" +#include "sgetopt.h" +#include "open.h" +#include "buffer.h" +#include "tai.h" +#include "fmt.h" + +#define USAGE " [ -l ] service ..." + +#define VERSION "$Id: c17bbd3eda6f3c57027dfb47ff676bdd3fefff9f $" + +#define FATAL "runsvstat: fatal: " +#define WARNING "runsvstat: warning: " + +const char *progname; +unsigned int rc =0; +struct stat s; +int showlog =0; + +void usage() { strerr_die4x(1, "usage: ", progname, USAGE, "\n"); } + +void fatal(char *m1) { strerr_die3sys(111, FATAL, m1, ": "); } +void warn(char *m1, char *m2) { + rc++; + strerr_warn5(WARNING, m1, ": ", m2, ": ", &strerr_sys); +} +void warnx(char *m1, char *m2) { + rc++; + strerr_warn4(WARNING, m1, ": ", m2, 0); +} + +int show_status(char *name) { + char status[20]; + int pid; + int fd; + int normallyup =0; + char sulong[FMT_ULONG]; + struct tai when; + struct tai now; + + if (stat("down", &s) == -1) { + if (errno != error_noent) { + warn(name, "unable to stat down"); + return(-1); + } + normallyup = 1; + } + if ((fd =open_write("supervise/ok")) == -1) { + if (errno == error_nodevice) + warnx(name, "runsv not running."); + else + warn(name, "unable to open supervise/ok"); + return(-1); + } + close(fd); + if ((fd =open_read("supervise/status")) == -1) { + warn(name, "unable to open supervise/status"); + return(-1); + } + switch(read(fd, status, 20)) { + case 20: break; + case -1: + warn(name, "unable to read supervise/status"); + return(-1); + default: + warnx(name, "unable to read supervise/status: bad format."); + return(-1); + } + pid =(unsigned char) status[15]; + pid <<=8; pid +=(unsigned char)status[14]; + pid <<=8; pid +=(unsigned char)status[13]; + pid <<=8; pid +=(unsigned char)status[12]; + + tai_unpack(status,&when); + tai_now(&now); + if (tai_less(&now,&when)) when =now; + tai_sub(&when,&now,&when); + + buffer_puts(buffer_1, name); + buffer_puts(buffer_1, ": "); + if (pid) { + switch (status[19]) { + case 1: buffer_puts(buffer_1, "run "); break; + case 2: buffer_puts(buffer_1, "finish "); break; + } + buffer_puts(buffer_1, "(pid "); + buffer_put(buffer_1, sulong, fmt_ulong(sulong, pid)); + buffer_puts(buffer_1, ") "); + } + else + buffer_puts(buffer_1, "down "); + buffer_put(buffer_1, sulong, fmt_ulong(sulong, tai_approx(&when))); + buffer_puts(buffer_1, " seconds"); + if (pid && !normallyup) buffer_puts(buffer_1,", normally down"); + if (!pid && normallyup) buffer_puts(buffer_1,", normally up"); + if (pid && status[16]) buffer_puts(buffer_1,", paused"); + if (!pid && (status[17] == 'u')) buffer_puts(buffer_1,", want up"); + if (pid && (status[17] == 'd')) buffer_puts(buffer_1,", want down"); + if (pid && status[18]) buffer_puts(buffer_1, ", got TERM"); + /* buffer_putsflush(buffer_1, "\n"); */ + return(1); +} + +int main(int argc, char **argv) { + int opt; + int curdir; + char **dir; + + progname =*argv; + + while ((opt =getopt(argc, (const char * const *)argv, "lV")) != opteof) { + switch(opt) { + case 'l': + showlog =1; + break; + case 'V': + strerr_warn1(VERSION, 0); + case '?': + usage(); + } + } + argv +=optind; + + dir =argv; + if (! dir || ! *dir) usage(); + + if ((curdir =open_read(".")) == -1) { + rc =100; + fatal("unable to open current directory"); + } + for (; dir && *dir; dir++) { + if (chdir(*dir) == -1) { + warn(*dir, "unable to change directory"); + continue; + } + if (show_status(*dir) == 1) { + if (showlog) { + if (stat("log", &s) == -1) { + if (errno != error_noent) + warn("unable to stat()", "./log"); + } + else { + if (! S_ISDIR(s.st_mode)) + warnx("./log", "not a directory."); + else { + if (chdir("log") == -1) { + warn(*dir, "unable to change directory"); + continue; + } + show_status("\n log"); + } + } + } + buffer_puts(buffer_1, "\n"); buffer_flush(buffer_1); + } + if (fchdir(curdir) == -1) { + rc =100; + fatal("unable to change directory"); + } + } + if (rc > 100) rc =100; + _exit(rc); +} diff --git a/mirror_runit/runit-2.1.2/src/runsvstat.check b/mirror_runit/runit-2.1.2/src/runsvstat.check new file mode 100755 index 0000000..6ccde11 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runsvstat.check @@ -0,0 +1,26 @@ +#!/bin/sh +rm -rf "${ctmp}" + +runsvstat +echo $? +runsvstat -V +echo $? + +mkdir "${ctmp}" +echo '#!/bin/sh' >"${ctmp}"/run +echo 'echo starting' >>"${ctmp}"/run +echo 'exec sleep 14' >>"${ctmp}"/run +chmod 700 "${ctmp}"/run +chpst -2 runsvstat "${ctmp}" +echo $? +runsv "${ctmp}" & +sleep 1 +test -r "${ctmp}"/supervise/stat || sleep 2 +chpst -1 runsvstat "${ctmp}" +echo $? +runsvctrl exit "${ctmp}" +wait +echo $? +chpst -2 runsvstat "${ctmp}" +echo $? +rm -rf "${ctmp}" diff --git a/mirror_runit/runit-2.1.2/src/runsvstat.dist b/mirror_runit/runit-2.1.2/src/runsvstat.dist new file mode 100644 index 0000000..24b9ed4 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/runsvstat.dist @@ -0,0 +1,12 @@ +usage: runsvstat [ -l ] service ... + +1 +$Id$ +usage: runsvstat [ -l ] service ... + +1 +1 +starting +0 +0 +1 diff --git a/mirror_runit/runit-2.1.2/src/scan.h b/mirror_runit/runit-2.1.2/src/scan.h new file mode 100644 index 0000000..3db49d3 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/scan.h @@ -0,0 +1,30 @@ +/* Public domain. */ + +#ifndef SCAN_H +#define SCAN_H + +extern unsigned int scan_uint(const char *,unsigned int *); +extern unsigned int scan_xint(const char *,unsigned int *); +extern unsigned int scan_nbbint(const char *,unsigned int,unsigned int,unsigned int,unsigned int *); +extern unsigned int scan_ushort(const char *,unsigned short *); +extern unsigned int scan_xshort(const char *,unsigned short *); +extern unsigned int scan_nbbshort(const char *,unsigned int,unsigned int,unsigned int,unsigned short *); +extern unsigned int scan_ulong(const char *,unsigned long *); +extern unsigned int scan_xlong(const char *,unsigned long *); +extern unsigned int scan_nbblong(const char *,unsigned int,unsigned int,unsigned int,unsigned long *); + +extern unsigned int scan_plusminus(const char *,int *); +extern unsigned int scan_0x(const char *,unsigned int *); + +extern unsigned int scan_whitenskip(const char *,unsigned int); +extern unsigned int scan_nonwhitenskip(const char *,unsigned int); +extern unsigned int scan_charsetnskip(const char *,const char *,unsigned int); +extern unsigned int scan_noncharsetnskip(const char *,const char *,unsigned int); + +extern unsigned int scan_strncmp(const char *,const char *,unsigned int); +extern unsigned int scan_memcmp(const char *,const char *,unsigned int); + +extern unsigned int scan_long(const char *,long *); +extern unsigned int scan_8long(const char *,unsigned long *); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/scan_ulong.c b/mirror_runit/runit-2.1.2/src/scan_ulong.c new file mode 100644 index 0000000..af19701 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/scan_ulong.c @@ -0,0 +1,16 @@ +/* Public domain. */ + +#include "scan.h" + +unsigned int scan_ulong(register const char *s,register unsigned long *u) +{ + register unsigned int pos = 0; + register unsigned long result = 0; + register unsigned long c; + while ((c = (unsigned long) (unsigned char) (s[pos] - '0')) < 10) { + result = result * 10 + c; + ++pos; + } + *u = result; + return pos; +} diff --git a/mirror_runit/runit-2.1.2/src/seek.h b/mirror_runit/runit-2.1.2/src/seek.h new file mode 100644 index 0000000..8011701 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/seek.h @@ -0,0 +1,17 @@ +/* Public domain. */ + +#ifndef SEEK_H +#define SEEK_H + +typedef unsigned long seek_pos; + +extern seek_pos seek_cur(int); + +extern int seek_set(int,seek_pos); +extern int seek_end(int); + +extern int seek_trunc(int,seek_pos); + +#define seek_begin(fd) (seek_set((fd),(seek_pos) 0)) + +#endif diff --git a/mirror_runit/runit-2.1.2/src/seek_set.c b/mirror_runit/runit-2.1.2/src/seek_set.c new file mode 100644 index 0000000..19b8265 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/seek_set.c @@ -0,0 +1,9 @@ +/* Public domain. */ + +#include +#include "seek.h" + +#define SET 0 /* sigh */ + +int seek_set(int fd,seek_pos pos) +{ if (lseek(fd,(off_t) pos,SET) == -1) return -1; return 0; } diff --git a/mirror_runit/runit-2.1.2/src/select.h1 b/mirror_runit/runit-2.1.2/src/select.h1 new file mode 100644 index 0000000..68e971f --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/select.h1 @@ -0,0 +1,12 @@ +/* Public domain. */ + +#ifndef SELECT_H +#define SELECT_H + +/* sysdep: -sysselect */ + +#include +#include +extern int select(); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/select.h2 b/mirror_runit/runit-2.1.2/src/select.h2 new file mode 100644 index 0000000..4bd4fcf --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/select.h2 @@ -0,0 +1,13 @@ +/* Public domain. */ + +#ifndef SELECT_H +#define SELECT_H + +/* sysdep: +sysselect */ + +#include +#include +#include +extern int select(); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/sgetopt.c b/mirror_runit/runit-2.1.2/src/sgetopt.c new file mode 100644 index 0000000..8bb608f --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/sgetopt.c @@ -0,0 +1,53 @@ +/* Public domain. */ + +/* sgetopt.c, sgetopt.h: (yet another) improved getopt clone, outer layer +D. J. Bernstein, djb@pobox.com. +Depends on subgetopt.h, buffer.h. +No system requirements. +19991219: Switched to buffer.h. +19970208: Cleanups. +931201: Baseline. +No known patent problems. + +Documentation in sgetopt.3. +*/ + +#include "buffer.h" +#define SGETOPTNOSHORT +#include "sgetopt.h" +#define SUBGETOPTNOSHORT +#include "subgetopt.h" + +#define getopt sgetoptmine +#define optind subgetoptind +#define opterr sgetopterr +#define optproblem subgetoptproblem +#define optprogname sgetoptprogname + +int opterr = 1; +const char *optprogname = 0; + +int getopt(int argc,const char *const *argv,const char *opts) +{ + int c; + const char *s; + + if (!optprogname) { + optprogname = *argv; + if (!optprogname) optprogname = ""; + for (s = optprogname;*s;++s) if (*s == '/') optprogname = s + 1; + } + c = subgetopt(argc,argv,opts); + if (opterr) + if (c == '?') { + char chp[2]; chp[0] = optproblem; chp[1] = '\n'; + buffer_puts(buffer_2,optprogname); + if (argv[optind] && (optind < argc)) + buffer_puts(buffer_2,": illegal option -- "); + else + buffer_puts(buffer_2,": option requires an argument -- "); + buffer_put(buffer_2,chp,2); + buffer_flush(buffer_2); + } + return c; +} diff --git a/mirror_runit/runit-2.1.2/src/sgetopt.h b/mirror_runit/runit-2.1.2/src/sgetopt.h new file mode 100644 index 0000000..bf8bce6 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/sgetopt.h @@ -0,0 +1,23 @@ +/* Public domain. */ + +#ifndef SGETOPT_H +#define SGETOPT_H + +#ifndef SGETOPTNOSHORT +#define getopt sgetoptmine +#define optarg subgetoptarg +#define optind subgetoptind +#define optpos subgetoptpos +#define opterr sgetopterr +#define optproblem subgetoptproblem +#define optprogname sgetoptprogname +#define opteof subgetoptdone +#endif + +#include "subgetopt.h" + +extern int sgetoptmine(int,const char *const *,const char *); +extern int sgetopterr; +extern const char *sgetoptprogname; + +#endif diff --git a/mirror_runit/runit-2.1.2/src/sig.c b/mirror_runit/runit-2.1.2/src/sig.c new file mode 100644 index 0000000..423d18e --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/sig.c @@ -0,0 +1,15 @@ +/* Public domain. */ + +#include +#include "sig.h" + +int sig_alarm = SIGALRM; +int sig_child = SIGCHLD; +int sig_cont = SIGCONT; +int sig_hangup = SIGHUP; +int sig_int = SIGINT; +int sig_pipe = SIGPIPE; +int sig_term = SIGTERM; + +void (*sig_defaulthandler)() = SIG_DFL; +void (*sig_ignorehandler)() = SIG_IGN; diff --git a/mirror_runit/runit-2.1.2/src/sig.h b/mirror_runit/runit-2.1.2/src/sig.h new file mode 100644 index 0000000..2a3c780 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/sig.h @@ -0,0 +1,28 @@ +/* Public domain. */ + +#ifndef SIG_H +#define SIG_H + +extern int sig_alarm; +extern int sig_child; +extern int sig_cont; +extern int sig_hangup; +extern int sig_int; +extern int sig_pipe; +extern int sig_term; + +extern void (*sig_defaulthandler)(); +extern void (*sig_ignorehandler)(); + +extern void sig_catch(int,void (*)()); +#define sig_ignore(s) (sig_catch((s),sig_ignorehandler)) +#define sig_uncatch(s) (sig_catch((s),sig_defaulthandler)) + +extern void sig_block(int); +extern void sig_unblock(int); +extern void sig_blocknone(void); +extern void sig_pause(void); + +extern void sig_dfl(int); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/sig_block.c b/mirror_runit/runit-2.1.2/src/sig_block.c new file mode 100644 index 0000000..a46c860 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/sig_block.c @@ -0,0 +1,40 @@ +/* Public domain. */ + +#include +#include "sig.h" +#include "hassgprm.h" + +void sig_block(int sig) +{ +#ifdef HASSIGPROCMASK + sigset_t ss; + sigemptyset(&ss); + sigaddset(&ss,sig); + sigprocmask(SIG_BLOCK,&ss,(sigset_t *) 0); +#else + sigblock(1 << (sig - 1)); +#endif +} + +void sig_unblock(int sig) +{ +#ifdef HASSIGPROCMASK + sigset_t ss; + sigemptyset(&ss); + sigaddset(&ss,sig); + sigprocmask(SIG_UNBLOCK,&ss,(sigset_t *) 0); +#else + sigsetmask(sigsetmask(~0) & ~(1 << (sig - 1))); +#endif +} + +void sig_blocknone(void) +{ +#ifdef HASSIGPROCMASK + sigset_t ss; + sigemptyset(&ss); + sigprocmask(SIG_SETMASK,&ss,(sigset_t *) 0); +#else + sigsetmask(0); +#endif +} diff --git a/mirror_runit/runit-2.1.2/src/sig_catch.c b/mirror_runit/runit-2.1.2/src/sig_catch.c new file mode 100644 index 0000000..7b5bd89 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/sig_catch.c @@ -0,0 +1,18 @@ +/* Public domain. */ + +#include +#include "sig.h" +#include "hassgact.h" + +void sig_catch(int sig,void (*f)()) +{ +#ifdef HASSIGACTION + struct sigaction sa; + sa.sa_handler = f; + sa.sa_flags = 0; + sigemptyset(&sa.sa_mask); + sigaction(sig,&sa,(struct sigaction *) 0); +#else + signal(sig,f); /* won't work under System V, even nowadays---dorks */ +#endif +} diff --git a/mirror_runit/runit-2.1.2/src/sig_pause.c b/mirror_runit/runit-2.1.2/src/sig_pause.c new file mode 100644 index 0000000..3d1a793 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/sig_pause.c @@ -0,0 +1,16 @@ +/* Public domain. */ + +#include +#include "sig.h" +#include "hassgprm.h" + +void sig_pause(void) +{ +#ifdef HASSIGPROCMASK + sigset_t ss; + sigemptyset(&ss); + sigsuspend(&ss); +#else + sigpause(0); +#endif +} diff --git a/mirror_runit/runit-2.1.2/src/str.h b/mirror_runit/runit-2.1.2/src/str.h new file mode 100644 index 0000000..f65b8f6 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/str.h @@ -0,0 +1,16 @@ +/* Public domain. */ + +#ifndef STR_H +#define STR_H + +extern unsigned int str_copy(char *,const char *); +extern int str_diff(const char *,const char *); +extern int str_diffn(const char *,const char *,unsigned int); +extern unsigned int str_len(const char *); +extern unsigned int str_chr(const char *,int); +extern unsigned int str_rchr(const char *,int); +extern int str_start(const char *,const char *); + +#define str_equal(s,t) (!str_diff((s),(t))) + +#endif diff --git a/mirror_runit/runit-2.1.2/src/str_chr.c b/mirror_runit/runit-2.1.2/src/str_chr.c new file mode 100644 index 0000000..9b467eb --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/str_chr.c @@ -0,0 +1,19 @@ +/* Public domain. */ + +#include "str.h" + +unsigned int str_chr(register const char *s,int c) +{ + register char ch; + register const char *t; + + ch = c; + t = s; + for (;;) { + if (!*t) break; if (*t == ch) break; ++t; + if (!*t) break; if (*t == ch) break; ++t; + if (!*t) break; if (*t == ch) break; ++t; + if (!*t) break; if (*t == ch) break; ++t; + } + return t - s; +} diff --git a/mirror_runit/runit-2.1.2/src/str_diff.c b/mirror_runit/runit-2.1.2/src/str_diff.c new file mode 100644 index 0000000..47dff22 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/str_diff.c @@ -0,0 +1,17 @@ +/* Public domain. */ + +#include "str.h" + +int str_diff(register const char *s,register const char *t) +{ + register char x; + + for (;;) { + x = *s; if (x != *t) break; if (!x) break; ++s; ++t; + x = *s; if (x != *t) break; if (!x) break; ++s; ++t; + x = *s; if (x != *t) break; if (!x) break; ++s; ++t; + x = *s; if (x != *t) break; if (!x) break; ++s; ++t; + } + return ((int)(unsigned int)(unsigned char) x) + - ((int)(unsigned int)(unsigned char) *t); +} diff --git a/mirror_runit/runit-2.1.2/src/str_len.c b/mirror_runit/runit-2.1.2/src/str_len.c new file mode 100644 index 0000000..dedd005 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/str_len.c @@ -0,0 +1,16 @@ +/* Public domain. */ + +#include "str.h" + +unsigned int str_len(const char *s) +{ + register const char *t; + + t = s; + for (;;) { + if (!*t) return t - s; ++t; + if (!*t) return t - s; ++t; + if (!*t) return t - s; ++t; + if (!*t) return t - s; ++t; + } +} diff --git a/mirror_runit/runit-2.1.2/src/str_start.c b/mirror_runit/runit-2.1.2/src/str_start.c new file mode 100644 index 0000000..017efc7 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/str_start.c @@ -0,0 +1,15 @@ +/* Public domain. */ + +#include "str.h" + +int str_start(register const char *s,register const char *t) +{ + register char x; + + for (;;) { + x = *t++; if (!x) return 1; if (x != *s++) return 0; + x = *t++; if (!x) return 1; if (x != *s++) return 0; + x = *t++; if (!x) return 1; if (x != *s++) return 0; + x = *t++; if (!x) return 1; if (x != *s++) return 0; + } +} diff --git a/mirror_runit/runit-2.1.2/src/stralloc.h b/mirror_runit/runit-2.1.2/src/stralloc.h new file mode 100644 index 0000000..51d61bd --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/stralloc.h @@ -0,0 +1,31 @@ +/* Public domain. */ + +#ifndef STRALLOC_H +#define STRALLOC_H + +#include "gen_alloc.h" + +GEN_ALLOC_typedef(stralloc,char,s,len,a) + +extern int stralloc_ready(stralloc *,unsigned int); +extern int stralloc_readyplus(stralloc *,unsigned int); +extern int stralloc_copy(stralloc *,const stralloc *); +extern int stralloc_cat(stralloc *,const stralloc *); +extern int stralloc_copys(stralloc *,const char *); +extern int stralloc_cats(stralloc *,const char *); +extern int stralloc_copyb(stralloc *,const char *,unsigned int); +extern int stralloc_catb(stralloc *,const char *,unsigned int); +extern int stralloc_append(stralloc *,const char *); /* beware: this takes a pointer to 1 char */ +extern int stralloc_starts(stralloc *,const char *); + +#define stralloc_0(sa) stralloc_append(sa,"") + +extern int stralloc_catulong0(stralloc *,unsigned long,unsigned int); +extern int stralloc_catlong0(stralloc *,long,unsigned int); + +#define stralloc_catlong(sa,l) (stralloc_catlong0((sa),(l),0)) +#define stralloc_catuint0(sa,i,n) (stralloc_catulong0((sa),(i),(n))) +#define stralloc_catint0(sa,i,n) (stralloc_catlong0((sa),(i),(n))) +#define stralloc_catint(sa,i) (stralloc_catlong0((sa),(i),0)) + +#endif diff --git a/mirror_runit/runit-2.1.2/src/stralloc_cat.c b/mirror_runit/runit-2.1.2/src/stralloc_cat.c new file mode 100644 index 0000000..2c6ad58 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/stralloc_cat.c @@ -0,0 +1,9 @@ +/* Public domain. */ + +#include "byte.h" +#include "stralloc.h" + +int stralloc_cat(stralloc *sato,const stralloc *safrom) +{ + return stralloc_catb(sato,safrom->s,safrom->len); +} diff --git a/mirror_runit/runit-2.1.2/src/stralloc_catb.c b/mirror_runit/runit-2.1.2/src/stralloc_catb.c new file mode 100644 index 0000000..8ee0af4 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/stralloc_catb.c @@ -0,0 +1,14 @@ +/* Public domain. */ + +#include "stralloc.h" +#include "byte.h" + +int stralloc_catb(stralloc *sa,const char *s,unsigned int n) +{ + if (!sa->s) return stralloc_copyb(sa,s,n); + if (!stralloc_readyplus(sa,n + 1)) return 0; + byte_copy(sa->s + sa->len,n,s); + sa->len += n; + sa->s[sa->len] = 'Z'; /* ``offensive programming'' */ + return 1; +} diff --git a/mirror_runit/runit-2.1.2/src/stralloc_cats.c b/mirror_runit/runit-2.1.2/src/stralloc_cats.c new file mode 100644 index 0000000..ea1e290 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/stralloc_cats.c @@ -0,0 +1,10 @@ +/* Public domain. */ + +#include "byte.h" +#include "str.h" +#include "stralloc.h" + +int stralloc_cats(stralloc *sa,const char *s) +{ + return stralloc_catb(sa,s,str_len(s)); +} diff --git a/mirror_runit/runit-2.1.2/src/stralloc_eady.c b/mirror_runit/runit-2.1.2/src/stralloc_eady.c new file mode 100644 index 0000000..81dbb85 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/stralloc_eady.c @@ -0,0 +1,8 @@ +/* Public domain. */ + +#include "alloc.h" +#include "stralloc.h" +#include "gen_allocdefs.h" + +GEN_ALLOC_ready(stralloc,char,s,len,a,i,n,x,30,stralloc_ready) +GEN_ALLOC_readyplus(stralloc,char,s,len,a,i,n,x,30,stralloc_readyplus) diff --git a/mirror_runit/runit-2.1.2/src/stralloc_opyb.c b/mirror_runit/runit-2.1.2/src/stralloc_opyb.c new file mode 100644 index 0000000..bbcff48 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/stralloc_opyb.c @@ -0,0 +1,13 @@ +/* Public domain. */ + +#include "stralloc.h" +#include "byte.h" + +int stralloc_copyb(stralloc *sa,const char *s,unsigned int n) +{ + if (!stralloc_ready(sa,n + 1)) return 0; + byte_copy(sa->s,n,s); + sa->len = n; + sa->s[n] = 'Z'; /* ``offensive programming'' */ + return 1; +} diff --git a/mirror_runit/runit-2.1.2/src/stralloc_opys.c b/mirror_runit/runit-2.1.2/src/stralloc_opys.c new file mode 100644 index 0000000..075b6f8 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/stralloc_opys.c @@ -0,0 +1,10 @@ +/* Public domain. */ + +#include "byte.h" +#include "str.h" +#include "stralloc.h" + +int stralloc_copys(stralloc *sa,const char *s) +{ + return stralloc_copyb(sa,s,str_len(s)); +} diff --git a/mirror_runit/runit-2.1.2/src/stralloc_pend.c b/mirror_runit/runit-2.1.2/src/stralloc_pend.c new file mode 100644 index 0000000..70cb55c --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/stralloc_pend.c @@ -0,0 +1,7 @@ +/* Public domain. */ + +#include "alloc.h" +#include "stralloc.h" +#include "gen_allocdefs.h" + +GEN_ALLOC_append(stralloc,char,s,len,a,i,n,x,30,stralloc_readyplus,stralloc_append) diff --git a/mirror_runit/runit-2.1.2/src/strerr.h b/mirror_runit/runit-2.1.2/src/strerr.h new file mode 100644 index 0000000..21d812d --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/strerr.h @@ -0,0 +1,80 @@ +/* Public domain. */ + +#ifndef STRERR_H +#define STRERR_H + +struct strerr { + struct strerr *who; + const char *x; + const char *y; + const char *z; +} ; + +extern struct strerr strerr_sys; +extern void strerr_sysinit(void); + +extern const char *strerr(const struct strerr *); +extern void strerr_warn(const char *,const char *,const char *,const char *,const char *,const char *,const struct strerr *); +extern void strerr_die(int,const char *,const char *,const char *,const char *,const char *,const char *,const struct strerr *); + +#define STRERR(r,se,a) \ +{ se.who = 0; se.x = a; se.y = 0; se.z = 0; return r; } + +#define STRERR_SYS(r,se,a) \ +{ se.who = &strerr_sys; se.x = a; se.y = 0; se.z = 0; return r; } +#define STRERR_SYS3(r,se,a,b,c) \ +{ se.who = &strerr_sys; se.x = a; se.y = b; se.z = c; return r; } + +#define strerr_warn6(x1,x2,x3,x4,x5,x6,se) \ +strerr_warn((x1),(x2),(x3),(x4),(x5),(x6),(se)) +#define strerr_warn5(x1,x2,x3,x4,x5,se) \ +strerr_warn((x1),(x2),(x3),(x4),(x5),0,(se)) +#define strerr_warn4(x1,x2,x3,x4,se) \ +strerr_warn((x1),(x2),(x3),(x4),0,0,(se)) +#define strerr_warn3(x1,x2,x3,se) \ +strerr_warn((x1),(x2),(x3),0,0,0,(se)) +#define strerr_warn2(x1,x2,se) \ +strerr_warn((x1),(x2),0,0,0,0,(se)) +#define strerr_warn1(x1,se) \ +strerr_warn((x1),0,0,0,0,0,(se)) + +#define strerr_die6(e,x1,x2,x3,x4,x5,x6,se) \ +strerr_die((e),(x1),(x2),(x3),(x4),(x5),(x6),(se)) +#define strerr_die5(e,x1,x2,x3,x4,x5,se) \ +strerr_die((e),(x1),(x2),(x3),(x4),(x5),0,(se)) +#define strerr_die4(e,x1,x2,x3,x4,se) \ +strerr_die((e),(x1),(x2),(x3),(x4),0,0,(se)) +#define strerr_die3(e,x1,x2,x3,se) \ +strerr_die((e),(x1),(x2),(x3),0,0,0,(se)) +#define strerr_die2(e,x1,x2,se) \ +strerr_die((e),(x1),(x2),0,0,0,0,(se)) +#define strerr_die1(e,x1,se) \ +strerr_die((e),(x1),0,0,0,0,0,(se)) + +#define strerr_die6sys(e,x1,x2,x3,x4,x5,x6) \ +strerr_die((e),(x1),(x2),(x3),(x4),(x5),(x6),&strerr_sys) +#define strerr_die5sys(e,x1,x2,x3,x4,x5) \ +strerr_die((e),(x1),(x2),(x3),(x4),(x5),0,&strerr_sys) +#define strerr_die4sys(e,x1,x2,x3,x4) \ +strerr_die((e),(x1),(x2),(x3),(x4),0,0,&strerr_sys) +#define strerr_die3sys(e,x1,x2,x3) \ +strerr_die((e),(x1),(x2),(x3),0,0,0,&strerr_sys) +#define strerr_die2sys(e,x1,x2) \ +strerr_die((e),(x1),(x2),0,0,0,0,&strerr_sys) +#define strerr_die1sys(e,x1) \ +strerr_die((e),(x1),0,0,0,0,0,&strerr_sys) + +#define strerr_die6x(e,x1,x2,x3,x4,x5,x6) \ +strerr_die((e),(x1),(x2),(x3),(x4),(x5),(x6),0) +#define strerr_die5x(e,x1,x2,x3,x4,x5) \ +strerr_die((e),(x1),(x2),(x3),(x4),(x5),0,0) +#define strerr_die4x(e,x1,x2,x3,x4) \ +strerr_die((e),(x1),(x2),(x3),(x4),0,0,0) +#define strerr_die3x(e,x1,x2,x3) \ +strerr_die((e),(x1),(x2),(x3),0,0,0,0) +#define strerr_die2x(e,x1,x2) \ +strerr_die((e),(x1),(x2),0,0,0,0,0) +#define strerr_die1x(e,x1) \ +strerr_die((e),(x1),0,0,0,0,0,0) + +#endif diff --git a/mirror_runit/runit-2.1.2/src/strerr_die.c b/mirror_runit/runit-2.1.2/src/strerr_die.c new file mode 100644 index 0000000..f226b80 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/strerr_die.c @@ -0,0 +1,33 @@ +/* Public domain. */ + +#include +#include "buffer.h" +#include "strerr.h" + +void strerr_warn(const char *x1,const char *x2,const char *x3,const char *x4,const char *x5,const char *x6,const struct strerr *se) +{ + strerr_sysinit(); + + if (x1) buffer_puts(buffer_2,x1); + if (x2) buffer_puts(buffer_2,x2); + if (x3) buffer_puts(buffer_2,x3); + if (x4) buffer_puts(buffer_2,x4); + if (x5) buffer_puts(buffer_2,x5); + if (x6) buffer_puts(buffer_2,x6); + + while(se) { + if (se->x) buffer_puts(buffer_2,se->x); + if (se->y) buffer_puts(buffer_2,se->y); + if (se->z) buffer_puts(buffer_2,se->z); + se = se->who; + } + + buffer_puts(buffer_2,"\n"); + buffer_flush(buffer_2); +} + +void strerr_die(int e,const char *x1,const char *x2,const char *x3,const char *x4,const char *x5,const char *x6,const struct strerr *se) +{ + strerr_warn(x1,x2,x3,x4,x5,x6,se); + _exit(e); +} diff --git a/mirror_runit/runit-2.1.2/src/strerr_sys.c b/mirror_runit/runit-2.1.2/src/strerr_sys.c new file mode 100644 index 0000000..84b302f --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/strerr_sys.c @@ -0,0 +1,14 @@ +/* Public domain. */ + +#include "error.h" +#include "strerr.h" + +struct strerr strerr_sys; + +void strerr_sysinit(void) +{ + strerr_sys.who = 0; + strerr_sys.x = error_str(errno); + strerr_sys.y = ""; + strerr_sys.z = ""; +} diff --git a/mirror_runit/runit-2.1.2/src/subgetopt.c b/mirror_runit/runit-2.1.2/src/subgetopt.c new file mode 100644 index 0000000..85ace96 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/subgetopt.c @@ -0,0 +1,67 @@ +/* Public domain. */ + +#define SUBGETOPTNOSHORT +#include "subgetopt.h" + +#define sgopt subgetopt +#define optind subgetoptind +#define optpos subgetoptpos +#define optarg subgetoptarg +#define optproblem subgetoptproblem +#define optdone subgetoptdone + +int optind = 1; +int optpos = 0; +const char *optarg = 0; +int optproblem = 0; +int optdone = SUBGETOPTDONE; + +int sgopt(int argc,const char *const *argv,const char *opts) +{ + int c; + const char *s; + + optarg = 0; + if (!argv || (optind >= argc) || !argv[optind]) return optdone; + if (optpos && !argv[optind][optpos]) { + ++optind; + optpos = 0; + if ((optind >= argc) || !argv[optind]) return optdone; + } + if (!optpos) { + if (argv[optind][0] != '-') return optdone; + ++optpos; + c = argv[optind][1]; + if ((c == '-') || (c == 0)) { + if (c) ++optind; + optpos = 0; + return optdone; + } + /* otherwise c is reassigned below */ + } + c = argv[optind][optpos]; + ++optpos; + s = opts; + while (*s) { + if (c == *s) { + if (s[1] == ':') { + optarg = argv[optind] + optpos; + ++optind; + optpos = 0; + if (!*optarg) { + optarg = argv[optind]; + if ((optind >= argc) || !optarg) { /* argument past end */ + optproblem = c; + return '?'; + } + ++optind; + } + } + return c; + } + ++s; + if (*s == ':') ++s; + } + optproblem = c; + return '?'; +} diff --git a/mirror_runit/runit-2.1.2/src/subgetopt.h b/mirror_runit/runit-2.1.2/src/subgetopt.h new file mode 100644 index 0000000..41ad26a --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/subgetopt.h @@ -0,0 +1,26 @@ +/* Public domain. */ + +#ifndef SUBGETOPT_H +#define SUBGETOPT_H + +#ifndef SUBGETOPTNOSHORT +#define sgopt subgetopt +#define sgoptarg subgetoptarg +#define sgoptind subgetoptind +#define sgoptpos subgetoptpos +#define sgoptproblem subgetoptproblem +#define sgoptprogname subgetoptprogname +#define sgoptdone subgetoptdone +#endif + +#define SUBGETOPTDONE -1 + +extern int subgetopt(int,const char *const *,const char *); +extern const char *subgetoptarg; +extern int subgetoptind; +extern int subgetoptpos; +extern int subgetoptproblem; +extern const char *subgetoptprogname; +extern int subgetoptdone; + +#endif diff --git a/mirror_runit/runit-2.1.2/src/sv.c b/mirror_runit/runit-2.1.2/src/sv.c new file mode 100644 index 0000000..0125795 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/sv.c @@ -0,0 +1,394 @@ +#include +#include +#include +#include "str.h" +#include "strerr.h" +#include "error.h" +#include "sgetopt.h" +#include "open.h" +#include "env.h" +#include "buffer.h" +#include "fmt.h" +#include "scan.h" +#include "tai.h" +#include "taia.h" +#include "wait.h" + +#define USAGE " [-v] [-w sec] command service ..." +#define USAGELSB " [-w sec] command" + +#define VERSION "$Id: 900314260c6d52c986c5357673bea2f3bd3f4698 $" + +#define FATAL "fatal: " +#define FAIL "fail: " +#define WARN "warning: " +#define OK "ok: " +#define RUN "run: " +#define FINISH "finish: " +#define DOWN "down: " +#define TIMEOUT "timeout: " +#define KILL "kill: " + +char *progname; +char *action; +char *acts; +char *varservice ="/service/"; +char **service; +char **servicex; +unsigned int services; +unsigned int rc =0; +unsigned int lsb; +unsigned int verbose =0; +unsigned long wait =7; +unsigned int kll =0; +unsigned int islog =0; +struct taia tstart, tnow, tdiff; +struct tai tstatus; + +int (*act)(char*) =0; +int (*cbk)(char*) =0; + +int curdir, fd, r; +char svstatus[20]; +char sulong[FMT_ULONG]; + +void usage() { + if (!lsb) strerr_die4x(100, "usage: ", progname, USAGE, "\n"); + strerr_die4x(2, "usage: ", progname, USAGELSB, "\n"); +} +void done(unsigned int e) { if (curdir != -1) fchdir(curdir); _exit(e); } +void fatal(char *m1) { + strerr_warn3(FATAL, m1, ": ", &strerr_sys); + done(lsb ? 151 : 100); +} +void fatal2(char *m1, char *m2) { + strerr_warn4(FATAL, m1, m2, ": ", &strerr_sys); + done(lsb ? 151 : 100); +} +void out(char *p, char *m1) { + buffer_puts(buffer_1, p); + buffer_puts(buffer_1, *service); + if (islog) buffer_puts(buffer_1, "/log"); + buffer_puts(buffer_1, ": "); + buffer_puts(buffer_1, m1); + if (errno) { + buffer_puts(buffer_1, ": "); + buffer_puts(buffer_1, error_str(errno)); + } + buffer_puts(buffer_1, "\n"); + buffer_flush(buffer_1); +} +void fail(char *m1) { ++rc; out(FAIL, m1); } +void failx(char *m1) { errno =0; fail(m1); } +void warn(char *m1) { ++rc; out(WARN, m1); } +void warnx(char *m1) { errno =0; warn(m1); } +void ok(char *m1) { errno =0; out(OK, m1); } + +void outs(const char *s) { buffer_puts(buffer_1, s); } +void flush(const char *s) { outs(s); buffer_flush(buffer_1); } +void outs2(const char *s) { buffer_puts(buffer_2, s); } +void flush2(const char *s) { outs2(s); buffer_flush(buffer_2); } + +int svstatus_get() { + if ((fd =open_write("supervise/ok")) == -1) { + if (errno == error_nodevice) { + *acts == 'x' ? ok("runsv not running") : failx("runsv not running"); + return(0); + } + warn("unable to open supervise/ok"); + return(-1); + } + close(fd); + if ((fd =open_read("supervise/status")) == -1) { + warn("unable to open supervise/status"); + return(-1); + } + r =read(fd, svstatus, 20); + close(fd); + switch(r) { + case 20: break; + case -1: warn("unable to read supervise/status"); return(-1); + default: warnx("unable to read supervise/status: bad format"); return(-1); + } + return(1); +} +unsigned int svstatus_print(char *m) { + int pid; + int normallyup =0; + struct stat s; + + if (stat("down", &s) == -1) { + if (errno != error_noent) { + outs2(WARN); outs2("unable to stat "); outs2(*service); outs2("/down: "); + outs2(error_str(errno)); flush2("\n"); + return(0); + } + normallyup =1; + } + pid =(unsigned char) svstatus[15]; + pid <<=8; pid +=(unsigned char)svstatus[14]; + pid <<=8; pid +=(unsigned char)svstatus[13]; + pid <<=8; pid +=(unsigned char)svstatus[12]; + tai_unpack(svstatus, &tstatus); + switch (svstatus[19]) { + case 0: outs(DOWN); break; + case 1: outs(RUN); break; + case 2: outs(FINISH); break; + } + outs(m); outs(": "); + if (svstatus[19]) { + outs("(pid "); sulong[fmt_ulong(sulong, pid)] =0; + outs(sulong); outs(") "); + } + buffer_put(buffer_1, sulong, + fmt_ulong(sulong, tnow.sec.x < tstatus.x ? 0 : tnow.sec.x -tstatus.x)); + outs("s"); + if (pid && !normallyup) outs(", normally down"); + if (!pid && normallyup) outs(", normally up"); + if (pid && svstatus[16]) outs(", paused"); + if (!pid && (svstatus[17] == 'u')) outs(", want up"); + if (pid && (svstatus[17] == 'd')) outs(", want down"); + if (pid && svstatus[18]) outs(", got TERM"); + return(pid ? 1 : 2); +} +int status(char *unused) { + int rc; + + rc =svstatus_get(); + switch(rc) { case -1: if (lsb) done(4); case 0: return(0); } + rc =svstatus_print(*service); + islog =1; + if (chdir("log") == -1) { + if (errno != error_noent) { + outs("; "); + warn("unable to change directory"); + } + else outs("\n"); + } + else { + outs("; "); + if (svstatus_get()) { rc =svstatus_print("log"); outs("\n"); } + } + islog =0; + flush(""); + if (lsb) switch(rc) { case 1: done(0); case 2: done(3); case 0: done(4); } + return(rc); +} + +int checkscript() { + char *prog[2]; + struct stat s; + int pid, w; + + if (stat("check", &s) == -1) { + if (errno == error_noent) return(1); + outs2(WARN); outs2("unable to stat "); outs2(*service); outs2("/check: "); + outs2(error_str(errno)); flush2("\n"); + return(0); + } + /* if (!(s.st_mode & S_IXUSR)) return(1); */ + if ((pid =fork()) == -1) { + outs2(WARN); outs2("unable to fork for "); outs2(*service); + outs2("/check: "); outs2(error_str(errno)); flush2("\n"); + return(0); + } + if (!pid) { + prog[0] ="./check"; + prog[1] =0; + close(1); + execve("check", prog, environ); + outs2(WARN); outs2("unable to run "); outs2(*service); outs2("/check: "); + outs2(error_str(errno)); flush2("\n"); + _exit(0); + } + while (wait_pid(&w, pid) == -1) { + if (errno == error_intr) continue; + outs2(WARN); outs2("unable to wait for child "); outs2(*service); + outs2("/check: "); outs2(error_str(errno)); flush2("\n"); + return(0); + } + return(!wait_exitcode(w)); +} + +int check(char *a) { + unsigned int pid; + + if ((r =svstatus_get()) == -1) return(-1); + while (*a) { + if (r == 0) { if (*a == 'x') return(1); return(-1); } + pid =(unsigned char)svstatus[15]; + pid <<=8; pid +=(unsigned char)svstatus[14]; + pid <<=8; pid +=(unsigned char)svstatus[13]; + pid <<=8; pid +=(unsigned char)svstatus[12]; + switch (*a) { + case 'x': return(0); + case 'u': + if (!pid || svstatus[19] != 1) return(0); + if (!checkscript()) return(0); + break; + case 'd': if (pid || svstatus[19] != 0) return(0); break; + case 'C': if (pid) if (!checkscript()) return(0); break; + case 't': + case 'k': + if (!pid && svstatus[17] == 'd') break; + tai_unpack(svstatus, &tstatus); + if ((tstart.sec.x > tstatus.x) || !pid || svstatus[18] || !checkscript()) + return(0); + break; + case 'o': + tai_unpack(svstatus, &tstatus); + if ((!pid && tstart.sec.x > tstatus.x) || (pid && svstatus[17] != 'd')) + return(0); + break; + case 'p': if (pid && !svstatus[16]) return(0); break; + case 'c': if (pid && svstatus[16]) return(0); break; + } + ++a; + } + outs(OK); svstatus_print(*service); flush("\n"); + return(1); +} +int control(char *a) { + if (svstatus_get() <= 0) return(-1); + if (svstatus[17] == *a) + if (*a != 'd' || svstatus[18] == 1) return(0); /* once w/o term */ + if ((fd =open_write("supervise/control")) == -1) { + if (errno != error_nodevice) + warn("unable to open supervise/control"); + else + *a == 'x' ? ok("runsv not running") : failx("runsv not running"); + return(-1); + } + r =write(fd, a, str_len(a)); + close(fd); + if (r != str_len(a)) { + warn("unable to write to supervise/control"); + return(-1); + } + return(1); +} + +int main(int argc, char **argv) { + unsigned int i, done; + char *x; + + progname =*argv; + for (i =str_len(*argv); i; --i) if ((*argv)[i -1] == '/') break; + *argv +=i; + optprogname =progname =*argv; + service =argv; + services =1; + lsb =(str_diff(progname, "sv")); + if ((x =env_get("SVDIR"))) varservice =x; + if ((x =env_get("SVWAIT"))) scan_ulong(x, &wait); + while ((i =getopt(argc, (const char* const*)argv, "w:vV")) != opteof) { + switch(i) { + case 'w': scan_ulong(optarg, &wait); + case 'v': verbose =1; break; + case 'V': strerr_warn1(VERSION, 0); + case '?': usage(); + } + } + argv +=optind; argc -=optind; + if (!(action =*argv++)) usage(); --argc; + if (!lsb) { service =argv; services =argc; } + if (!*service) usage(); + + taia_now(&tnow); tstart =tnow; + if ((curdir =open_read(".")) == -1) + fatal("unable to open current directory"); + + act =&control; acts ="s"; + if (verbose) cbk =✓ + switch (*action) { + case 'x': case 'e': + acts ="x"; break; + case 'X': case 'E': + acts ="x"; kll =1; cbk =✓ break; + case 'D': + acts ="d"; kll =1; cbk =✓ break; + case 'T': + acts ="tc"; kll =1; cbk =✓ break; + case 't': + if (!str_diff(action, "try-restart")) { acts ="tc"; cbk =✓ break; } + case 'c': + if (!str_diff(action, "check")) { act =0; acts ="C"; cbk =✓ break; } + case 'u': case 'd': case 'o': case 'p': case 'h': + case 'a': case 'i': case 'k': case 'q': case '1': case '2': + action[1] =0; acts =action; break; + case 's': + if (!str_diff(action, "shutdown")) { acts ="x"; cbk =✓ break; } + if (!str_diff(action, "start")) { acts ="u"; cbk =✓ break; } + if (!str_diff(action, "stop")) { acts ="d"; cbk =✓ break; } + if (lsb && str_diff(action, "status")) usage(); + act =&status; cbk =0; break; + case 'r': + if (!str_diff(action, "restart")) { acts ="tcu"; cbk =✓ break; } + if (!str_diff(action, "reload")) { acts ="h"; cbk =✓ break; } + usage(); + case 'f': + if (!str_diff(action, "force-reload")) + { acts ="tc"; kll =1; cbk =✓ break; } + if (!str_diff(action, "force-restart")) + { acts ="tcu"; kll =1; cbk =✓ break; } + if (!str_diff(action, "force-shutdown")) + { acts ="x"; kll =1; cbk =✓ break; } + if (!str_diff(action, "force-stop")) + { acts ="d"; kll =1; cbk =✓ break; } + default: + usage(); + } + + servicex =service; + for (i =0; i < services; ++i) { + if ((**service != '/') && (**service != '.') && **service && + ((*service)[str_len(*service) -1] != '/')) { + if ((chdir(varservice) == -1) || (chdir(*service) == -1)) { + fail("unable to change to service directory"); + *service =0; + } + } + else + if (chdir(*service) == -1) { + fail("unable to change to service directory"); + *service =0; + } + if (*service) if (act && (act(acts) == -1)) *service =0; + if (fchdir(curdir) == -1) fatal("unable to change to original directory"); + service++; + } + + if (*cbk) + for (;;) { + taia_sub(&tdiff, &tnow, &tstart); + service =servicex; done =1; + for (i =0; i < services; ++i, ++service) { + if (!*service) continue; + if ((**service != '/') && (**service != '.')) { + if ((chdir(varservice) == -1) || (chdir(*service) == -1)) { + fail("unable to change to service directory"); + *service =0; + } + } + else + if (chdir(*service) == -1) { + fail("unable to change to service directory"); + *service =0; + } + if (*service) { if (cbk(acts) != 0) *service =0; else done =0; } + if (*service && taia_approx(&tdiff) > wait) { + kll ? outs(KILL) : outs(TIMEOUT); + if (svstatus_get() > 0) { svstatus_print(*service); ++rc; } + flush("\n"); + if (kll) control("k"); + *service =0; + } + if (fchdir(curdir) == -1) + fatal("unable to change to original directory"); + } + if (done) break; + usleep(420000); + taia_now(&tnow); + } + return(rc > 99 ? 99 : rc); +} diff --git a/mirror_runit/runit-2.1.2/src/sv.check b/mirror_runit/runit-2.1.2/src/sv.check new file mode 100755 index 0000000..d3c277c --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/sv.check @@ -0,0 +1,27 @@ +#!/bin/sh +rm -rf "${ctmp}" +trap 'rm -rf "${ctmp}"' EXIT + +sv +echo $? +sv -V +echo $? + +mkdir "${ctmp}" +cat >"${ctmp}"/run <<-\EOT + #!/bin/sh + echo starting + exec sleep 14 + EOT +chmod 700 "${ctmp}"/run +runsv "${ctmp}" & +sleep 1 +test -r "${ctmp}"/supervise/stat || sleep 2 +sv down "${ctmp}" +echo $? +sleep 1 +cat "${ctmp}"/supervise/stat +sv exit "${ctmp}" +echo $? +wait +echo $? diff --git a/mirror_runit/runit-2.1.2/src/sv.dist b/mirror_runit/runit-2.1.2/src/sv.dist new file mode 100644 index 0000000..5b6c3ee --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/sv.dist @@ -0,0 +1,12 @@ +usage: sv [-v] [-w sec] command service ... + +100 +$Id: 900314260c6d52c986c5357673bea2f3bd3f4698 $ +usage: sv [-v] [-w sec] command service ... + +100 +starting +0 +down +0 +0 diff --git a/mirror_runit/runit-2.1.2/src/svlogd.c b/mirror_runit/runit-2.1.2/src/svlogd.c new file mode 100644 index 0000000..90a3321 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/svlogd.c @@ -0,0 +1,848 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pmatch.h" +#include "fmt_ptime.h" +#include "alloc.h" +#include "stralloc.h" +#include "strerr.h" +#include "buffer.h" +#include "sig.h" +#include "env.h" +#include "fd.h" +#include "wait.h" +#include "error.h" +#include "sgetopt.h" +#include "open.h" +#include "openreadclose.h" +#include "coe.h" +#include "lock.h" +#include "str.h" +#include "byte.h" +#include "scan.h" +#include "direntry.h" +#include "taia.h" +#include "fmt.h" +#include "ndelay.h" +#include "iopause.h" + +#define USAGE " [-ttv] [-r c] [-R abc] [-l len] [-b buflen] dir ..." +#define VERSION "$Id: 5e55a90e0a1b35ec47fed3021453c50675ea1117 $" + +#define FATAL "svlogd: fatal: " +#define WARNING "svlogd: warning: " +#define PAUSE "svlogd: pausing: " +#define INFO "svlogd: info: " + +const char *progname; + +unsigned int verbose =0; +unsigned int timestamp =0; +unsigned long linemax =1000; +unsigned long buflen =1024; +unsigned long linelen; + +const char *replace =""; +char repl =0; + +const char **fndir; +int fdwdir; +struct stat st; +stralloc sa; +int wstat; +struct taia now; +struct taia trotate; + +char *databuf; +buffer data; +char *line; +char stamp[FMT_PTIME]; +unsigned int exitasap =0; +unsigned int rotateasap =0; +unsigned int reopenasap =0; +unsigned int linecomplete =1; +unsigned int tmaxflag =0; +int fdudp =-1; +iopause_fd in; + +struct logdir { + int fddir; + char *btmp; + buffer b; + stralloc inst; + unsigned long size; + unsigned long sizemax; + unsigned long nmax; + unsigned long nmin; + unsigned long tmax; + struct taia trotate; + stralloc processor; + int ppid; + char fnsave[FMT_PTIME]; + char *name; + int fdcur; + int fdlock; + char match; + char matcherr; + struct sockaddr_in udpaddr; + unsigned int udponly; + stralloc prefix; +} *dir; +unsigned int dirn =0; + +void usage() { strerr_die4x(111, "usage: ", progname, USAGE, "\n"); } +void die_nomem() { strerr_die2x(111, FATAL, "out of memory."); } +void fatal(char *m0) { strerr_die3sys(111, FATAL, m0, ": "); } +void fatalx(char *m0) { strerr_die2x(111, FATAL, m0); } +void fatal2(char *m0, char *m1) { + strerr_die5sys(111, FATAL, m0, ": ", m1, ": "); +} +void warn(char *m0) { strerr_warn3(WARNING, m0, ": ", &strerr_sys); } +void warn2(char *m0, char *m1) { + strerr_warn5(WARNING, m0, ": ", m1, ": ", &strerr_sys); +} +void warnx(char *m0, char *m1) { strerr_warn4(WARNING, m0, ": ", m1, 0); } +void pause_nomem() { strerr_warn2(PAUSE, "out of memory.", 0); sleep(3); } +void pause1(char *m0) { strerr_warn3(PAUSE, m0, ": ", &strerr_sys); sleep(3); } +void pause2(char *m0, char *m1) { + strerr_warn5(PAUSE, m0, ": ", m1, ": ", &strerr_sys); + sleep(3); +} + +unsigned int processorstart(struct logdir *ld) { + int pid; + + if (! ld->processor.len) return(0); + if (ld->ppid) { + warnx("processor already running", ld->name); + return(0); + } + while ((pid =fork()) == -1) + pause2("unable to fork for processor", ld->name); + if (! pid) { + char *prog[4]; + int fd; + + /* child */ + sig_uncatch(sig_term); + sig_uncatch(sig_alarm); + sig_uncatch(sig_hangup); + sig_unblock(sig_term); + sig_unblock(sig_alarm); + sig_unblock(sig_hangup); + + if (verbose) + strerr_warn5(INFO, "processing: ", ld->name, "/", ld->fnsave, 0); + if ((fd =open_read(ld->fnsave)) == -1) + fatal2("unable to open input for processor", ld->name); + if (fd_move(0, fd) == -1) + fatal2("unable to move filedescriptor for processor", ld->name); + ld->fnsave[26] ='t'; + if ((fd =open_trunc(ld->fnsave)) == -1) + fatal2("unable to open output for processor", ld->name); + if (fd_move(1, fd) == -1) + fatal2("unable to move filedescriptor for processor", ld->name); + if ((fd =open_read("state")) == -1) { + if (errno == error_noent) { + if ((fd =open_trunc("state")) == -1) + fatal2("unable to create empty state for processor", ld->name); + close(fd); + if ((fd =open_read("state")) == -1) + fatal2("unable to open state for processor", ld->name); + } + else + fatal2("unable to open state for processor", ld->name); + } + if (fd_move(4, fd) == -1) + fatal2("unable to move filedescriptor for processor", ld->name); + if ((fd =open_trunc("newstate")) == -1) + fatal2("unable to open newstate for processor", ld->name); + if (fd_move(5, fd) == -1) + fatal2("unable to move filedescriptor for processor", ld->name); + + prog[0] = "sh"; + prog[1] = "-c"; + prog[2] = ld->processor.s; + prog[3] = 0; + execve("/bin/sh", prog, environ); + fatal2("unable to run processor", ld->name); + } + ld->ppid =pid; + return(1); +} +unsigned int processorstop(struct logdir *ld) { + char f[28]; + + if (ld->ppid) { + sig_unblock(sig_hangup); + while (wait_pid(&wstat, ld->ppid) == -1) + pause2("error waiting for processor", ld->name); + sig_block(sig_hangup); + ld->ppid =0; + } + if (ld->fddir == -1) return(1); + while (fchdir(ld->fddir) == -1) + pause2("unable to change directory, want processor", ld->name); + if (wait_exitcode(wstat) != 0) { + warnx("processor failed, restart", ld->name); + ld->fnsave[26] ='t'; + unlink(ld->fnsave); + ld->fnsave[26] ='u'; + processorstart(ld); + while (fchdir(fdwdir) == -1) + pause1("unable to change to initial working directory"); + return(ld->processor.len ? 0 : 1); + } + ld->fnsave[26] ='t'; + byte_copy(f, 26, ld->fnsave); + f[26] ='s'; f[27] =0; + while (rename(ld->fnsave, f) == -1) + pause2("unable to rename processed", ld->name); + while (chmod(f, 0744) == -1) + pause2("unable to set mode of processed", ld->name); + ld->fnsave[26] ='u'; + if (unlink(ld->fnsave) == -1) + strerr_warn5(WARNING, "unable to unlink: ", ld->name, "/", ld->fnsave, 0); + while (rename("newstate", "state") == -1) + pause2("unable to rename state", ld->name); + if (verbose) strerr_warn5(INFO, "processed: ", ld->name, "/", f, 0); + while (fchdir(fdwdir) == -1) + pause1("unable to change to initial working directory"); + return(1); +} + +void rmoldest(struct logdir *ld) { + DIR *d; + direntry *f; + char oldest[FMT_PTIME]; + int n =0; + + oldest[0] ='A'; oldest[1] =oldest[27] =0; + while (! (d =opendir("."))) + pause2("unable to open directory, want rotate", ld->name); + errno =0; + while ((f =readdir(d))) + if ((f->d_name[0] == '@') && (str_len(f->d_name) == 27)) { + if (f->d_name[26] == 't') { + if (unlink(f->d_name) == -1) + warn2("unable to unlink processor leftover", f->d_name); + } + else { + ++n; + if (str_diff(f->d_name, oldest) < 0) byte_copy(oldest, 27, f->d_name); + } + errno =0; + } + if (errno) warn2("unable to read directory", ld->name); + closedir(d); + + if (ld->nmax && (n > ld->nmax)) { + if (verbose) strerr_warn5(INFO, "delete: ", ld->name, "/", oldest, 0); + if ((*oldest == '@') && (unlink(oldest) == -1)) + warn2("unable to unlink oldest logfile", ld->name); + } +} + +unsigned int rotate(struct logdir *ld) { + char tmp[FMT_ULONG +1]; + + if (ld->fddir == -1) { ld->tmax =0; return(0); } + if (ld->ppid) while(! processorstop(ld)); + + while (fchdir(ld->fddir) == -1) + pause2("unable to change directory, want rotate", ld->name); + + /* create new filename */ + ld->fnsave[25] ='.'; + if (ld->processor.len) + ld->fnsave[26] ='u'; + else + ld->fnsave[26] ='s'; + ld->fnsave[27] =0; + do { + taia_now(&now); + fmt_taia(ld->fnsave, &now); + errno =0; + } while ((stat(ld->fnsave, &st) != -1) || (errno != error_noent)); + + if (ld->tmax && taia_less(&ld->trotate, &now)) { + taia_uint(&ld->trotate, ld->tmax); + taia_add(&ld->trotate, &now, &ld->trotate); + if (taia_less(&ld->trotate, &trotate)) trotate =ld->trotate; + } + + if (ld->size > 0) { + buffer_flush(&ld->b); + while (fsync(ld->fdcur) == -1) + pause2("unable to fsync current logfile", ld->name); + while (fchmod(ld->fdcur, 0744) == -1) + pause2("unable to set mode of current", ld->name); + close(ld->fdcur); + if (verbose) { + tmp[0] =' '; tmp[fmt_ulong(tmp +1, ld->size) +1] =0; + strerr_warn6(INFO, "rename: ", ld->name, "/current ", + ld->fnsave, tmp, 0); + } + while (rename("current", ld->fnsave) == -1) + pause2("unable to rename current", ld->name); + while ((ld->fdcur =open_append("current")) == -1) + pause2("unable to create new current", ld->name); + coe(ld->fdcur); + ld->size =0; + while (fchmod(ld->fdcur, 0644) == -1) + pause2("unable to set mode of current", ld->name); + rmoldest(ld); + processorstart(ld); + } + + while (fchdir(fdwdir) == -1) + pause1("unable to change to initial working directory"); + return(1); +} + +int buffer_pwrite(int n, char *s, unsigned int len) { + int i; + + if ((dir +n)->sizemax) { + if ((dir +n)->size >= (dir +n)->sizemax) rotate(dir +n); + if (len > ((dir +n)->sizemax -(dir +n)->size)) + len =(dir +n)->sizemax -(dir +n)->size; + } + while ((i =write((dir +n)->fdcur, s, len)) == -1) { + if ((errno == ENOSPC) && ((dir +n)->nmin < (dir +n)->nmax)) { + DIR *d; + direntry *f; + char oldest[FMT_PTIME]; + int j =0; + + while (fchdir((dir +n)->fddir) == -1) + pause2("unable to change directory, want remove old logfile", + (dir +n)->name); + oldest[0] ='A'; oldest[1] =oldest[27] =0; + while (! (d =opendir("."))) + pause2("unable to open directory, want remove old logfile", + (dir +n)->name); + errno =0; + while ((f =readdir(d))) + if ((f->d_name[0] == '@') && (str_len(f->d_name) == 27)) { + ++j; + if (str_diff(f->d_name, oldest) < 0) + byte_copy(oldest, 27, f->d_name); + } + if (errno) warn2("unable to read directory, want remove old logfile", + (dir +n)->name); + closedir(d); + errno =ENOSPC; + if (j > (dir +n)->nmin) + if (*oldest == '@') { + strerr_warn5(WARNING, "out of disk space, delete: ", (dir +n)->name, + "/", oldest, 0); + errno =0; + if (unlink(oldest) == -1) { + warn2("unable to unlink oldest logfile", (dir +n)->name); + errno =ENOSPC; + } + while (fchdir(fdwdir) == -1) + pause1("unable to change to initial working directory"); + } + } + if (errno) pause2("unable to write to current", (dir +n)->name); + } + + (dir +n)->size +=i; + if ((dir +n)->sizemax) + if (s[i -1] == '\n') + if ((dir +n)->size >= ((dir +n)->sizemax -linemax)) rotate(dir +n); + return(i); +} + +void logdir_close(struct logdir *ld) { + if (ld->fddir == -1) return; + if (verbose) strerr_warn3(INFO, "close: ", ld->name, 0); + close(ld->fddir); + ld->fddir =-1; + if (ld->fdcur == -1) return; /* impossible */ + buffer_flush(&ld->b); + while (fsync(ld->fdcur) == -1) + pause2("unable to fsync current logfile", ld->name); + while (fchmod(ld->fdcur, 0744) == -1) + pause2("unable to set mode of current", ld->name); + close(ld->fdcur); + ld->fdcur =-1; + if (ld->fdlock == -1) return; /* impossible */ + close(ld->fdlock); + ld->fdlock =-1; + while (! stralloc_copys(&ld->processor, "")) pause_nomem(); +} + +/* taken from libdjbdns */ +unsigned int ip4_scan(const char *s,char ip[4]) +{ + unsigned int i; + unsigned int len; + unsigned long u; + + len = 0; + i = scan_ulong(s,&u); if (!i) return 0; ip[0] = u; s += i; len += i; + if (*s != '.') return 0; ++s; ++len; + i = scan_ulong(s,&u); if (!i) return 0; ip[1] = u; s += i; len += i; + if (*s != '.') return 0; ++s; ++len; + i = scan_ulong(s,&u); if (!i) return 0; ip[2] = u; s += i; len += i; + if (*s != '.') return 0; ++s; ++len; + i = scan_ulong(s,&u); if (!i) return 0; ip[3] = u; s += i; len += i; + return len; +} + +unsigned int logdir_open(struct logdir *ld, const char *fn) { + int i; + + if ((ld->fddir =open_read(fn)) == -1) { + warn2("unable to open log directory", (char*)fn); + return(0); + } + coe(ld->fddir); + if (fchdir(ld->fddir) == -1) { + logdir_close(ld); + warn2("unable to change directory", (char*)fn); + return(0); + } + ld->fdlock =open_append("lock"); + if ((ld->fdlock == -1) || (lock_exnb(ld->fdlock) == -1)) { + logdir_close(ld); + warn2("unable to lock directory", (char*)fn); + while (fchdir(fdwdir) == -1) + pause1("unable to change to initial working directory"); + return(0); + } + coe(ld->fdlock); + + ld->size =0; + ld->sizemax =1000000; + ld->nmax =ld->nmin =10; + ld->tmax =0; + ld->name =(char*)fn; + ld->ppid =0; + ld->match ='+'; + ld->udpaddr.sin_port =0; + ld->udponly =0; + while (! stralloc_copys(&ld->prefix, "")) pause_nomem(); + while (! stralloc_copys(&ld->inst, "")) pause_nomem(); + while (! stralloc_copys(&ld->processor, "")) pause_nomem(); + + /* read config */ + if ((i =openreadclose("config", &sa, 128)) == -1) + warn2("unable to read config", ld->name); + if (i != 0) { + int len, c; + unsigned long port; + + if (verbose) strerr_warn4(INFO, "read: ", ld->name, "/config", 0); + for (i =0; i +1 < sa.len; ++i) { + len =byte_chr(&sa.s[i], sa.len -i, '\n'); + sa.s[len +i] =0; + switch(sa.s[i]) { + case '\n': + case '#': + break; + case '+': + case '-': + case 'e': + case 'E': + while (! stralloc_catb(&ld->inst, &sa.s[i], len)) pause_nomem(); + while (! stralloc_0(&ld->inst)) pause_nomem(); + break; + case 's': + switch (sa.s[scan_ulong(&sa.s[i +1], &ld->sizemax) +i +1]) { + case 'm': ld->sizemax *=1024; + case 'k': ld->sizemax *=1024; + } + break; + case 'n': + scan_ulong(&sa.s[i +1], &ld->nmax); + break; + case 'N': + scan_ulong(&sa.s[i +1], &ld->nmin); + break; + case 't': + switch (sa.s[scan_ulong(&sa.s[i +1], &ld->tmax) +i +1]) { + /* case 'd': ld->tmax *=24; */ + case 'h': ld->tmax *=60; + case 'm': ld->tmax *=60; + } + if (ld->tmax) { + taia_uint(&ld->trotate, ld->tmax); + taia_add(&ld->trotate, &now, &ld->trotate); + if (! tmaxflag || taia_less(&ld->trotate, &trotate)) + trotate =ld->trotate; + tmaxflag =1; + } + break; + case '!': + if (len > 1) { + while (! stralloc_copys(&ld->processor, &sa.s[i +1])) pause_nomem(); + while (! stralloc_0(&ld->processor)) pause_nomem(); + } + break; + case 'U': + ld->udponly =1; + case 'u': + if (! (c =ip4_scan(sa.s +i +1, (char *)&ld->udpaddr.sin_addr))) { + warnx("unable to scan ip address", sa.s +i +1); + break; + } + if (sa.s[i +1 +c] == ':') { + scan_ulong(sa.s +i +c +2, &port); + if (port == 0) { + warnx("unable to scan port number", sa.s +i +c +2); + break; + } + } + else + port =514; + ld->udpaddr.sin_port =htons(port); + break; + case 'p': + if (len > 1) { + while (! stralloc_copys(&ld->prefix, &sa.s[i +1])) pause_nomem(); + while (! stralloc_0(&ld->prefix)) pause_nomem(); + } + break; + } + i +=len; + } + } + + /* open current */ + if ((i =stat("current", &st)) != -1) { + if (st.st_size && ! (st.st_mode & S_IXUSR)) { + ld->fnsave[25] ='.'; ld->fnsave[26] ='u'; ld->fnsave[27] =0; + do { + taia_now(&now); + fmt_taia(ld->fnsave, &now); + errno =0; + } while ((stat(ld->fnsave, &st) != -1) || (errno != error_noent)); + while (rename("current", ld->fnsave) == -1) + pause2("unable to rename current", ld->name); + rmoldest(ld); + i =-1; + } + else + ld->size =st.st_size; + } + else + if (errno != error_noent) { + logdir_close(ld); + warn2("unable to stat current", ld->name); + while (fchdir(fdwdir) == -1) + pause1("unable to change to initial working directory"); + return(0); + } + while ((ld->fdcur =open_append("current")) == -1) + pause2("unable to open current", ld->name); + coe(ld->fdcur); + while (fchmod(ld->fdcur, 0644) == -1) + pause2("unable to set mode of current", ld->name); + buffer_init(&ld->b, buffer_pwrite, ld -dir, ld->btmp, buflen); + + if (verbose) { + if (i == 0) strerr_warn4(INFO, "append: ", ld->name, "/current", 0); + else strerr_warn4(INFO, "new: ", ld->name, "/current", 0); + } + + while (fchdir(fdwdir) == -1) + pause1("unable to change to initial working directory"); + return(1); +} + +void logdirs_reopen(void) { + int l; + int ok =0; + + tmaxflag =0; + taia_now(&now); + for (l =0; l < dirn; ++l) { + logdir_close(&dir[l]); + if (logdir_open(&dir[l], fndir[l])) ok =1; + } + if (! ok) fatalx("no functional log directories."); +} + +int buffer_pread(int fd, char *s, unsigned int len) { + int i; + + for (i =0; i < dirn; ++i) buffer_flush(&dir[i].b); + if (rotateasap) { + for (i =0; i < dirn; ++i) rotate(dir +i); + rotateasap =0; + } + if (exitasap) { + if (linecomplete) return(0); + len =1; + } + if (reopenasap) { + logdirs_reopen(); + reopenasap =0; + } + taia_now(&now); + taia_uint(&trotate, 2744); + taia_add(&trotate, &now, &trotate); + for (i =0; i < dirn; ++i) + if ((dir +i)->tmax) { + if (taia_less(&dir[i].trotate, &now)) rotate(dir +i); + if (taia_less(&dir[i].trotate, &trotate)) trotate =dir[i].trotate; + } + sig_unblock(sig_term); + sig_unblock(sig_child); + sig_unblock(sig_alarm); + sig_unblock(sig_hangup); + iopause(&in, 1, &trotate, &now); + sig_block(sig_term); + sig_block(sig_child); + sig_block(sig_alarm); + sig_block(sig_hangup); + i =read(fd, s, len); + if (i == -1) { + if (errno == error_again) errno =error_intr; + if (errno != error_intr) warn("unable to read standard input"); + } + if (i > 0) linecomplete =(s[i -1] == '\n'); + return(i); +} +void sig_term_handler(void) { + if (verbose) strerr_warn2(INFO, "sigterm received.", 0); + exitasap =1; +} +void sig_child_handler(void) { + int pid, l; + + if (verbose) strerr_warn2(INFO, "sigchild received.", 0); + while ((pid =wait_nohang(&wstat)) > 0) + for (l =0; l < dirn; ++l) + if (dir[l].ppid == pid) { + dir[l].ppid =0; + processorstop(&dir[l]); + break; + } +} +void sig_alarm_handler(void) { + if (verbose) strerr_warn2(INFO, "sigalarm received.", 0); + rotateasap =1; +} +void sig_hangup_handler(void) { + if (verbose) strerr_warn2(INFO, "sighangup received.", 0); + reopenasap =1; +} + +void logmatch(struct logdir *ld) { + int i; + + ld->match ='+'; + ld->matcherr ='E'; + for (i =0; i < ld->inst.len; ++i) { + switch(ld->inst.s[i]) { + case '+': + case '-': + if (pmatch(&ld->inst.s[i +1], line, linelen)) + ld->match =ld->inst.s[i]; + break; + case 'e': + case 'E': + if (pmatch(&ld->inst.s[i +1], line, linelen)) + ld->matcherr =ld->inst.s[i]; + break; + } + i +=byte_chr(&ld->inst.s[i], ld->inst.len -i, 0); + } +} +int main(int argc, const char **argv) { + int i; + int opt; + + progname =*argv; + + while ((opt =getopt(argc, argv, "R:r:l:b:tvV")) != opteof) { + switch(opt) { + case 'R': + replace =optarg; + if (! repl) repl ='_'; + break; + case 'r': + repl =*optarg; + if (! repl || *(optarg +1)) usage(); + break; + case 'l': + scan_ulong(optarg, &linemax); + if (linemax == 0) linemax =1000; + break; + case 'b': + scan_ulong(optarg, &buflen); + if (buflen == 0) buflen =1024; + break; + case 't': + if (++timestamp > 3) timestamp =3; + break; + case 'v': + ++verbose; + break; + case 'V': strerr_warn1(VERSION, 0); + case '?': usage(); + } + } + argv +=optind; + + dirn =argc -optind; + if (dirn <= 0) usage(); + if (buflen <= linemax) usage(); + if ((fdwdir =open_read(".")) == -1) + fatal("unable to open current working directory"); + coe(fdwdir); + dir =(struct logdir*)alloc(dirn *sizeof(struct logdir)); + if (! dir) die_nomem(); + for (i =0; i < dirn; ++i) { + dir[i].fddir =-1; dir[i].fdcur =-1; + dir[i].btmp =(char*)alloc(buflen *sizeof(char)); + if (! dir[i].btmp) die_nomem(); + dir[i].ppid =0; + } + databuf =(char*)alloc(buflen *sizeof(char)); + if (! databuf) die_nomem(); + buffer_init(&data, buffer_pread, 0, databuf, buflen); + line =(char*)alloc(linemax *sizeof(char)); + if (! line) die_nomem(); + fndir =argv; + in.fd =0; + in.events =IOPAUSE_READ; + ndelay_on(in.fd); + + sig_block(sig_term); + sig_block(sig_child); + sig_block(sig_alarm); + sig_block(sig_hangup); + sig_catch(sig_term, sig_term_handler); + sig_catch(sig_child, sig_child_handler); + sig_catch(sig_alarm, sig_alarm_handler); + sig_catch(sig_hangup, sig_hangup_handler); + + logdirs_reopen(); + + for(;;) { + char ch; + + linelen =0; + for (linelen =0; linelen < linemax; ++linelen) { + if (buffer_GETC(&data, &ch) <= 0) { + exitasap =1; + break; + } + if (! linelen && timestamp) { + taia_now(&now); + switch (timestamp) { + case 1: fmt_taia(stamp, &now); break; + case 2: fmt_ptime(stamp, &now); break; + case 3: fmt_ptime_iso8601(stamp, &now); break; + } + stamp[25] =' '; stamp[26] =0; + } + if (ch == '\n') break; + if (repl) { + if ((ch < 32) || (ch > 126)) + ch =repl; + else + for (i =0; replace[i]; ++i) + if (ch == replace[i]) { + ch =repl; + break; + } + } + line[linelen] =ch; + } + if (exitasap && ! data.p) break; /* data buffer is empty */ + for (i =0; i < dirn; ++i) + if (dir[i].fddir != -1) { + if (dir[i].inst.len) logmatch(&dir[i]); + if (dir[i].matcherr == 'e') { + if (timestamp) buffer_puts(buffer_2, stamp); + if (dir[i].prefix.len) buffer_puts(buffer_2, dir[i].prefix.s); + buffer_put(buffer_2, line, linelen); + if (linelen == linemax) buffer_puts(buffer_2, "..."); + buffer_put(buffer_2, "\n", 1); buffer_flush(buffer_2); + } + if (dir[i].match != '+') continue; + if (dir[i].udpaddr.sin_port != 0) { + fdudp =socket(AF_INET, SOCK_DGRAM, 0); + if (fdudp) + if (ndelay_on(fdudp) == -1) { + close(fdudp); + fdudp =-1; + } + if (fdudp == -1) { + buffer_puts(&dir[i].b, "warning: no udp socket available: "); + if (timestamp) buffer_puts(&dir[i].b, stamp); + if (dir[i].prefix.len) buffer_puts(&dir[i].b, dir[i].prefix.s); + buffer_put(&dir[i].b, line, linelen); + buffer_put(&dir[i].b, "\n", 1); + buffer_flush(&dir[i].b); + } + else { + while (! stralloc_copys(&sa, "")) pause_nomem(); + if (timestamp) + while (! stralloc_cats(&sa, stamp)) pause_nomem(); + if (dir[i].prefix.len) + while (! stralloc_cats(&sa, dir[i].prefix.s)) pause_nomem(); + while (! stralloc_catb(&sa, line, linelen)) pause_nomem(); + if (linelen == linemax) + while (! stralloc_cats(&sa, "...")) pause_nomem(); + while (! stralloc_append(&sa, "\n")) pause_nomem(); + if (sendto(fdudp, sa.s, sa.len, 0, + (struct sockaddr *)&dir[i].udpaddr, + sizeof(dir[i].udpaddr)) != sa.len) { + buffer_puts(&dir[i].b, "warning: failure sending through udp: "); + buffer_put(&dir[i].b, sa.s, sa.len); + buffer_flush(&dir[i].b); + } + close(fdudp); + } + } + if (! dir[i].udponly) { + if (timestamp) buffer_puts(&dir[i].b, stamp); + if (dir[i].prefix.len) buffer_puts(&dir[i].b, dir[i].prefix.s); + buffer_put(&dir[i].b, line, linelen); + } + } + if (linelen == linemax) + for (;;) { + if (buffer_GETC(&data, &ch) <= 0) { + exitasap =1; + break; + } + if (ch == '\n') break; + for (i =0; i < dirn; ++i) + if (dir[i].fddir != -1) { + if (dir[i].match != '+') continue; + if (! dir[i].udponly) buffer_PUTC(&dir[i].b, ch); + } + } + for (i =0; i < dirn; ++i) + if (dir[i].fddir != -1) { + if (dir[i].match != '+') continue; + if (! dir[i].udponly) { + ch ='\n'; + buffer_PUTC(&dir[i].b, ch); + buffer_flush(&dir[i].b); + } + } + } + + for (i =0; i < dirn; ++i) { + if (dir[i].ppid) while (! processorstop(&dir[i])); + logdir_close(&dir[i]); + } + _exit(0); +} diff --git a/mirror_runit/runit-2.1.2/src/svlogd.check b/mirror_runit/runit-2.1.2/src/svlogd.check new file mode 100755 index 0000000..7d926ef --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/svlogd.check @@ -0,0 +1,27 @@ +#!/bin/sh +rm -rf "${ctmp}" + +svlogd +echo $? +svlogd -V +echo $? + +mkdir "${ctmp}" +echo foo |svlogd "${ctmp}" +echo $? +cat "${ctmp}"/current + +( echo bar; echo baz ) |svlogd "${ctmp}" +echo $? +cat "${ctmp}"/current + +( echo foo; echo bar; echo baz ) |svlogd -r: -R fb "${ctmp}" +echo $? +cat "${ctmp}"/current + +echo t2 >"${ctmp}"/config +( echo foo; sleep 3 ) |svlogd "${ctmp}" +echo $? +cat "${ctmp}"/current + +rm -rf "${ctmp}" diff --git a/mirror_runit/runit-2.1.2/src/svlogd.dist b/mirror_runit/runit-2.1.2/src/svlogd.dist new file mode 100644 index 0000000..b3329e6 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/svlogd.dist @@ -0,0 +1,21 @@ +usage: svlogd [-ttv] [-r c] [-R abc] [-l len] [-b buflen] dir ... + +111 +$Id: 5e55a90e0a1b35ec47fed3021453c50675ea1117 $ +usage: svlogd [-ttv] [-r c] [-R abc] [-l len] [-b buflen] dir ... + +111 +0 +foo +0 +foo +bar +baz +0 +foo +bar +baz +:oo +:ar +:az +0 diff --git a/mirror_runit/runit-2.1.2/src/svwaitdown.c b/mirror_runit/runit-2.1.2/src/svwaitdown.c new file mode 100644 index 0000000..21a2c2c --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/svwaitdown.c @@ -0,0 +1,177 @@ +#include +#include "strerr.h" +#include "error.h" +#include "sgetopt.h" +#include "scan.h" +#include "open.h" +#include "tai.h" +#include "buffer.h" + +#define FATAL "svwaitdown: fatal: " +#define WARN "svwaitdown: warning: " +#define INFO "svwaitdown: " +#define USAGE " [-v] [-t 1..6000] service ..." + +#define VERSION "$Id: 6cd3efc2e15e5e3d2fa60cd0c028e60958676ec7 $" + +const char *progname; +const char * const *dir; +unsigned int rc =0; + +void fatal(const char *m) { strerr_die3sys(111, FATAL, m, ": "); } +void warn(const char *s1, const char *s2, struct strerr *e) { + dir++; rc++; + strerr_warn3(WARN, s1, s2, e); +} +void usage() { strerr_die4x(1, "usage: ", progname, USAGE, "\n"); } + +int main(int argc, const char * const *argv) { + int opt; + unsigned long sec =600; + int verbose =0; + int doexit =0; + int dokill =0; + int wdir; + int fd; + char status[20]; + int r; + unsigned long pid; + struct tai start; + struct tai now; + + progname =*argv; + + while ((opt =getopt(argc, argv, "t:xkvV")) != opteof) { + switch(opt) { + case 't': + scan_ulong(optarg, &sec); + if ((sec < 1) || (sec > 6000)) usage(); + break; + case 'x': + doexit =1; + break; + case 'k': + dokill =1; + break; + case 'v': + verbose =1; + break; + case 'V': + strerr_warn1(VERSION, 0); + case '?': + usage(); + } + } + argv +=optind; + if (! argv || ! *argv) usage(); + + if ((wdir =open_read(".")) == -1) + fatal("unable to open current working directory"); + + for (dir =argv; *dir; ++dir) { + if (dir != argv) + if (fchdir(wdir) == -1) fatal("unable to switch to starting directory"); + if (chdir(*dir) == -1) continue; /* bummer */ + if ((fd =open_write("supervise/control")) == -1) continue; /* bummer */ + if (write(fd, "dx", 1 +doexit) != (1 +doexit)) { + close(fd); continue; /* bummer */ + } + close(fd); + } + dir =argv; + + tai_now(&start); + while (*dir) { + if (fchdir(wdir) == -1) fatal("unable to switch to starting directory"); + if (chdir(*dir) == -1) { + warn(*dir, ": unable to change directory: ", &strerr_sys); + continue; + } + if ((fd =open_write("supervise/ok")) == -1) { + if (errno == error_nodevice) { + if (verbose) strerr_warn3(INFO, *dir, ": runsv not running.", 0); + dir++; + } + else + warn(*dir, ": unable to open supervise/ok: ", &strerr_sys); + continue; + } + close(fd); + + if ((fd =open_read("supervise/status")) == -1) { + warn(*dir, "unable to open supervise/status: ", &strerr_sys); + continue; + } + r =buffer_unixread(fd, status, 20); + close(fd); + if ((r < 18) || (r == 19)) { /* supervise compatibility */ + if (r == -1) + warn(*dir, "unable to read supervise/status: ", &strerr_sys); + else + warn(*dir, ": unable to read supervise/status: bad format.", 0); + continue; + } + pid =(unsigned char)status[15]; + pid <<=8; pid +=(unsigned char)status[14]; + pid <<=8; pid +=(unsigned char)status[13]; + pid <<=8; pid +=(unsigned char)status[12]; + + if (! doexit && ! pid) { + /* ok, service is down */ + if (verbose) strerr_warn3(INFO, *dir, ": down.", 0); + dir++; + continue; + } + + if (status[17] != 'd') { /* catch previous failures */ + if ((fd =open_write("supervise/control")) == -1) { + warn(*dir, ": unable to open supervise/control: ", &strerr_sys); + continue; + } + if (write(fd, "dx", 1 +doexit) != (1 +doexit)) { + warn(*dir, ": unable to write to supervise/control: ", &strerr_sys); + close(fd); + continue; + } + close(fd); + } + + tai_now(&now); + tai_sub(&now, &now, &start); + if (tai_approx(&now) >= sec) { + /* timeout */ + if (verbose) strerr_warn2(INFO, "timeout.", 0); + if (dokill) { + if (chdir(*dir) == -1) { + warn(*dir, ": unable to change directory: ", &strerr_sys); + continue; + } + if ((fd =open_write("supervise/control")) == -1) { + if (errno == error_nodevice) { + if (verbose) + strerr_warn3(INFO, *dir, ": runsv not running.", 0); + dir++; + } + else + warn(*argv, ": unable to open supervise/control: ", &strerr_sys); + continue; + } + if (write(fd, "k", 1) != 1) + warn(*argv, ": unable to write to supervise/control: ", &strerr_sys); + else + strerr_warn3(INFO, *dir, ": killed.", 0); + close(fd); + dir++; + if (! *dir) _exit(111); + continue; + } + _exit(111); + } + sleep(1); + } + if (fchdir(wdir) == -1) + strerr_warn2(WARN, "unable to switch to starting directory: ", &strerr_sys); + close(wdir); + if (rc > 100) rc =100; + _exit(rc); +} diff --git a/mirror_runit/runit-2.1.2/src/svwaitdown.check b/mirror_runit/runit-2.1.2/src/svwaitdown.check new file mode 100755 index 0000000..5cf6c21 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/svwaitdown.check @@ -0,0 +1,24 @@ +#!/bin/sh +rm -rf "${ctmp}" + +svwaitdown +echo $? +svwaitdown -V +echo $? + +mkdir "${ctmp}" +echo '#!/bin/sh' >"${ctmp}"/run +echo 'echo starting' >>"${ctmp}"/run +echo 'exec sleep 14' >>"${ctmp}"/run +chmod 700 "${ctmp}"/run +runsv "${ctmp}" & +sleep 1 +test -r "${ctmp}"/supervise/stat || sleep 2 +svwaitdown "${ctmp}" +echo $? +svwaitdown -x "${ctmp}" +echo $? +cat "${ctmp}"/supervise/stat +wait +echo $? +rm -rf "${ctmp}" diff --git a/mirror_runit/runit-2.1.2/src/svwaitdown.dist b/mirror_runit/runit-2.1.2/src/svwaitdown.dist new file mode 100644 index 0000000..2d83839 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/svwaitdown.dist @@ -0,0 +1,12 @@ +usage: svwaitdown [-v] [-t 1..6000] service ... + +1 +$Id$ +usage: svwaitdown [-v] [-t 1..6000] service ... + +1 +starting +0 +0 +down +0 diff --git a/mirror_runit/runit-2.1.2/src/svwaitup.c b/mirror_runit/runit-2.1.2/src/svwaitup.c new file mode 100644 index 0000000..e682bbe --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/svwaitup.c @@ -0,0 +1,126 @@ +#include +#include "strerr.h" +#include "error.h" +#include "sgetopt.h" +#include "scan.h" +#include "open.h" +#include "tai.h" +#include "buffer.h" +#include "fmt.h" + +#define FATAL "svwaitup: fatal: " +#define WARN "svwaitup: warning: " +#define INFO "svwaitup: " +#define USAGE " [-v] [-s 1..600] service ..." + +const char *progname; +unsigned long sec =2; +unsigned int rc =0; +const char * const *dir; + +void fatal(const char *m) { strerr_die3sys(111, FATAL, m, ": "); } +void warn(const char *s1, const char *s2, struct strerr *e) { + dir++; rc++; + strerr_warn3(WARN, s1, s2, e); +} +void usage() { strerr_die4x(1, "usage: ", progname, USAGE, "\n"); } + +int main(int argc, const char * const *argv) { + int opt; + int verbose =0; + char status[18]; + int fd; + int is; + int r; + int wdir; + unsigned long pid; + struct tai when; + struct tai now; + char sulong[FMT_ULONG]; + + progname =*argv; + + while ((opt =getopt(argc, argv, "s:vV")) != opteof) { + switch(opt) { + case 's': + scan_ulong(optarg, &sec); + if ((sec < 1) || (sec > 600)) usage(); + break; + case 'v': + verbose =1; + break; + case 'V': + strerr_warn1("$Id: e2d6c574c5e56f9931323fbc0e539c7f9b829b73 $", 0); + case '?': + usage(); + } + } + argv +=optind; + if (! argv || ! *argv) usage(); + + if ((wdir =open_read(".")) == -1) + fatal("unable to open current working directory"); + + dir =argv; + while (*dir) { + if (dir != argv) + if (fchdir(wdir) == -1) fatal("unable to switch to starting directory"); + if (chdir(*dir) == -1) { + warn(*dir, ": unable to change directory: ", &strerr_sys); + continue; + } + if ((fd =open_write("supervise/ok")) == -1) { + if (errno == error_nodevice) + warn(*dir, ": runsv not running.", 0); + else + warn(*dir, ": unable to open supervise/ok: ", &strerr_sys); + continue; + } + close(fd); + + if ((fd =open_read("supervise/status")) == -1) { + warn(*dir, "unable to open supervise/status: ", &strerr_sys); + continue; + } + r =buffer_unixread(fd, status, sizeof status); + close(fd); + if (r < sizeof status) { + if (r == -1) + warn(*dir, "unable to read supervise/status: ", &strerr_sys); + else + warn(*dir, ": unable to read supervise/status: bad format.", 0); + continue; + } + + pid =(unsigned char)status[15]; + pid <<=8; pid +=(unsigned char)status[14]; + pid <<=8; pid +=(unsigned char)status[13]; + pid <<=8; pid +=(unsigned char)status[12]; + if (! pid) { + warn(*dir, ": is down.", 0); + continue; + } + + tai_unpack(status, &when); + tai_now(&now); + if (tai_less(&now, &when)) when =now; + tai_sub(&when, &now, &when); + is =tai_approx(&when); + + if (is >= sec) { + /* ok */ + if (verbose) { + sulong[fmt_ulong(sulong, is)] =0; + strerr_warn5(INFO, *dir, ": is up (", sulong, " seconds)", 0); + } + dir++; + continue; + } + sleep(sec -is); + } + if (fchdir(wdir) == -1) + strerr_warn2(WARN, "unable to switch to starting directory: ", &strerr_sys); + close(wdir); + if (rc > 100) rc =100; + _exit(rc); +} diff --git a/mirror_runit/runit-2.1.2/src/svwaitup.check b/mirror_runit/runit-2.1.2/src/svwaitup.check new file mode 100755 index 0000000..a1be802 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/svwaitup.check @@ -0,0 +1,28 @@ +#!/bin/sh +rm -rf "${ctmp}" + +svwaitup +echo $? +svwaitup -V +echo $? + +mkdir "${ctmp}" +echo '#!/bin/sh' >"${ctmp}"/run +echo 'echo starting' >>"${ctmp}"/run +echo 'exec sleep 14' >>"${ctmp}"/run +chmod 700 "${ctmp}"/run +runsv "${ctmp}" & +sleep 1 +test -r "${ctmp}"/supervise/stat || sleep 2 +svwaitup "${ctmp}" +echo $? +cat "${ctmp}"/supervise/stat +svwaitup -s2 "${ctmp}" +echo $? +cat "${ctmp}"/supervise/stat +runsvctrl exit "${ctmp}" +wait +echo $? +chpst -2 svwaitup -s2 "${ctmp}" +echo $? +rm -rf "${ctmp}" diff --git a/mirror_runit/runit-2.1.2/src/svwaitup.dist b/mirror_runit/runit-2.1.2/src/svwaitup.dist new file mode 100644 index 0000000..692990f --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/svwaitup.dist @@ -0,0 +1,14 @@ +usage: svwaitup [-v] [-s 1..600] service ... + +1 +$Id$ +usage: svwaitup [-v] [-s 1..600] service ... + +1 +starting +0 +run +0 +run +0 +1 diff --git a/mirror_runit/runit-2.1.2/src/tai.h b/mirror_runit/runit-2.1.2/src/tai.h new file mode 100644 index 0000000..1839f76 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/tai.h @@ -0,0 +1,28 @@ +/* Public domain. */ + +#ifndef TAI_H +#define TAI_H + +#include "uint64.h" + +struct tai { + uint64 x; +} ; + +#define tai_unix(t,u) ((void) ((t)->x = 4611686018427387914ULL + (uint64) (u))) + +extern void tai_now(struct tai *); + +#define tai_approx(t) ((double) ((t)->x)) + +extern void tai_add(struct tai *,const struct tai *,const struct tai *); +extern void tai_sub(struct tai *,const struct tai *,const struct tai *); +#define tai_less(t,u) ((t)->x < (u)->x) + +#define TAI_PACK 8 +extern void tai_pack(char *,const struct tai *); +extern void tai_unpack(const char *,struct tai *); + +extern void tai_uint(struct tai *,unsigned int); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/tai_now.c b/mirror_runit/runit-2.1.2/src/tai_now.c new file mode 100644 index 0000000..217ba75 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/tai_now.c @@ -0,0 +1,9 @@ +/* Public domain. */ + +#include +#include "tai.h" + +void tai_now(struct tai *t) +{ + tai_unix(t,time((time_t *) 0)); +} diff --git a/mirror_runit/runit-2.1.2/src/tai_pack.c b/mirror_runit/runit-2.1.2/src/tai_pack.c new file mode 100644 index 0000000..641fa5b --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/tai_pack.c @@ -0,0 +1,18 @@ +/* Public domain. */ + +#include "tai.h" + +void tai_pack(char *s,const struct tai *t) +{ + uint64 x; + + x = t->x; + s[7] = x & 255; x >>= 8; + s[6] = x & 255; x >>= 8; + s[5] = x & 255; x >>= 8; + s[4] = x & 255; x >>= 8; + s[3] = x & 255; x >>= 8; + s[2] = x & 255; x >>= 8; + s[1] = x & 255; x >>= 8; + s[0] = x; +} diff --git a/mirror_runit/runit-2.1.2/src/tai_sub.c b/mirror_runit/runit-2.1.2/src/tai_sub.c new file mode 100644 index 0000000..e891600 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/tai_sub.c @@ -0,0 +1,8 @@ +/* Public domain. */ + +#include "tai.h" + +void tai_sub(struct tai *t,const struct tai *u,const struct tai *v) +{ + t->x = u->x - v->x; +} diff --git a/mirror_runit/runit-2.1.2/src/tai_unpack.c b/mirror_runit/runit-2.1.2/src/tai_unpack.c new file mode 100644 index 0000000..4541ff5 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/tai_unpack.c @@ -0,0 +1,18 @@ +/* Public domain. */ + +#include "tai.h" + +void tai_unpack(const char *s,struct tai *t) +{ + uint64 x; + + x = (unsigned char) s[0]; + x <<= 8; x += (unsigned char) s[1]; + x <<= 8; x += (unsigned char) s[2]; + x <<= 8; x += (unsigned char) s[3]; + x <<= 8; x += (unsigned char) s[4]; + x <<= 8; x += (unsigned char) s[5]; + x <<= 8; x += (unsigned char) s[6]; + x <<= 8; x += (unsigned char) s[7]; + t->x = x; +} diff --git a/mirror_runit/runit-2.1.2/src/taia.h b/mirror_runit/runit-2.1.2/src/taia.h new file mode 100644 index 0000000..3882d1d --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/taia.h @@ -0,0 +1,36 @@ +/* Public domain. */ + +#ifndef TAIA_H +#define TAIA_H + +#include "tai.h" + +struct taia { + struct tai sec; + unsigned long nano; /* 0...999999999 */ + unsigned long atto; /* 0...999999999 */ +} ; + +extern void taia_tai(const struct taia *,struct tai *); + +extern void taia_now(struct taia *); + +extern double taia_approx(const struct taia *); +extern double taia_frac(const struct taia *); + +extern void taia_add(struct taia *,const struct taia *,const struct taia *); +extern void taia_addsec(struct taia *,const struct taia *,int); +extern void taia_sub(struct taia *,const struct taia *,const struct taia *); +extern void taia_half(struct taia *,const struct taia *); +extern int taia_less(const struct taia *,const struct taia *); + +#define TAIA_PACK 16 +extern void taia_pack(char *,const struct taia *); +extern void taia_unpack(const char *,struct taia *); + +#define TAIA_FMTFRAC 19 +extern unsigned int taia_fmtfrac(char *,const struct taia *); + +extern void taia_uint(struct taia *,unsigned int); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/taia_add.c b/mirror_runit/runit-2.1.2/src/taia_add.c new file mode 100644 index 0000000..0ac8e6b --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/taia_add.c @@ -0,0 +1,20 @@ +/* Public domain. */ + +#include "taia.h" + +/* XXX: breaks tai encapsulation */ + +void taia_add(struct taia *t,const struct taia *u,const struct taia *v) +{ + t->sec.x = u->sec.x + v->sec.x; + t->nano = u->nano + v->nano; + t->atto = u->atto + v->atto; + if (t->atto > 999999999UL) { + t->atto -= 1000000000UL; + ++t->nano; + } + if (t->nano > 999999999UL) { + t->nano -= 1000000000UL; + ++t->sec.x; + } +} diff --git a/mirror_runit/runit-2.1.2/src/taia_approx.c b/mirror_runit/runit-2.1.2/src/taia_approx.c new file mode 100644 index 0000000..c6f5f27 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/taia_approx.c @@ -0,0 +1,8 @@ +/* Public domain. */ + +#include "taia.h" + +double taia_approx(const struct taia *t) +{ + return tai_approx(&t->sec) + taia_frac(t); +} diff --git a/mirror_runit/runit-2.1.2/src/taia_frac.c b/mirror_runit/runit-2.1.2/src/taia_frac.c new file mode 100644 index 0000000..f709f3e --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/taia_frac.c @@ -0,0 +1,8 @@ +/* Public domain. */ + +#include "taia.h" + +double taia_frac(const struct taia *t) +{ + return (t->atto * 0.000000001 + t->nano) * 0.000000001; +} diff --git a/mirror_runit/runit-2.1.2/src/taia_less.c b/mirror_runit/runit-2.1.2/src/taia_less.c new file mode 100644 index 0000000..18a9378 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/taia_less.c @@ -0,0 +1,14 @@ +/* Public domain. */ + +#include "taia.h" + +/* XXX: breaks tai encapsulation */ + +int taia_less(const struct taia *t,const struct taia *u) +{ + if (t->sec.x < u->sec.x) return 1; + if (t->sec.x > u->sec.x) return 0; + if (t->nano < u->nano) return 1; + if (t->nano > u->nano) return 0; + return t->atto < u->atto; +} diff --git a/mirror_runit/runit-2.1.2/src/taia_now.c b/mirror_runit/runit-2.1.2/src/taia_now.c new file mode 100644 index 0000000..3a951a9 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/taia_now.c @@ -0,0 +1,15 @@ +/* Public domain. */ + +#include +#include +#include +#include "taia.h" + +void taia_now(struct taia *t) +{ + struct timeval now; + gettimeofday(&now,(struct timezone *) 0); + tai_unix(&t->sec,now.tv_sec); + t->nano = 1000 * now.tv_usec + 500; + t->atto = 0; +} diff --git a/mirror_runit/runit-2.1.2/src/taia_pack.c b/mirror_runit/runit-2.1.2/src/taia_pack.c new file mode 100644 index 0000000..9047da1 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/taia_pack.c @@ -0,0 +1,22 @@ +/* Public domain. */ + +#include "taia.h" + +void taia_pack(char *s,const struct taia *t) +{ + unsigned long x; + + tai_pack(s,&t->sec); + s += 8; + + x = t->atto; + s[7] = x & 255; x >>= 8; + s[6] = x & 255; x >>= 8; + s[5] = x & 255; x >>= 8; + s[4] = x; + x = t->nano; + s[3] = x & 255; x >>= 8; + s[2] = x & 255; x >>= 8; + s[1] = x & 255; x >>= 8; + s[0] = x; +} diff --git a/mirror_runit/runit-2.1.2/src/taia_sub.c b/mirror_runit/runit-2.1.2/src/taia_sub.c new file mode 100644 index 0000000..d902e50 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/taia_sub.c @@ -0,0 +1,23 @@ +/* Public domain. */ + +#include "taia.h" + +/* XXX: breaks tai encapsulation */ + +void taia_sub(struct taia *t,const struct taia *u,const struct taia *v) +{ + unsigned long unano = u->nano; + unsigned long uatto = u->atto; + + t->sec.x = u->sec.x - v->sec.x; + t->nano = unano - v->nano; + t->atto = uatto - v->atto; + if (t->atto > uatto) { + t->atto += 1000000000UL; + --t->nano; + } + if (t->nano > unano) { + t->nano += 1000000000UL; + --t->sec.x; + } +} diff --git a/mirror_runit/runit-2.1.2/src/taia_uint.c b/mirror_runit/runit-2.1.2/src/taia_uint.c new file mode 100644 index 0000000..8b7f2d4 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/taia_uint.c @@ -0,0 +1,12 @@ +/* Public domain. */ + +#include "taia.h" + +/* XXX: breaks tai encapsulation */ + +void taia_uint(struct taia *t,unsigned int s) +{ + t->sec.x = s; + t->nano = 0; + t->atto = 0; +} diff --git a/mirror_runit/runit-2.1.2/src/trycpp.c b/mirror_runit/runit-2.1.2/src/trycpp.c new file mode 100644 index 0000000..e4503d4 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/trycpp.c @@ -0,0 +1,9 @@ +/* Public domain. */ + +int main() +{ +#ifdef NeXT + printf("nextstep\n"); exit(0); +#endif + printf("unknown\n"); exit(0); +} diff --git a/mirror_runit/runit-2.1.2/src/trydrent.c b/mirror_runit/runit-2.1.2/src/trydrent.c new file mode 100644 index 0000000..3333ac0 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/trydrent.c @@ -0,0 +1,10 @@ +/* Public domain. */ + +#include +#include + +void foo() +{ + DIR *dir; + struct dirent *d; +} diff --git a/mirror_runit/runit-2.1.2/src/tryflock.c b/mirror_runit/runit-2.1.2/src/tryflock.c new file mode 100644 index 0000000..a82ffc2 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/tryflock.c @@ -0,0 +1,10 @@ +/* Public domain. */ + +#include +#include +#include + +main() +{ + flock(0,LOCK_EX | LOCK_UN | LOCK_NB); +} diff --git a/mirror_runit/runit-2.1.2/src/trymkffo.c b/mirror_runit/runit-2.1.2/src/trymkffo.c new file mode 100644 index 0000000..9356342 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/trymkffo.c @@ -0,0 +1,9 @@ +/* Public domain. */ + +#include +#include + +void main() +{ + mkfifo("temp-trymkffo",0); +} diff --git a/mirror_runit/runit-2.1.2/src/trypoll.c b/mirror_runit/runit-2.1.2/src/trypoll.c new file mode 100644 index 0000000..6506617 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/trypoll.c @@ -0,0 +1,20 @@ +/* Public domain. */ + +#include +#include +#include + +int main() +{ + struct pollfd x; + + x.fd = open("trypoll.c",O_RDONLY); + if (x.fd == -1) _exit(111); + x.events = POLLIN; + if (poll(&x,1,10) == -1) _exit(1); + if (x.revents != POLLIN) _exit(1); + + /* XXX: try to detect and avoid poll() imitation libraries */ + + _exit(0); +} diff --git a/mirror_runit/runit-2.1.2/src/tryreboot.c b/mirror_runit/runit-2.1.2/src/tryreboot.c new file mode 100644 index 0000000..aefc703 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/tryreboot.c @@ -0,0 +1,6 @@ +#include +#include + +int main(void) { + return(reboot(0)); +} diff --git a/mirror_runit/runit-2.1.2/src/trysgact.c b/mirror_runit/runit-2.1.2/src/trysgact.c new file mode 100644 index 0000000..e264ef2 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/trysgact.c @@ -0,0 +1,12 @@ +/* Public domain. */ + +#include + +main() +{ + struct sigaction sa; + sa.sa_handler = 0; + sa.sa_flags = 0; + sigemptyset(&sa.sa_mask); + sigaction(0,&sa,(struct sigaction *) 0); +} diff --git a/mirror_runit/runit-2.1.2/src/trysgprm.c b/mirror_runit/runit-2.1.2/src/trysgprm.c new file mode 100644 index 0000000..a46c82c --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/trysgprm.c @@ -0,0 +1,12 @@ +/* Public domain. */ + +#include + +main() +{ + sigset_t ss; + + sigemptyset(&ss); + sigaddset(&ss,SIGCHLD); + sigprocmask(SIG_SETMASK,&ss,(sigset_t *) 0); +} diff --git a/mirror_runit/runit-2.1.2/src/tryshsgr.c b/mirror_runit/runit-2.1.2/src/tryshsgr.c new file mode 100644 index 0000000..c5ed6d6 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/tryshsgr.c @@ -0,0 +1,16 @@ +/* Public domain. */ + +int main() +{ + short x[4]; + + x[0] = x[1] = 1; + if (getgroups(1,x) == 0) if (setgroups(1,x) == -1) _exit(1); + + if (getgroups(1,x) == -1) _exit(1); + if (x[1] != 1) _exit(1); + x[1] = 2; + if (getgroups(1,x) == -1) _exit(1); + if (x[1] != 2) _exit(1); + _exit(0); +} diff --git a/mirror_runit/runit-2.1.2/src/trysocketlib.c b/mirror_runit/runit-2.1.2/src/trysocketlib.c new file mode 100644 index 0000000..0fe5d06 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/trysocketlib.c @@ -0,0 +1,12 @@ +#include +#include +#include +#include +#include + +int main(void) { + int s; + + s =socket(AF_INET, SOCK_STREAM, 0); + return(close(s)); +} diff --git a/mirror_runit/runit-2.1.2/src/trysysel.c b/mirror_runit/runit-2.1.2/src/trysysel.c new file mode 100644 index 0000000..5be862d --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/trysysel.c @@ -0,0 +1,11 @@ +/* Public domain. */ + +#include +#include +#include +#include /* SVR4 silliness */ + +void foo() +{ + ; +} diff --git a/mirror_runit/runit-2.1.2/src/tryulong64.c b/mirror_runit/runit-2.1.2/src/tryulong64.c new file mode 100644 index 0000000..003548a --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/tryulong64.c @@ -0,0 +1,13 @@ +/* Public domain. */ + +int main() +{ + unsigned long u; + u = 1; + u += u; u += u; u += u; u += u; u += u; u += u; u += u; u += u; + u += u; u += u; u += u; u += u; u += u; u += u; u += u; u += u; + u += u; u += u; u += u; u += u; u += u; u += u; u += u; u += u; + u += u; u += u; u += u; u += u; u += u; u += u; u += u; u += u; + if (!u) _exit(1); + _exit(0); +} diff --git a/mirror_runit/runit-2.1.2/src/tryuwtmp.c b/mirror_runit/runit-2.1.2/src/tryuwtmp.c new file mode 100644 index 0000000..2192a1e --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/tryuwtmp.c @@ -0,0 +1,9 @@ +#include +#include + +struct utmp ut; + +int main(void) { + char *s =ut.ut_name; + return(0); +} diff --git a/mirror_runit/runit-2.1.2/src/tryuwtmpx.c b/mirror_runit/runit-2.1.2/src/tryuwtmpx.c new file mode 100644 index 0000000..d711c01 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/tryuwtmpx.c @@ -0,0 +1,9 @@ +#include +#include + +struct futmpx ut; + +int main(void) { + char *s =ut.ut_name; + return(0); +} diff --git a/mirror_runit/runit-2.1.2/src/trywaitp.c b/mirror_runit/runit-2.1.2/src/trywaitp.c new file mode 100644 index 0000000..319b81f --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/trywaitp.c @@ -0,0 +1,9 @@ +/* Public domain. */ + +#include +#include + +main() +{ + waitpid(0,0,0); +} diff --git a/mirror_runit/runit-2.1.2/src/uidgid.c b/mirror_runit/runit-2.1.2/src/uidgid.c new file mode 100644 index 0000000..befa754 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/uidgid.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include "uidgid.h" +#include "str.h" +#include "scan.h" + +/* user */ +unsigned int uidgid_get(struct uidgid *u, char *ug) { + struct passwd *pwd =0; + + if (! (pwd =getpwnam(ug))) return(0); + u->gid[0] =pwd->pw_gid; u->gids =1; + u->uid =pwd->pw_uid; + return(1); +} + +/* uid:gid[:gid[:gid]...] */ +unsigned int uidgids_set(struct uidgid *u, char *ug) { + unsigned long id; + int i; + + if (*(ug +=scan_ulong(ug, &id)) != ':') return(0); + u->uid =(uid_t)id; + ++ug; + for (i =0; i < 60; ++i, ++ug) { + ug +=scan_ulong(ug, &id); + u->gid[i] =(gid_t)id; + if (*ug != ':') { ++i; break; } + } + u->gid[i] =0; + u->gids =i; + if (*ug) return(0); + return(1); +} + +/* [:]user[:group[:group]...] */ +unsigned int uidgids_get(struct uidgid *u, char *ug) { + char *g =0; + struct passwd *pwd =0; + struct group *gr =0; + int i, d =0; + + if (*ug == ':') return(uidgids_set(u, ug +1)); + if (ug[(d =str_chr(ug, ':'))] == ':') { + ug[d] =0; + g =ug +d +1; + } + if (! (pwd =getpwnam(ug))) { if (g) ug[d] =':'; return(0); } + u->uid =pwd->pw_uid; + if (! g) { + u->gid[0] =pwd->pw_gid; + u->gids =1; + return(1); + } + ug[d] =':'; + for (i =0; i < 60; ++i) { + if (g[(d =str_chr(g, ':'))] == ':') { + g[d] =0; + if (! (gr =getgrnam(g))) { g[d] =':'; return(0); } + g[d] =':'; + u->gid[i] =gr->gr_gid; + g +=d +1; + } + else { + if (! (gr =getgrnam(g))) return(0); + u->gid[i++] =gr->gr_gid; + break; + } + } + u->gid[i] =0; + u->gids =i; + return(1); +} diff --git a/mirror_runit/runit-2.1.2/src/uidgid.h b/mirror_runit/runit-2.1.2/src/uidgid.h new file mode 100644 index 0000000..13cacbc --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/uidgid.h @@ -0,0 +1,18 @@ +#ifndef UIDGID_H +#define UIDGID_H + +#include + +struct uidgid { + uid_t uid; + gid_t gid[61]; + int gids; +}; + +/* user */ +extern unsigned int uidgid_get(struct uidgid *, char *); + +/* [:]user[:group[:group]...] */ +extern unsigned int uidgids_get(struct uidgid *, char *); + +#endif diff --git a/mirror_runit/runit-2.1.2/src/uint64.h1 b/mirror_runit/runit-2.1.2/src/uint64.h1 new file mode 100644 index 0000000..486a380 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/uint64.h1 @@ -0,0 +1,10 @@ +/* Public domain. */ + +#ifndef UINT64_H +#define UINT64_H + +/* sysdep: -ulong64 */ + +typedef unsigned long long uint64; + +#endif diff --git a/mirror_runit/runit-2.1.2/src/uint64.h2 b/mirror_runit/runit-2.1.2/src/uint64.h2 new file mode 100644 index 0000000..8869e43 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/uint64.h2 @@ -0,0 +1,10 @@ +/* Public domain. */ + +#ifndef UINT64_H +#define UINT64_H + +/* sysdep: +ulong64 */ + +typedef unsigned long uint64; + +#endif diff --git a/mirror_runit/runit-2.1.2/src/utmpset.c b/mirror_runit/runit-2.1.2/src/utmpset.c new file mode 100644 index 0000000..eea41a5 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/utmpset.c @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include +#include +#include "uw_tmp.h" +#include "strerr.h" +#include "sgetopt.h" +#include "seek.h" +#include "str.h" +#include "open.h" +#include "byte.h" +#include "lock.h" + +#define USAGE " [-w] line" +#define FATAL "utmpset: fatal: " +#define WARNING "utmpset: warning: " + +const char *progname; + +void usage(void) { strerr_die4x(1, "usage: ", progname, USAGE, "\n"); } + +int utmp_logout(const char *line) { + int fd; + uw_tmp ut; + int ok =-1; + + 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: ", UW_TMP_UFILE, ": "); + + 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, sizeof ut.ut_name); + memset(ut.ut_host, 0, sizeof ut.ut_host); + if (time(&ut.ut_time) == -1) 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; + } + close(fd); + return(ok); +} +int wtmp_logout(const char *line) { + int fd; + int len; + struct stat st; + uw_tmp ut; + + 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 ", UW_TMP_WFILE, ": "); + + if (fstat(fd, &st) == -1) { + close(fd); + return(-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); + } +#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); + } + close(fd); + return(1); +} + +int main (int argc, const char * const *argv, const char * const *envp) { + int opt; + int wtmp =0; + + progname =*argv; + + while ((opt =getopt(argc, argv, "wV")) != opteof) { + switch(opt) { + case 'w': + wtmp =1; + break; + case 'V': + strerr_warn1("$Id: cb399098f794012a7f5e6a3a7090b2d53b86c08c $", 0); + case '?': + usage(); + } + } + argv +=optind; + + if (! argv || ! *argv) usage(); + if (utmp_logout(*argv) == -1) + strerr_die4x(111, WARNING, "unable to logout line ", *argv, + " in utmp: no such entry"); + if (wtmp) + if (wtmp_logout(*argv) == -1) + strerr_die4sys(111, WARNING, + "unable to logout line ", *argv, " in wtmp: "); + _exit(0); +} diff --git a/mirror_runit/runit-2.1.2/src/utmpset.check b/mirror_runit/runit-2.1.2/src/utmpset.check new file mode 100755 index 0000000..51cf1a4 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/utmpset.check @@ -0,0 +1,5 @@ +#!/bin/sh +utmpset +echo $? +utmpset -V +echo $? diff --git a/mirror_runit/runit-2.1.2/src/utmpset.dist b/mirror_runit/runit-2.1.2/src/utmpset.dist new file mode 100644 index 0000000..d5c0370 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/utmpset.dist @@ -0,0 +1,7 @@ +usage: utmpset [-w] line + +1 +$Id: cb399098f794012a7f5e6a3a7090b2d53b86c08c $ +usage: utmpset [-w] line + +1 diff --git a/mirror_runit/runit-2.1.2/src/uw_tmp.h1 b/mirror_runit/runit-2.1.2/src/uw_tmp.h1 new file mode 100644 index 0000000..2d5e994 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/uw_tmp.h1 @@ -0,0 +1,19 @@ +#include +#include + +/* sysdep: -utmpx */ + +#ifdef _PATH_UTMP +#define UW_TMP_UFILE _PATH_UTMP +#define UW_TMP_WFILE _PATH_WTMP +#else +/* AIX only has UTMP_FILE */ +#ifdef UTMP_FILE +#define UW_TMP_UFILE UTMP_FILE +#define UW_TMP_WFILE WTMP_FILE +#else +#error neither _PATH_UTMP nor UTMP_FILE defined. +#endif +#endif + +typedef struct utmp uw_tmp; diff --git a/mirror_runit/runit-2.1.2/src/uw_tmp.h2 b/mirror_runit/runit-2.1.2/src/uw_tmp.h2 new file mode 100644 index 0000000..ae9542e --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/uw_tmp.h2 @@ -0,0 +1,13 @@ +#include +#include + +/* 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; diff --git a/mirror_runit/runit-2.1.2/src/wait.h b/mirror_runit/runit-2.1.2/src/wait.h new file mode 100644 index 0000000..d294e9d --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/wait.h @@ -0,0 +1,16 @@ +/* Public domain. */ + +#ifndef WAIT_H +#define WAIT_H + +extern int wait_pid(); +extern int wait_nohang(); +extern int wait_stop(); +extern int wait_stopnohang(); + +#define wait_crashed(w) ((w) & 127) +#define wait_exitcode(w) ((w) >> 8) +#define wait_stopsig(w) ((w) >> 8) +#define wait_stopped(w) (((w) & 127) == 127) + +#endif diff --git a/mirror_runit/runit-2.1.2/src/wait_nohang.c b/mirror_runit/runit-2.1.2/src/wait_nohang.c new file mode 100644 index 0000000..5c9c53d --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/wait_nohang.c @@ -0,0 +1,14 @@ +/* Public domain. */ + +#include +#include +#include "haswaitp.h" + +int wait_nohang(wstat) int *wstat; +{ +#ifdef HASWAITPID + return waitpid(-1,wstat,WNOHANG); +#else + return wait3(wstat,WNOHANG,(struct rusage *) 0); +#endif +} diff --git a/mirror_runit/runit-2.1.2/src/wait_pid.c b/mirror_runit/runit-2.1.2/src/wait_pid.c new file mode 100644 index 0000000..c2869b8 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/wait_pid.c @@ -0,0 +1,41 @@ +/* Public domain. */ + +#include +#include +#include "error.h" +#include "haswaitp.h" + +#ifdef HASWAITPID + +int wait_pid(wstat,pid) int *wstat; int pid; +{ + int r; + + do + r = waitpid(pid,wstat,0); + while ((r == -1) && (errno == error_intr)); + return r; +} + +#else + +/* XXX untested */ +/* XXX breaks down with more than two children */ +static int oldpid = 0; +static int oldwstat; /* defined if(oldpid) */ + +int wait_pid(wstat,pid) int *wstat; int pid; +{ + int r; + + if (pid == oldpid) { *wstat = oldwstat; oldpid = 0; return pid; } + + do { + r = wait(wstat); + if ((r != pid) && (r != -1)) { oldwstat = *wstat; oldpid = r; continue; } + } + while ((r == -1) && (errno == error_intr)); + return r; +} + +#endif diff --git a/mirror_runit/runit-2.1.2/src/warn-auto.sh b/mirror_runit/runit-2.1.2/src/warn-auto.sh new file mode 100644 index 0000000..36d2313 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/warn-auto.sh @@ -0,0 +1,2 @@ +#!/bin/sh +# WARNING: This file was auto-generated. Do not edit! diff --git a/mirror_runit/runit-2.1.2/src/warn-shsgr b/mirror_runit/runit-2.1.2/src/warn-shsgr new file mode 100644 index 0000000..37c351e --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/warn-shsgr @@ -0,0 +1,3 @@ +Oops. Your getgroups() returned 0, and setgroups() failed; this means +that I can't reliably do my shsgr test. Please either ``make'' as root +or ``make'' while you're in one or more supplementary groups. diff --git a/mirror_runit/runit-2.1.2/src/x86cpuid.c b/mirror_runit/runit-2.1.2/src/x86cpuid.c new file mode 100644 index 0000000..f81c593 --- /dev/null +++ b/mirror_runit/runit-2.1.2/src/x86cpuid.c @@ -0,0 +1,40 @@ +/* Public domain. */ + +#include + +void nope() +{ + exit(1); +} + +int main() +{ + unsigned long x[4]; + unsigned long y[4]; + int i; + int j; + char c; + + signal(SIGILL,nope); + + x[0] = 0; + x[1] = 0; + x[2] = 0; + x[3] = 0; + + asm volatile(".byte 15;.byte 162" : "=a"(x[0]),"=b"(x[1]),"=c"(x[3]),"=d"(x[2]) : "0"(0) ); + if (!x[0]) return 0; + asm volatile(".byte 15;.byte 162" : "=a"(y[0]),"=b"(y[1]),"=c"(y[2]),"=d"(y[3]) : "0"(1) ); + + for (i = 1;i < 4;++i) + for (j = 0;j < 4;++j) { + c = x[i] >> (8 * j); + if (c < 32) c = 32; + if (c > 126) c = 126; + putchar(c); + } + + printf("-%08x-%08x\n",y[0],y[3]); + + return 0; +}