svok: new applet (daemontools compat)
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 30 Mar 2018 18:02:33 +0000 (20:02 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 30 Mar 2018 18:02:33 +0000 (20:02 +0200)
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>
examples/var_service/README_distro_proposal.txt
examples/var_service/ifplugd_if/run
runit/sv.c

index ec887b4e1c617b881601089b721f181f6a371c5c..f161406a7753eb5d2c85fa8fb69bcf2c691afedb 100644 (file)
@@ -246,7 +246,8 @@ relative to the system-wide service directory.
 This proposal asks developers of other daemontools implementations
 to add "svc" command to their projects]
 
-The "svok DIR" tool exits 0 if service is running, and nonzero if not.
+The "svok DIR" tool exits 0 if service supervisor is running
+(with service itself either running or stopped), and nonzero if not.
 
 Other tools with different names and APIs may exist; however
 for portability scripts should use the above tools.
index fade8b98ddacbd200cb250ff2cb18b4d6aa8c6a7..5d1d4e35571cc32094fc4ad0aff48bd2a78875d0 100755 (executable)
@@ -16,7 +16,7 @@ exec \
 env - PATH="$PATH" \
 softlimit \
 setuidgid root \
-ifplugd -apqlns -t3 -u8 -d8 -i "$if" -r "$pwd/ifplugd_handler"
+ifplugd -aqlns -t3 -u8 -d8 -i "$if" -r "$pwd/ifplugd_handler"
 
 # We use -t3 to wake ifplugd up less often.
 # 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"
 # IOW: short link losses will be ignored, longer ones
 # will trigger DHCP reconfiguration and such (see handler code).
 
+# -l makes ifplugd run either "up" or "down" script on startup.
+# For example, if wired eth cable is unplugged, this stops dhcp service
+# from pointlessly trying to get a lease.
+# -q means that stopping monitoring does not stop dhcp/zcip/etc:
+# presumably, admin decided to control them manually.
+
 #-a       Don't up interface automatically
 #-p       Don't run "up" script on startup
 #-q       Don't run "down" script on exit
index dc5dcceb3b860bd40c019c79116b0615d28100b4..86d1818724441ebb08e6b8110ca1f1ad50269b92 100644 (file)
@@ -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