svc: new applet (daemontools-compatible version of "sv")

function                                             old     new   delta
sv                                                     -    1199   +1199
svc_main                                               -     145    +145
packed_usage                                       30255   30364    +109
applet_names                                        2437    2441      +4
applet_main                                         1420    1424      +4
find_applet_by_name                                  125     126      +1
sv_main                                             1201       9   -1192
------------------------------------------------------------------------------
(add/remove: 2/0 grow/shrink: 4/1 up/down: 1462/-1192)        Total: 270 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2016-12-05 13:56:40 +01:00
parent 4bd0c2ab38
commit 4051a99f5f

View File

@ -166,26 +166,19 @@ Exit Codes
//config: help //config: help
//config: Default directory for services. //config: Default directory for services.
//config: Defaults to "/var/service" //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(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 //kbuild:lib-$(CONFIG_SV) += sv.o
//kbuild:lib-$(CONFIG_SVC) += 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"
#include <sys/file.h> #include <sys/file.h>
#include "libbb.h" #include "libbb.h"
@ -452,8 +445,22 @@ static int control(const char *a)
return 1; return 1;
} }
int sv_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; //usage:#define sv_trivial_usage
int sv_main(int argc UNUSED_PARAM, char **argv) //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 *x;
char *action; char *action;
@ -634,3 +641,72 @@ int sv_main(int argc UNUSED_PARAM, char **argv)
} }
return rc > 99 ? 99 : rc; 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