aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-03-30 20:02:33 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2018-03-30 20:02:33 +0200
commit0d79d7709dc490378b1c3e1c99ea565767118118 (patch)
treec0ac9b9b4f0fdc2bd2e0bf5990856b17dcbf69e5
parentd892f7137f43373123ab6c63006b5ff9b3481664 (diff)
downloadbusybox-w32-0d79d7709dc490378b1c3e1c99ea565767118118.tar.gz
busybox-w32-0d79d7709dc490378b1c3e1c99ea565767118118.tar.bz2
busybox-w32-0d79d7709dc490378b1c3e1c99ea565767118118.zip
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 <vda.linux@googlemail.com>
-rw-r--r--examples/var_service/README_distro_proposal.txt3
-rwxr-xr-xexamples/var_service/ifplugd_if/run8
-rw-r--r--runit/sv.c57
3 files changed, 61 insertions, 7 deletions
diff --git a/examples/var_service/README_distro_proposal.txt b/examples/var_service/README_distro_proposal.txt
index ec887b4e1..f161406a7 100644
--- a/examples/var_service/README_distro_proposal.txt
+++ b/examples/var_service/README_distro_proposal.txt
@@ -246,7 +246,8 @@ relative to the system-wide service directory.
246This proposal asks developers of other daemontools implementations 246This proposal asks developers of other daemontools implementations
247to add "svc" command to their projects] 247to add "svc" command to their projects]
248 248
249The "svok DIR" tool exits 0 if service is running, and nonzero if not. 249The "svok DIR" tool exits 0 if service supervisor is running
250(with service itself either running or stopped), and nonzero if not.
250 251
251Other tools with different names and APIs may exist; however 252Other tools with different names and APIs may exist; however
252for portability scripts should use the above tools. 253for portability scripts should use the above tools.
diff --git a/examples/var_service/ifplugd_if/run b/examples/var_service/ifplugd_if/run
index fade8b98d..5d1d4e355 100755
--- a/examples/var_service/ifplugd_if/run
+++ b/examples/var_service/ifplugd_if/run
@@ -16,7 +16,7 @@ exec \
16env - PATH="$PATH" \ 16env - PATH="$PATH" \
17softlimit \ 17softlimit \
18setuidgid root \ 18setuidgid root \
19ifplugd -apqlns -t3 -u8 -d8 -i "$if" -r "$pwd/ifplugd_handler" 19ifplugd -aqlns -t3 -u8 -d8 -i "$if" -r "$pwd/ifplugd_handler"
20 20
21# We use -t3 to wake ifplugd up less often. 21# We use -t3 to wake ifplugd up less often.
22# If after three tests (3*3=9 > 8) link state seen to be different, 22# If after three tests (3*3=9 > 8) link state seen to be different,
@@ -24,6 +24,12 @@ ifplugd -apqlns -t3 -u8 -d8 -i "$if" -r "$pwd/ifplugd_handler"
24# IOW: short link losses will be ignored, longer ones 24# IOW: short link losses will be ignored, longer ones
25# will trigger DHCP reconfiguration and such (see handler code). 25# will trigger DHCP reconfiguration and such (see handler code).
26 26
27# -l makes ifplugd run either "up" or "down" script on startup.
28# For example, if wired eth cable is unplugged, this stops dhcp service
29# from pointlessly trying to get a lease.
30# -q means that stopping monitoring does not stop dhcp/zcip/etc:
31# presumably, admin decided to control them manually.
32
27#-a Don't up interface automatically 33#-a Don't up interface automatically
28#-p Don't run "up" script on startup 34#-p Don't run "up" script on startup
29#-q Don't run "down" script on exit 35#-q Don't run "down" script on exit
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
163//config:config SV_DEFAULT_SERVICE_DIR 163//config:config SV_DEFAULT_SERVICE_DIR
164//config: string "Default directory for services" 164//config: string "Default directory for services"
165//config: default "/var/service" 165//config: default "/var/service"
166//config: depends on SV 166//config: depends on SV || SVC || SVOK
167//config: help 167//config: help
168//config: Default directory for services. 168//config: Default directory for services.
169//config: Defaults to "/var/service" 169//config: Defaults to "/var/service"
@@ -173,13 +173,22 @@ Exit Codes
173//config: default y 173//config: default y
174//config: help 174//config: help
175//config: svc controls the state of services monitored by the runsv supervisor. 175//config: svc controls the state of services monitored by the runsv supervisor.
176//config: It is comaptible with daemontools command with the same name. 176//config: It is compatible with daemontools command with the same name.
177//config:
178//config:config SVOK
179//config: bool "svok"
180//config: default y
181//config: help
182//config: svok checks whether runsv supervisor is running.
183//config: It is compatible with daemontools command with the same name.
177 184
178//applet:IF_SV( APPLET_NOEXEC(sv, sv, BB_DIR_USR_BIN, BB_SUID_DROP, sv )) 185//applet:IF_SV( APPLET_NOEXEC(sv, sv, BB_DIR_USR_BIN, BB_SUID_DROP, sv ))
179//applet:IF_SVC(APPLET_NOEXEC(svc, svc, BB_DIR_USR_BIN, BB_SUID_DROP, svc)) 186//applet:IF_SVC( APPLET_NOEXEC(svc, svc, BB_DIR_USR_BIN, BB_SUID_DROP, svc ))
187//applet:IF_SVOK(APPLET_NOEXEC(svok, svok, BB_DIR_USR_BIN, BB_SUID_DROP, svok))
180 188
181//kbuild:lib-$(CONFIG_SV) += sv.o 189//kbuild:lib-$(CONFIG_SV) += sv.o
182//kbuild:lib-$(CONFIG_SVC) += sv.o 190//kbuild:lib-$(CONFIG_SVC) += sv.o
191//kbuild:lib-$(CONFIG_SVOK) += sv.o
183 192
184#include <sys/file.h> 193#include <sys/file.h>
185#include "libbb.h" 194#include "libbb.h"
@@ -615,7 +624,7 @@ static int sv(char **argv)
615 service = argv; 624 service = argv;
616 while ((x = *service) != NULL) { 625 while ((x = *service) != NULL) {
617 if (x[0] != '/' && x[0] != '.' 626 if (x[0] != '/' && x[0] != '.'
618 && x[0] != '\0' && x[strlen(x) - 1] != '/' 627 && !last_char_is(x, '/')
619 ) { 628 ) {
620 if (chdir(varservice) == -1) 629 if (chdir(varservice) == -1)
621 goto chdir_failed_0; 630 goto chdir_failed_0;
@@ -742,3 +751,41 @@ int svc_main(int argc UNUSED_PARAM, char **argv)
742 return 0; 751 return 0;
743} 752}
744#endif 753#endif
754
755//usage:#define svok_trivial_usage
756//usage: "SERVICE_DIR"
757//usage:#define svok_full_usage "\n\n"
758//usage: "Check whether runsv supervisor is running.\n"
759//usage: "Exit code is 0 if it does, 100 if it does not,\n"
760//usage: "111 (with error message) if SERVICE_DIR does not exist."
761#if ENABLE_SVOK
762int svok_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
763int svok_main(int argc UNUSED_PARAM, char **argv)
764{
765 const char *dir = argv[1];
766
767 if (!dir)
768 bb_show_usage();
769
770 xfunc_error_retval = 111;
771
772 /*
773 * daemontools has no concept of "default service dir", runit does.
774 * Let's act as runit.
775 */
776 if (dir[0] != '/' && dir[0] != '.'
777 && !last_char_is(dir, '/')
778 ) {
779 xchdir(CONFIG_SV_DEFAULT_SERVICE_DIR);
780 }
781
782 xchdir(dir);
783 if (open("supervise/ok", O_WRONLY) < 0) {
784 if (errno == ENOENT || errno == ENXIO)
785 return 100;
786 bb_perror_msg_and_die("can't open '%s'", "supervise/ok");
787 }
788
789 return 0;
790}
791#endif