Add --list to rc-service to list all available services.

This commit is contained in:
Roy Marples 2008-03-21 09:10:59 +00:00
parent e505e6ea41
commit 494fb0a5f6
6 changed files with 121 additions and 29 deletions

View File

@ -22,7 +22,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE. .\" SUCH DAMAGE.
.\" .\"
.Dd Mar 19, 2008 .Dd Mar 21, 2008
.Dt RC-SERVICE 8 SMM .Dt RC-SERVICE 8 SMM
.Os OpenRC .Os OpenRC
.Sh NAME .Sh NAME
@ -32,10 +32,18 @@
.Nm .Nm
.Ar service cmd .Ar service cmd
.Op Ar ... .Op Ar ...
.Nm
.Fl l , -list
.Sh DESCRIPTION .Sh DESCRIPTION
Service scripts could be in different places on different systems. Service scripts could be in different places on different systems.
.Nm .Nm
locates the specified service and runs it with the given arguments. 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 .Sh SEE ALSO
.Xr rc 8 , .Xr rc 8 ,
.Sh AUTHORS .Sh AUTHORS

1
src/rc/.gitignore vendored
View File

@ -62,6 +62,7 @@ rc-depend.o
rc-logger.o rc-logger.o
rc-misc.o rc-misc.o
rc-plugin.o rc-plugin.o
rc-service.o
rc-status.o rc-status.o
rc-update.o rc-update.o
runscript.o runscript.o

View File

@ -1,7 +1,7 @@
PROG= rc PROG= rc
SRCS= checkpath.c fstabinfo.c mountinfo.c start-stop-daemon.c \ SRCS= checkpath.c fstabinfo.c mountinfo.c start-stop-daemon.c \
rc-applets.c rc-depend.c rc-logger.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 runscript.c rc.c
CLEANFILES= version.h CLEANFILES= version.h

View File

@ -26,16 +26,17 @@
#include "rc.h" #include "rc.h"
int checkpath (int argc, char **argv); int checkpath(int, char **);
int fstabinfo (int argc, char **argv); int fstabinfo(int, char **);
int mountinfo (int argc, char **argv); int mountinfo(int, char **);
int rc_depend (int argc, char **argv); int rc_depend(int, char **);
int rc_status (int argc, char **argv); int rc_service(int, char **);
int rc_update (int argc, char **argv); int rc_status(int, char **);
int runscript (int argc, char **argv); int rc_update(int, char **);
int start_stop_daemon (int argc, char **argv); 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 */ /* Handy function so we can wrap einfo around our deptree */
RC_DEPTREE *_rc_deptree_load (int *regen); RC_DEPTREE *_rc_deptree_load (int *);

View File

@ -362,23 +362,6 @@ static int do_shell_var(int argc, char **argv)
return EXIT_SUCCESS; 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) void run_applets(int argc, char **argv)
{ {
int i = 2; int i = 2;

99
src/rc/rc-service.c Normal file
View File

@ -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 */
}