diff options
Diffstat (limited to 'src/genrc.c')
-rw-r--r-- | src/genrc.c | 85 |
1 files changed, 56 insertions, 29 deletions
diff --git a/src/genrc.c b/src/genrc.c index ae3070d..9052987 100644 --- a/src/genrc.c +++ b/src/genrc.c @@ -27,3 +27,5 @@ enum { OPT_SIGNAL_STOP, - OPT_CREATE_PIDFILE + OPT_CREATE_PIDFILE, + OPT_RESTART_ON_EXIT, + OPT_RESTART_ON_SIGNAL, }; @@ -31,18 +33,20 @@ enum { struct option longopts[] = { - { "help", no_argument, 0, 'h' }, - { "usage", no_argument, 0, OPT_USAGE }, - { "command", required_argument, 0, 'c' }, - { "program", required_argument, 0, 'p' }, - { "pid-from", required_argument, 0, 'P' }, - { "pidfile", required_argument, 0, 'F' }, - { "timeout", required_argument, 0, 't' }, - { "signal-reload", required_argument, 0, OPT_SIGNAL_RELOAD }, - { "no-reload", no_argument, 0, OPT_NO_RELOAD }, - { "signal-stop", required_argument, 0, OPT_SIGNAL_STOP }, - { "sentinel", no_argument, 0, 'S' }, - { "create-pidfile", required_argument, 0, OPT_CREATE_PIDFILE }, - { "version", no_argument, 0, OPT_VERSION }, - { "verbose", no_argument, 0, 'v' }, - { "user", required_argument, 0, 'u' }, - { "group", required_argument, 0, 'g' }, + { "help", no_argument, 0, 'h' }, + { "usage", no_argument, 0, OPT_USAGE }, + { "command", required_argument, 0, 'c' }, + { "program", required_argument, 0, 'p' }, + { "pid-from", required_argument, 0, 'P' }, + { "pidfile", required_argument, 0, 'F' }, + { "timeout", required_argument, 0, 't' }, + { "signal-reload", required_argument, 0, OPT_SIGNAL_RELOAD }, + { "no-reload", no_argument, 0, OPT_NO_RELOAD }, + { "signal-stop", required_argument, 0, OPT_SIGNAL_STOP }, + { "sentinel", no_argument, 0, 'S' }, + { "create-pidfile", required_argument, 0, OPT_CREATE_PIDFILE }, + { "version", no_argument, 0, OPT_VERSION }, + { "verbose", no_argument, 0, 'v' }, + { "user", required_argument, 0, 'u' }, + { "group", required_argument, 0, 'g' }, + { "restart-on-exit", required_argument, 0, OPT_RESTART_ON_EXIT }, + { "restart-on-signal", required_argument, 0, OPT_RESTART_ON_SIGNAL }, { NULL } @@ -129,12 +133,18 @@ is_numeric_str(char const *s) int -sig_name_to_str(char const *s) +str_to_int(char const *s) +{ + char *end; + unsigned long n; + errno = 0; + n = strtoul(s, &end, 10); + if (errno || *end || n > UINT_MAX) + return -1; + return n; +} + +int +str_to_sig(char const *s) { if (is_numeric_str(s)) { - char *end; - unsigned long n; - errno = 0; - n = strtoul(s, &end, 10); - if (errno || *end || n > UINT_MAX) - return -1; - return n; + return str_to_int(s); } else { @@ -185,4 +195,2 @@ char const *help_msg[] = { " terminate", - " --sentinel PROGRAM runs in foreground; disconnect from the", - " controlling terminal, run it and act as a sentinel", " -P, --pid-from=SOURCE where to look for PIDs of the running programs", @@ -196,2 +204,13 @@ char const *help_msg[] = { "", + "Sentinel mode:", + "", + " --sentinel PROGRAM runs in foreground; disconnect from the", + " controlling terminal, run it and act as a sentinel", + " --restart-on-exit=[!]CODE[,...]", + " restart the program if it exits with one of the", + " listed status codes", + " --restart-on-signal=[!]SIG[,...]", + " restart the program if it terminates on one of the", + " listed signals", + "", "Informational options:", @@ -274,2 +293,4 @@ char const *usage_msg[] = { "[--program=PROGRAM]", + "[--restart-on-exit=[!]CODE[,...]]", + "[--restart-on-signal=[!]SIG[,...]]", "[--sentinel]", @@ -424,2 +445,8 @@ main(int argc, char **argv) break; + case OPT_RESTART_ON_EXIT: + add_restart_condition(RESTART_ON_EXIT, optarg); + break; + case OPT_RESTART_ON_SIGNAL: + add_restart_condition(RESTART_ON_SIGNAL, optarg); + break; case OPT_NO_RELOAD: @@ -452,3 +479,3 @@ main(int argc, char **argv) else if ((p = getenv("GENRC_SIGNAL_RELOAD")) != NULL) { - genrc_signal_reload = sig_name_to_str(p); + genrc_signal_reload = str_to_sig(p); if (genrc_signal_reload == -1) @@ -460,3 +487,3 @@ main(int argc, char **argv) if ((p = getenv("GENRC_SIGNAL_STOP")) != NULL) { - genrc_signal_stop = sig_name_to_str(p); + genrc_signal_stop = str_to_sig(p); if (genrc_signal_stop <= 0) |