From 0d79d7709dc490378b1c3e1c99ea565767118118 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 30 Mar 2018 20:02:33 +0200 Subject: svok: new applet (daemontools compat) function old new delta svok_main - 127 +127 packed_usage 32705 32757 +52 applet_names 2756 2761 +5 applet_main 1588 1592 +4 bb_banner 46 47 +1 sv 1286 1284 -2 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 4/1 up/down: 189/-2) Total: 187 bytes Signed-off-by: Denys Vlasenko --- runit/sv.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 5 deletions(-) (limited to 'runit') diff --git a/runit/sv.c b/runit/sv.c index dc5dcce..86d1818 100644 --- a/runit/sv.c +++ b/runit/sv.c @@ -163,7 +163,7 @@ Exit Codes //config:config SV_DEFAULT_SERVICE_DIR //config: string "Default directory for services" //config: default "/var/service" -//config: depends on SV +//config: depends on SV || SVC || SVOK //config: help //config: Default directory for services. //config: Defaults to "/var/service" @@ -173,13 +173,22 @@ Exit Codes //config: default y //config: help //config: svc controls the state of services monitored by the runsv supervisor. -//config: It is comaptible with daemontools command with the same name. +//config: It is compatible with daemontools command with the same name. +//config: +//config:config SVOK +//config: bool "svok" +//config: default y +//config: help +//config: svok checks whether runsv supervisor is running. +//config: It is compatible with daemontools command with the same name. -//applet:IF_SV( APPLET_NOEXEC(sv, sv, BB_DIR_USR_BIN, BB_SUID_DROP, sv )) -//applet:IF_SVC(APPLET_NOEXEC(svc, svc, BB_DIR_USR_BIN, BB_SUID_DROP, svc)) +//applet:IF_SV( APPLET_NOEXEC(sv, sv, BB_DIR_USR_BIN, BB_SUID_DROP, sv )) +//applet:IF_SVC( APPLET_NOEXEC(svc, svc, BB_DIR_USR_BIN, BB_SUID_DROP, svc )) +//applet:IF_SVOK(APPLET_NOEXEC(svok, svok, BB_DIR_USR_BIN, BB_SUID_DROP, svok)) //kbuild:lib-$(CONFIG_SV) += sv.o //kbuild:lib-$(CONFIG_SVC) += sv.o +//kbuild:lib-$(CONFIG_SVOK) += sv.o #include #include "libbb.h" @@ -615,7 +624,7 @@ static int sv(char **argv) service = argv; while ((x = *service) != NULL) { if (x[0] != '/' && x[0] != '.' - && x[0] != '\0' && x[strlen(x) - 1] != '/' + && !last_char_is(x, '/') ) { if (chdir(varservice) == -1) goto chdir_failed_0; @@ -742,3 +751,41 @@ int svc_main(int argc UNUSED_PARAM, char **argv) return 0; } #endif + +//usage:#define svok_trivial_usage +//usage: "SERVICE_DIR" +//usage:#define svok_full_usage "\n\n" +//usage: "Check whether runsv supervisor is running.\n" +//usage: "Exit code is 0 if it does, 100 if it does not,\n" +//usage: "111 (with error message) if SERVICE_DIR does not exist." +#if ENABLE_SVOK +int svok_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int svok_main(int argc UNUSED_PARAM, char **argv) +{ + const char *dir = argv[1]; + + if (!dir) + bb_show_usage(); + + xfunc_error_retval = 111; + + /* + * daemontools has no concept of "default service dir", runit does. + * Let's act as runit. + */ + if (dir[0] != '/' && dir[0] != '.' + && !last_char_is(dir, '/') + ) { + xchdir(CONFIG_SV_DEFAULT_SERVICE_DIR); + } + + xchdir(dir); + if (open("supervise/ok", O_WRONLY) < 0) { + if (errno == ENOENT || errno == ENXIO) + return 100; + bb_perror_msg_and_die("can't open '%s'", "supervise/ok"); + } + + return 0; +} +#endif -- cgit v1.1