diff options
-rw-r--r-- | runit/sv.c | 112 |
1 files changed, 94 insertions, 18 deletions
diff --git a/runit/sv.c b/runit/sv.c index 42abbbbb5..71865bd4f 100644 --- a/runit/sv.c +++ b/runit/sv.c @@ -166,26 +166,19 @@ Exit Codes //config: help //config: Default directory for services. //config: Defaults to "/var/service" +//config: +//config:config SVC +//config: bool "svc" +//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. //applet:IF_SV(APPLET(sv, BB_DIR_USR_BIN, BB_SUID_DROP)) +//applet:IF_SV(APPLET(svc, BB_DIR_USR_BIN, BB_SUID_DROP)) //kbuild:lib-$(CONFIG_SV) += sv.o - -//usage:#define sv_trivial_usage -//usage: "[-v] [-w SEC] CMD SERVICE_DIR..." -//usage:#define sv_full_usage "\n\n" -//usage: "Control services monitored by runsv supervisor.\n" -//usage: "Commands (only first character is enough):\n" -//usage: "\n" -//usage: "status: query service status\n" -//usage: "up: if service isn't running, start it. If service stops, restart it\n" -//usage: "once: like 'up', but if service stops, don't restart it\n" -//usage: "down: send TERM and CONT signals. If ./run exits, start ./finish\n" -//usage: " if it exists. After it stops, don't restart service\n" -//usage: "exit: send TERM and CONT signals to service and log service. If they exit,\n" -//usage: " runsv exits too\n" -//usage: "pause, cont, hup, alarm, interrupt, quit, 1, 2, term, kill: send\n" -//usage: "STOP, CONT, HUP, ALRM, INT, QUIT, USR1, USR2, TERM, KILL signal to service" +//kbuild:lib-$(CONFIG_SVC) += sv.o #include <sys/file.h> #include "libbb.h" @@ -452,8 +445,22 @@ static int control(const char *a) return 1; } -int sv_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; -int sv_main(int argc UNUSED_PARAM, char **argv) +//usage:#define sv_trivial_usage +//usage: "[-v] [-w SEC] CMD SERVICE_DIR..." +//usage:#define sv_full_usage "\n\n" +//usage: "Control services monitored by runsv supervisor.\n" +//usage: "Commands (only first character is enough):\n" +//usage: "\n" +//usage: "status: query service status\n" +//usage: "up: if service isn't running, start it. If service stops, restart it\n" +//usage: "once: like 'up', but if service stops, don't restart it\n" +//usage: "down: send TERM and CONT signals. If ./run exits, start ./finish\n" +//usage: " if it exists. After it stops, don't restart service\n" +//usage: "exit: send TERM and CONT signals to service and log service. If they exit,\n" +//usage: " runsv exits too\n" +//usage: "pause, cont, hup, alarm, interrupt, quit, 1, 2, term, kill: send\n" +//usage: "STOP, CONT, HUP, ALRM, INT, QUIT, USR1, USR2, TERM, KILL signal to service" +static int sv(char **argv) { char *x; char *action; @@ -634,3 +641,72 @@ int sv_main(int argc UNUSED_PARAM, char **argv) } return rc > 99 ? 99 : rc; } + +#if ENABLE_SV +int sv_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int sv_main(int argc UNUSED_PARAM, char **argv) +{ + return sv(argv); +} +#endif + +//usage:#define svc_trivial_usage +//usage: "[-udopchaitkx] SERVICE_DIR..." +//usage:#define svc_full_usage "\n\n" +//usage: "Control services monitored by runsv supervisor" +//usage: "\n" +//usage: "\n"" -u If service is not running, start it; restart if it stops" +//usage: "\n"" -d If service is running, send TERM+CONT signals; do not restart it" +//usage: "\n"" -o Once: if service is not running, start it; do not restart it" +//usage: "\n"" -pchaitk Send STOP, CONT, HUP, ALRM, INT, TERM, KILL signal to service" +//usage: "\n"" -x Exit: runsv will exit as soon as the service is down" +#if ENABLE_SVC +int svc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int svc_main(int argc UNUSED_PARAM, char **argv) +{ + char command[2]; + const char *optstring; + unsigned opts; + + INIT_G(); + + optstring = "udopchaitkx"; + opts = getopt32(argv, optstring); + argv += optind; + if (!argv[0] || !opts) + bb_show_usage(); + + argv -= 2; + if (optind > 2) { + argv--; + argv[2] = (char*)"--"; + } + argv[0] = (char*)"sv"; + argv[1] = command; + command[1] = '\0'; + + /* getopt32() was already called: + * reset the libc getopt() function, which keeps internal state. + */ +#ifdef __GLIBC__ + optind = 0; +#else /* BSD style */ + optind = 1; + /* optreset = 1; */ +#endif + + do { + if (opts & 1) { + int r; + command[0] = *optstring; + r = sv(argv); + if (r) + return 1; + } + optstring++; + opts >>= 1; + } while (opts); + + return 0; +} +#endif |