diff options
-rw-r--r-- | man/rc-service.8 | 18 | ||||
-rw-r--r-- | src/rc/rc-service.c | 25 |
2 files changed, 29 insertions, 14 deletions
diff --git a/man/rc-service.8 b/man/rc-service.8 index 7d9f3981..b19bb23e 100644 --- a/man/rc-service.8 +++ b/man/rc-service.8 @@ -1,4 +1,4 @@ -.\" Copyright 2008 Roy Marples +.\" Copyright 2008-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 Mar 26, 2008 +.Dd May 1, 2009 .Dt RC-SERVICE 8 SMM .Os OpenRC .Sh NAME @@ -30,20 +30,26 @@ .Nd locate and run an OpenRC service with the given arguments .Sh SYNOPSIS .Nm +.Op Fl i , -ifexists .Ar service cmd .Op Ar ... .Nm -.Fl l , -list -.Nm .Fl e , -exists .Ar service .Nm +.Fl l , -list +.Nm .Fl r , -resolve .Ar service .Sh DESCRIPTION Service scripts could be in different places on different systems. .Nm locates the specified service and runs it with the given arguments. +If +.Fl i , -ifexists +is given then +.Nm +returns 0 even if the service does not exist. .Pp If given the .Fl l , -list @@ -51,11 +57,11 @@ argument then .Nm will list all available services. .Pp -.Fl -e , exists +.Fl e , -exists return 0 if it can find .Ar service , otherwise -1. -.Fl -r , resolve +.Fl r , -resolve does the same and also prints the full path of the service to stdout. .Sh SEE ALSO .Xr rc 8 , diff --git a/src/rc/rc-service.c b/src/rc/rc-service.c index 82d4cf22..84789f3c 100644 --- a/src/rc/rc-service.c +++ b/src/rc/rc-service.c @@ -43,15 +43,17 @@ extern char *applet; #include "_usage.h" -#define getoptstring "e:lr:" getoptstring_COMMON +#define getoptstring "e:ilr:" getoptstring_COMMON static const struct option longopts[] = { - { "exists", 1, NULL, 'e' }, - { "list", 0, NULL, 'l' }, - { "resolve", 1, NULL, 'r' }, + { "exists", 1, NULL, 'e' }, + { "ifexists", 0, NULL, 'i' }, + { "list", 0, NULL, 'l' }, + { "resolve", 1, NULL, 'r' }, longopts_COMMON }; static const char * const longopts_help[] = { "tests if the service exists or not", + "if the service exsits then run the command", "list all available services", "resolve the service name to an init script", longopts_help_COMMON @@ -65,6 +67,7 @@ rc_service(int argc, char **argv) char *service; RC_STRINGLIST *list; RC_STRING *s; + bool if_exists = false; /* Ensure that we are only quiet when explicitly told to be */ unsetenv("EINFO_QUIET"); @@ -81,9 +84,12 @@ rc_service(int argc, char **argv) #endif return opt; /* NOTREACHED */ + case 'i': + if_exists = true; + break; case 'l': list = rc_services_in_runlevel(NULL); - if (!TAILQ_FIRST(list)) + if (TAILQ_FIRST(list) == NULL) return EXIT_FAILURE; rc_stringlist_sort(&list); TAILQ_FOREACH(s, list, entries) @@ -95,7 +101,7 @@ rc_service(int argc, char **argv) /* NOTREACHED */ case 'r': service = rc_service_resolve(optarg); - if (!service) + if (service == NULL) return EXIT_FAILURE; printf("%s\n", service); #ifdef DEBUG_MEMORY @@ -110,10 +116,13 @@ rc_service(int argc, char **argv) argc -= optind; argv += optind; - if (!*argv) + if (*argv == NULL) eerrorx("%s: you need to specify a service", applet); - if (!(service = rc_service_resolve(*argv))) + if ((service = rc_service_resolve(*argv)) == NULL) { + if (if_exists) + return 0; eerrorx("%s: service `%s' does not exist", applet, *argv); + } *argv = service; execv(*argv, argv); eerrorx("%s: %s", applet, strerror(errno)); |