From 9966a902ab375128e128edc4ca85676656b759db Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Fri, 24 Apr 2009 10:17:53 +0000 Subject: [PATCH] rc-status -c now lists services that have crashed. It returns 0 if there are crashed services, otherwise 1. This it easy to restart crashed services automatically. More for #120. --- man/rc-status.8 | 11 ++++++++--- src/rc/rc-status.c | 20 +++++++++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/man/rc-status.8 b/man/rc-status.8 index 8ffcec26..72f2aacf 100644 --- a/man/rc-status.8 +++ b/man/rc-status.8 @@ -1,4 +1,4 @@ -.\" Copyright 2007-2008 Roy Marples +.\" Copyright 2007-2009 Roy Marples .\" All rights reserved .\" .\" Redistribution and use in source and binary forms, with or without @@ -22,7 +22,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd Arp 9, 2008 +.Dd April 24, 2008 .Dt RC-STATUS 8 SMM .Os OpenRC .Sh NAME @@ -30,7 +30,7 @@ .Nd show status info about runlevels .Sh SYNOPSIS .Nm -.Op Fl alsuC +.Op Fl aclsuC .Op Ar runlevel .Sh DESCRIPTION .Nm @@ -43,6 +43,8 @@ The options are as follows: .Bl -tag -width ".Fl test , test string" .It Fl a , -all Show all runlevels and their services. +.It Fl c , -crashed +List all services that have crashed. .It Fl l , -list List all defined runlevels. .It fl r , -runlevel @@ -57,6 +59,9 @@ Disable color output. Show information only for the named .Ar runlevel . .El +.Sh EXIT STATUS +.Nm +exits 0, except when checking for crashed services and it doesn't find any. .Sh SEE ALSO .Xr rc 8 , .Xr rc-update 8 diff --git a/src/rc/rc-status.c b/src/rc/rc-status.c index 2f386a41..320b92c8 100644 --- a/src/rc/rc-status.c +++ b/src/rc/rc-status.c @@ -172,9 +172,10 @@ print_services(const char *runlevel, RC_STRINGLIST *svcs) #include "_usage.h" #define extraopts "[runlevel1] [runlevel2] ..." -#define getoptstring "alrsu" getoptstring_COMMON +#define getoptstring "aclrsu" getoptstring_COMMON static const struct option longopts[] = { {"all", 0, NULL, 'a'}, + {"crashed", 0, NULL, 'c'}, {"list", 0, NULL, 'l'}, {"runlevel", 0, NULL, 'r'}, {"servicelist", 0, NULL, 's'}, @@ -183,6 +184,7 @@ static const struct option longopts[] = { }; static const char * const longopts_help[] = { "Show services from all run levels", + "Show crashed services", "Show list of run levels", "Show the name of the current runlevel", "Show service list", @@ -196,7 +198,7 @@ rc_status(int argc, char **argv) { RC_STRING *s, *l, *t; char *p, *runlevel = NULL; - int opt, aflag = 0; + int opt, aflag = 0, retval = 0; test_crashed = _rc_can_find_pids(); @@ -207,10 +209,14 @@ rc_status(int argc, char **argv) aflag++; levels = rc_runlevel_list(); break; - case 'l': - levels = rc_runlevel_list(); - TAILQ_FOREACH (l, levels, entries) - printf("%s\n", l->value); + case 'c': + services = rc_services_in_state(RC_SERVICE_STARTED); + retval = 1; + TAILQ_FOREACH(s, services, entries) + if (rc_service_daemons_crashed(s->value)) { + printf("%s\n", s->value); + retval = 0; + } goto exit; /* NOTREACHED */ case 'r': @@ -344,5 +350,5 @@ exit: rc_deptree_free(deptree); #endif - return(EXIT_SUCCESS); + return retval; }