diff options
| -rw-r--r-- | man/rc-service.8 | 10 | ||||
| -rw-r--r-- | src/rc/.gitignore | 1 | ||||
| -rw-r--r-- | src/rc/Makefile | 2 | ||||
| -rw-r--r-- | src/rc/builtins.h | 21 | ||||
| -rw-r--r-- | src/rc/rc-applets.c | 17 | ||||
| -rw-r--r-- | src/rc/rc-service.c | 99 | 
6 files changed, 121 insertions, 29 deletions
| 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 <getopt.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#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 */ +} | 
