diff options
Diffstat (limited to 'src/rc/rc-service.c')
| -rw-r--r-- | src/rc/rc-service.c | 99 | 
1 files changed, 99 insertions, 0 deletions
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 */ +}  | 
