From 494fb0a5f6df3c8da636f4db057fbb3994c1ad6c Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Fri, 21 Mar 2008 09:10:59 +0000 Subject: [PATCH] Add --list to rc-service to list all available services. --- man/rc-service.8 | 10 ++++- src/rc/.gitignore | 1 + src/rc/Makefile | 2 +- src/rc/builtins.h | 21 +++++----- src/rc/rc-applets.c | 17 -------- src/rc/rc-service.c | 99 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 121 insertions(+), 29 deletions(-) create mode 100644 src/rc/rc-service.c diff --git a/man/rc-service.8 b/man/rc-service.8 index 840f22b8..0668eafa 100644 --- a/man/rc-service.8 +++ b/man/rc-service.8 @@ -22,7 +22,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd Mar 19, 2008 +.Dd Mar 21, 2008 .Dt RC-SERVICE 8 SMM .Os OpenRC .Sh NAME @@ -32,10 +32,18 @@ .Nm .Ar service cmd .Op Ar ... +.Nm +.Fl l , -list .Sh DESCRIPTION Service scripts could be in different places on different systems. .Nm locates the specified service and runs it with the given arguments. +.Pp +If given the +.Fl l , -list +argument then +.Nm +will list all available services. .Sh SEE ALSO .Xr rc 8 , .Sh AUTHORS diff --git a/src/rc/.gitignore b/src/rc/.gitignore index ac40b084..7553720e 100644 --- a/src/rc/.gitignore +++ b/src/rc/.gitignore @@ -62,6 +62,7 @@ rc-depend.o rc-logger.o rc-misc.o rc-plugin.o +rc-service.o rc-status.o rc-update.o runscript.o diff --git a/src/rc/Makefile b/src/rc/Makefile index d2c71207..567541ed 100644 --- a/src/rc/Makefile +++ b/src/rc/Makefile @@ -1,7 +1,7 @@ PROG= rc SRCS= checkpath.c fstabinfo.c mountinfo.c start-stop-daemon.c \ rc-applets.c rc-depend.c rc-logger.c \ - rc-misc.c rc-plugin.c rc-status.c rc-update.c \ + rc-misc.c rc-plugin.c rc-service.c rc-status.c rc-update.c \ runscript.c rc.c CLEANFILES= version.h diff --git a/src/rc/builtins.h b/src/rc/builtins.h index 81325847..5b605455 100644 --- a/src/rc/builtins.h +++ b/src/rc/builtins.h @@ -26,16 +26,17 @@ #include "rc.h" -int checkpath (int argc, char **argv); -int fstabinfo (int argc, char **argv); -int mountinfo (int argc, char **argv); -int rc_depend (int argc, char **argv); -int rc_status (int argc, char **argv); -int rc_update (int argc, char **argv); -int runscript (int argc, char **argv); -int start_stop_daemon (int argc, char **argv); +int checkpath(int, char **); +int fstabinfo(int, char **); +int mountinfo(int, char **); +int rc_depend(int, char **); +int rc_service(int, char **); +int rc_status(int, char **); +int rc_update(int, char **); +int runscript(int, char **); +int start_stop_daemon(int, char **); -void run_applets (int argc, char **argv); +void run_applets(int, char **); /* Handy function so we can wrap einfo around our deptree */ -RC_DEPTREE *_rc_deptree_load (int *regen); +RC_DEPTREE *_rc_deptree_load (int *); diff --git a/src/rc/rc-applets.c b/src/rc/rc-applets.c index e67f8c1a..539ef39a 100644 --- a/src/rc/rc-applets.c +++ b/src/rc/rc-applets.c @@ -362,23 +362,6 @@ static int do_shell_var(int argc, char **argv) return EXIT_SUCCESS; } -static int rc_service(_unused int argc, char **argv) -{ - char *service; - - if (argc < 2) - eerrorx("%s: you need to specify a service", - applet); - - if (!(service = rc_service_resolve(argv[1]))) - eerrorx("%s: service `%s' does not exist", applet, argv[1]); - - *++argv = service; - execv(*argv, argv); - eerrorx("%s: %s", applet, strerror(errno)); - /* NOTREACHED */ -} - void run_applets(int argc, char **argv) { int i = 2; diff --git a/src/rc/rc-service.c b/src/rc/rc-service.c new file mode 100644 index 00000000..e7bd62c8 --- /dev/null +++ b/src/rc/rc-service.c @@ -0,0 +1,99 @@ +/* + rc-service.c + Finds all OpenRC services + */ + +/* + * Copyright 2008 Roy Marples + * All rights reserved + + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "builtins.h" +#include "einfo.h" +#include "rc.h" +#include "rc-misc.h" + +extern char *applet; + +#include "_usage.h" +#define getoptstring "l" getoptstring_COMMON +static const struct option longopts[] = { + { "list", 0, NULL, 'l' }, + longopts_COMMON +}; +static const char * const longopts_help[] = { + "list all available services", + longopts_help_COMMON +}; +#include "_usage.c" + +int rc_service(int argc, char **argv) +{ + int opt; + char *service; + RC_STRINGLIST *list; + RC_STRING *s; + + /* Ensure that we are only quiet when explicitly told to be */ + unsetenv("EINFO_QUIET"); + + while ((opt = getopt_long(argc, argv, getoptstring, + longopts, (int *) 0)) != -1) + { + switch (opt) { + case 'l': + list = rc_services_in_runlevel(NULL); + if (! list) + return EXIT_FAILURE; + rc_stringlist_sort(&list); + TAILQ_FOREACH(s, list, entries) + printf("%s\n", s->value); + rc_stringlist_free(list); + return EXIT_SUCCESS; + /* NOTREACHED */ + + case_RC_COMMON_GETOPT + } + } + + argc -= optind; + argv += optind; + + if (!*argv) + eerrorx("%s: you need to specify a service", applet); + + if (!(service = rc_service_resolve(*argv))) + eerrorx("%s: service `%s' does not exist", applet, *argv); + + *argv = service; + execv(*argv, argv); + eerrorx("%s: %s", applet, strerror(errno)); + /* NOTREACHED */ +}