diff options
-rw-r--r-- | package/CHANGES | 4 | ||||
-rw-r--r-- | package/commands | 2 | ||||
-rw-r--r-- | src/Makefile | 21 | ||||
-rw-r--r-- | src/TARGETS | 4 | ||||
-rw-r--r-- | src/rsv-control.c | 92 | ||||
-rw-r--r-- | src/rsv-status.c | 154 | ||||
-rw-r--r-- | src/runsv.c | 2 |
7 files changed, 273 insertions, 6 deletions
diff --git a/package/CHANGES b/package/CHANGES index f8ea6f2..2171e80 100644 --- a/package/CHANGES +++ b/package/CHANGES @@ -1,7 +1,9 @@ runit 0.5.2 -Mon, 23 Sep 2002 12:07:42 +0200 +Mon, 23 Sep 2002 16:25:07 +0200 * runsv, runsvdir: new; svscan/supervise replacement. * etc/runit/2: use runsvlog instead of svscanboot. + * rsv-status: new; svstat for runsv. + * rsv-control: new; svc for runsv. runit 0.5.0 Wed, 28 Aug 2002 11:18:28 +0200 diff --git a/package/commands b/package/commands index ed68e78..8a74b4d 100644 --- a/package/commands +++ b/package/commands @@ -2,6 +2,8 @@ runit runit-init runsv runsvdir +rsv-status +rsv-control svwaitdown svwaitup utmpset diff --git a/src/Makefile b/src/Makefile index 2f8f043..9ca3ab7 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,4 +1,5 @@ -IT=sysdeps runit runit-init runsv runsvdir svwaitup svwaitdown utmpset +IT=sysdeps runit runit-init runsv runsvdir rsv-status rsv-control svwaitup \ +svwaitdown utmpset default: $(IT) @@ -14,6 +15,12 @@ runsv: load runsv.o unix.a byte.a time.a runsvdir: load runsvdir.o unix.a byte.a time.a ./load runsvdir unix.a byte.a time.a +rsv-status: load rsv-status.o unix.a byte.a time.a + ./load rsv-status unix.a byte.a time.a + +rsv-control: load rsv-control.o unix.a byte.a + ./load rsv-control unix.a byte.a + svwaitup: load svwaitup.o unix.a byte.a time.a ./load svwaitup unix.a byte.a time.a @@ -29,13 +36,19 @@ runit-init.o: compile runit-init.c runsv.o: compile sysdeps runsv.c ./compile runsv.c -runsvdir.o: compile runsvdir.c direntry.h iopause.h uint64.h +runsvdir.o: compile sysdeps runsvdir.c ./compile runsvdir.c -svwaitup.o: compile svwaitup.c uint64.h +rsv-status.o: compile sysdeps rsv-status.c + ./compile rsv-status.c + +rsv-control.o: compile rsv-control.c + ./compile rsv-control.c + +svwaitup.o: compile sysdeps svwaitup.c ./compile svwaitup.c -svwaitdown.o: compile svwaitdown.c uint64.h +svwaitdown.o: compile sysdeps svwaitdown.c ./compile svwaitdown.c utmpset: load utmpset.o unix.a byte.a diff --git a/src/TARGETS b/src/TARGETS index 7a67a57..34fc9d8 100644 --- a/src/TARGETS +++ b/src/TARGETS @@ -6,6 +6,10 @@ runsv runsv.o runsvdir runsvdir.o +rsv-status +rsv-status.o +rsv-control +rsv-control.o svwaitdown svwaitdown.o svwaitup diff --git a/src/rsv-control.c b/src/rsv-control.c new file mode 100644 index 0000000..e540615 --- /dev/null +++ b/src/rsv-control.c @@ -0,0 +1,92 @@ +#include <unistd.h> +#include "strerr.h" +#include "error.h" +#include "open.h" + +#define USAGE " u|d|o|x|p|c|h|a|i|t|k service ..." + +#define VERSION "$Id$" + +#define FATAL "rsv-control: fatal: " +#define WARNING "rsv-control: warning: " + +char *progname; +unsigned int rc =0; + +void usage() { + strerr_die4x(1, "usage: ", progname, USAGE, "\n"); +} +void fatal(char *m1) { + strerr_die3sys(rc, 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, "supervise 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 'u': + case 'd': + case 'o': + case 'x': + case 'p': + case 'c': + case 'h': + case 'a': + case 'i': + case 't': + case 'k': + 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"); + } + } + exit(rc); +} diff --git a/src/rsv-status.c b/src/rsv-status.c new file mode 100644 index 0000000..99a609e --- /dev/null +++ b/src/rsv-status.c @@ -0,0 +1,154 @@ +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include "strerr.h" +#include "error.h" +#include "open.h" +#include "buffer.h" +#include "tai.h" +#include "fmt.h" + +#define USAGE " service ..." + +#define VERSION "$Id$" + +#define FATAL "rsv-status: fatal: " +#define WARNING "rsv-status: warning: " + +char *progname; +unsigned int rc =0; +struct stat s; + +void usage() { + strerr_die4x(1, "usage: ", progname, USAGE, "\n"); +} +void fatal(char *m1) { + strerr_die3sys(rc, 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[19]; + 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, 19)) { + case 19: + 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) { + buffer_puts(buffer_1, "up (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 curdir; + char **dir; + + progname =*argv++; + + 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 (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_putsflush(buffer_1, "\n"); + } + if (fchdir(curdir) == -1) { + rc =100; + fatal("unable to change directory"); + } + } + exit(rc); +} diff --git a/src/runsv.c b/src/runsv.c index 04a3cc6..2026b1c 100644 --- a/src/runsv.c +++ b/src/runsv.c @@ -48,7 +48,6 @@ struct svdir { int fdlock; int fdcontrol; int fdcontrolwrite; - // int fdok; int islog; }; struct svdir svd[2]; @@ -430,6 +429,7 @@ int main(int argc, char **argv) { break; } svd[0].state =S_DOWN; + svd[0].ctrl &=~C_TERM; taia_now(&svd[0].start); update_status(&svd[0]); if (svd[0].want == W_UP) { |