diff options
Diffstat (limited to 'runit')
-rw-r--r-- | runit/sv.c | 57 |
1 files changed, 52 insertions, 5 deletions
diff --git a/runit/sv.c b/runit/sv.c index dc5dcceb3..86d181872 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 <sys/file.h> #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 |