s6

Mirror/fork of https://skarnet.org/software/s6/
git clone https://ccx.te2000.cz/git/s6
Log | Files | Refs | README | LICENSE

commit a37ea0818a0889fbf36a4fbe918929b53fb0f7c6
parent 7b9931e6403db6aeabb0ccc26e126dcf74cf3c03
Author: Laurent Bercot <ska-skaware@skarnet.org>
Date:   Wed, 11 Jan 2023 11:36:38 +0000

 More bugfixes

 And doc fixes

Signed-off-by: Laurent Bercot <ska@appnovation.com>

Diffstat:
Mdoc/instances.html | 4++--
Mdoc/s6-instance-create.html | 2+-
Mdoc/s6-instance-maker.html | 2+-
Msrc/supervision/s6-supervise.c | 89++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
Msrc/supervision/s6-svc.c | 30++----------------------------
5 files changed, 60 insertions(+), 67 deletions(-)

diff --git a/doc/instances.html b/doc/instances.html @@ -19,7 +19,7 @@ <h1> Dynamic instantiation under s6 </h1> <p> - A <em>instanced service</em> is a parameterized service that you want to + An <em>instanced service</em> is a parameterized service that you want to run several copies of, with only the parameter changing. Each copy of the service is called an <em>instance</em>. </p> @@ -86,7 +86,7 @@ here for informational purposes. <ul> <li> The service directory created by <a href="s6-instance-maker.html">s6-instance-maker</a> -has two specifics subdirectories in it: <tt>instance</tt> and <tt>instances</tt>. They +has two specific subdirectories in it: <tt>instance</tt> and <tt>instances</tt>. They are initially empty, except that the template service directory is stored in <tt>instances/.template</tt>. </li> <li> When the service is active, there is an <a href="s6-svscan.html">s6-svscan</a> diff --git a/doc/s6-instance-create.html b/doc/s6-instance-create.html @@ -63,7 +63,7 @@ been given, the supervisor auto-starts the instance as soon as it runs. </li> <li> <tt>-D</tt>&nbsp;: down, and stay down. The instance supervisor will be started, but the instance itself will remain down. A <tt>down</tt> file will be created for the instance. By default, if neither the <tt>-d</tt> nor <tt>-D</tt> options have -been given, the supervisor auto-starts the instancece as soon as it runs. </li> +been given, the supervisor auto-starts the instance as soon as it runs. </li> <li> <tt>-P</tt>&nbsp;: public. Everyone will be able to subscribe to the instance supervisor's notification. By default, only processes running with the same gid as the instanced service can subscribe to it. </li> diff --git a/doc/s6-instance-maker.html b/doc/s6-instance-maker.html @@ -98,7 +98,7 @@ When the <tt>-r</tt> option is not given at all, <em>dir</em> is a regular servi directory for direct inclusion (or linking) in a host <a href="scandir.html">scan directory</a>, and if the <tt>-L</tt> option is given then the logger for the instance supervisor and all its instances is declared in -<em>dir</em><tt>/log</tt>). </li> <br> +<em>dir</em><tt>/log</tt>. </li> <br> <li> <tt>-u</tt>&nbsp;<em>user</em>&nbsp;: run the instance supervisor, and all of the instances, as user <em>user</em>. This option should only be used when the diff --git a/src/supervision/s6-supervise.c b/src/supervision/s6-supervise.c @@ -40,7 +40,7 @@ enum trans_e { V_TIMEOUT, V_CHLD, V_TERM, V_HUP, V_QUIT, V_INT, V_a, V_b, V_q, V_h, V_k, V_t, V_i, V_1, V_2, V_p, V_c, V_y, V_r, - V_o, V_d, V_u, V_x, V_O + V_o, V_d, V_u, V_D, V_U, V_x, V_O } ; typedef enum state_e state_t, *state_t_ref ; @@ -165,6 +165,20 @@ static void closethem (void) strerr_warnwu2sys("open /dev/null for ", "writing") ; } +static void adddown (void) +{ + if (!openwritenclose_unsafe("down", "", 0)) + strerr_warnwu2sys("create ", "./down file") ; +} + +static void deldown (void) +{ + int e = errno ; + if (unlink("down") == -1 && errno != ENOENT) + strerr_warnwu2sys("unlink ", "./down file") ; + errno = e ; +} + static void killa (void) { kill(status.pid, SIGALRM) ; @@ -390,35 +404,46 @@ static void trystart (void) if (lfd >= 0) fd_close(lfd) ; } -static void downtimeout (void) +static void wantdown (void) { - if (status.flagwantup) trystart() ; - else settimeout_infinite() ; + status.flagwantup = 0 ; + announce() ; } -static void down_O (void) +static void wantup (void) { - status.flagwantup = 0 ; + status.flagwantup = 1 ; announce() ; } +static void downtimeout (void) +{ + if (status.flagwantup) trystart() ; + else settimeout_infinite() ; +} + static void down_o (void) { - down_O() ; + wantdown() ; trystart() ; } static void down_u (void) { - status.flagwantup = 1 ; - announce() ; + wantup() ; trystart() ; } -static void down_d (void) +static void down_D (void) { - status.flagwantup = 0 ; - announce() ; + adddown() ; + wantdown() ; +} + +static void down_U (void) +{ + deldown() ; + down_u() ; } static int uplastup_z (void) @@ -512,12 +537,6 @@ static void uptimeout (void) } } -static void up_o (void) -{ - status.flagwantup = 0 ; - announce() ; -} - static void up_d (void) { tain tto ; @@ -534,10 +553,16 @@ static void up_d (void) else settimeout_infinite() ; } -static void up_u (void) +static void up_D (void) { - status.flagwantup = 1 ; - announce() ; + adddown() ; + up_d() ; +} + +static void up_U (void) +{ + deldown() ; + wantup() ; } static void up_x (void) @@ -570,12 +595,6 @@ static void finish_z (void) else set_down_and_ready("D", 1) ; } -static void finish_u (void) -{ - status.flagwantup = 1 ; - announce() ; -} - static void finish_x (void) { state = LASTFINISH ; @@ -588,23 +607,23 @@ static void lastfinish_z (void) bail() ; } -static action_t_ref const actions[5][24] = +static action_t_ref const actions[5][26] = { { &downtimeout, &nop, &bail, &bail, &bail, &bail, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, - &down_o, &down_d, &down_u, &bail, &down_O }, + &down_o, &wantdown, &down_u, &down_D, &down_U, &bail, &wantdown }, { &uptimeout, &up_z, &up_term, &up_x, &bail, &sigint, &killa, &killb, &killq, &killh, &killk, &killt, &killi, &kill1, &kill2, &killp, &killc, &killy, &killr, - &up_o, &up_d, &up_u, &up_x, &up_o }, + &wantdown, &up_d, &wantup, &up_D, &up_U, &up_x, &wantdown }, { &finishtimeout, &finish_z, &finish_x, &finish_x, &bail, &sigint, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, - &up_o, &down_d, &finish_u, &finish_x, &up_o }, + &wantdown, &wantdown, &wantup, &down_D, &up_U, &finish_x, &wantdown }, { &uptimeout, &lastup_z, &up_d, &closethem, &bail, &sigint, &killa, &killb, &killq, &killh, &killk, &killt, &killi, &kill1, &kill2, &killp, &killc, &killy, &killr, - &up_o, &up_d, &nop, &closethem, &up_o }, + &wantdown, &up_d, &wantup, &up_D, &up_U, &closethem, &wantdown }, { &finishtimeout, &lastfinish_z, &nop, &closethem, &bail, &sigint, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, &nop, - &nop, &nop, &nop, &closethem, &nop } + &wantdown, &wantdown, &wantup, &down_D, &up_U, &closethem, &wantdown } } ; @@ -687,8 +706,8 @@ static inline void handle_control (int fd) else if (!r) break ; else { - size_t pos = byte_chr("abqhkti12pcyroduxO", 18, c) ; - if (pos < 18) (*actions[state][V_a + pos])() ; + size_t pos = byte_chr("abqhkti12pcyroduDUxO", 20, c) ; + if (pos < 20) (*actions[state][V_a + pos])() ; } } } diff --git a/src/supervision/s6-svc.c b/src/supervision/s6-svc.c @@ -21,7 +21,6 @@ int main (int argc, char const *const *argv) { size_t len ; - int downfile = -1 ; unsigned int datalen = 1 ; unsigned int timeout = 0 ; char data[DATASIZE+1] = "-" ; @@ -51,6 +50,8 @@ int main (int argc, char const *const *argv) case 'o' : case 'd' : case 'u' : + case 'D' : + case 'U' : case 'x' : case 'O' : { @@ -58,20 +59,6 @@ int main (int argc, char const *const *argv) data[datalen++] = opt ; break ; } - case 'D' : - { - if (datalen >= DATASIZE) strerr_dief1x(100, "too many commands") ; - data[datalen++] = 'd' ; - downfile = 1 ; - break ; - } - case 'U' : - { - if (datalen >= DATASIZE) strerr_dief1x(100, "too many commands") ; - data[datalen++] = 'u' ; - downfile = 0 ; - break ; - } case 'T' : if (!uint0_scan(l.arg, &timeout)) dieusage() ; break ; case 'w' : { @@ -102,19 +89,6 @@ int main (int argc, char const *const *argv) } } - if (downfile >= 0) - { - char fn[len + 6] ; - memcpy(fn, argv[0], len) ; - memcpy(fn + len, "/down", 6) ; - if (downfile) - { - if (!openwritenclose_unsafe(fn, "", 0)) - strerr_diefu2sys(111, "touch ", fn) ; - } - else unlink_void(fn) ; - } - if (updown[1]) { char const *newargv[11] ;