From d9ec62b22a8ccfebda4af34d8319b33a8a5e3bbb Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Wed, 19 Mar 2008 17:11:50 +0000 Subject: Add rc-service and update all softlevel refs to runlevel. --- src/includes/rc-misc.h | 2 +- src/librc/librc.c | 6 +++--- src/rc/Makefile | 2 +- src/rc/rc-applets.c | 14 ++++++++++++++ src/rc/rc-depend.c | 2 +- src/rc/rc-misc.c | 2 +- src/rc/rc.c | 33 ++++++++++++++++++++++----------- 7 files changed, 43 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/includes/rc-misc.h b/src/includes/rc-misc.h index 9a706175..81ffbc64 100644 --- a/src/includes/rc-misc.h +++ b/src/includes/rc-misc.h @@ -76,7 +76,7 @@ # define RC_LOCAL_CONFDIR LOCAL_PREFIX SYSCONFDIR "/conf.d" #endif -#define RC_KSOFTLEVEL RC_SVCDIR "/ksoftlevel" +#define RC_KRUNLEVEL RC_SVCDIR "/krunlevel" #define RC_STARTING RC_SVCDIR "/rc.starting" #define RC_STOPPING RC_SVCDIR "/rc.stopping" diff --git a/src/librc/librc.c b/src/librc/librc.c index f2b7758d..8ce9469d 100644 --- a/src/librc/librc.c +++ b/src/librc/librc.c @@ -37,7 +37,7 @@ const char librc_copyright[] = "Copyright (c) 2007-2008 Roy Marples"; #endif #include -#define SOFTLEVEL RC_SVCDIR "/softlevel" +#define RC_RUNLEVEL RC_SVCDIR "/softlevel" #ifndef S_IXUGO # define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH) @@ -268,7 +268,7 @@ char *rc_runlevel_get(void) FILE *fp; char *runlevel = NULL; - if ((fp = fopen(SOFTLEVEL, "r"))) { + if ((fp = fopen(RC_RUNLEVEL, "r"))) { runlevel = xmalloc(sizeof(char) * PATH_MAX); if (fgets(runlevel, PATH_MAX, fp)) { int i = strlen(runlevel) - 1; @@ -290,7 +290,7 @@ librc_hidden_def(rc_runlevel_get) bool rc_runlevel_set(const char *runlevel) { - FILE *fp = fopen(SOFTLEVEL, "w"); + FILE *fp = fopen(RC_RUNLEVEL, "w"); if (! fp) return false; diff --git a/src/rc/Makefile b/src/rc/Makefile index 8c43da85..d2c71207 100644 --- a/src/rc/Makefile +++ b/src/rc/Makefile @@ -11,7 +11,7 @@ SBINDIR= ${PREFIX}/sbin LINKDIR= ${PREFIX}/${LIBNAME}/${PROG} BINLINKS= rc-status -SBINLINKS= rc-update runscript start-stop-daemon +SBINLINKS= rc-service rc-update runscript start-stop-daemon RC_BINLINKS= einfon einfo ewarnn ewarn eerrorn eerror ebegin eend ewend \ eindent eoutdent esyslog eval_ecolors \ veinfo vewarn vebegin veend vewend veindent veoutdent \ diff --git a/src/rc/rc-applets.c b/src/rc/rc-applets.c index 96b392d8..821832cd 100644 --- a/src/rc/rc-applets.c +++ b/src/rc/rc-applets.c @@ -362,6 +362,18 @@ static int do_shell_var(int argc, char **argv) return EXIT_SUCCESS; } +static int rc_service(_unused int argc, char **argv) +{ + char *service = rc_service_resolve(argv[1]); + + if (!service) + eerrorx("%s: service `%s' does not exist", applet, optarg); + + *++argv = service; + execv(*argv, argv); + eerrorx("%s: %s", applet, strerror(errno)); + /* NOTREACHED */ +} void run_applets(int argc, char **argv) { @@ -377,6 +389,8 @@ void run_applets(int argc, char **argv) exit(mountinfo(argc, argv)); else if (strcmp(applet, "rc-depend") == 0) exit(rc_depend(argc, argv)); + else if (strcmp(applet, "rc-service") == 0) + exit(rc_service(argc, argv)); else if (strcmp(applet, "rc-status") == 0) exit(rc_status(argc, argv)); else if (strcmp(applet, "rc-update") == 0 || diff --git a/src/rc/rc-depend.c b/src/rc/rc-depend.c index 33a50f06..908cf3a5 100644 --- a/src/rc/rc-depend.c +++ b/src/rc/rc-depend.c @@ -107,7 +107,7 @@ int rc_depend(int argc, char **argv) int options = RC_DEP_TRACE; bool first = true; bool update = false; - char *runlevel = xstrdup(getenv("RC_SOFTLEVEL")); + char *runlevel = xstrdup(getenv("RC_RUNLEVEL")); int opt; char *token; diff --git a/src/rc/rc-misc.c b/src/rc/rc-misc.c index 7c5d1014..e802ee4f 100644 --- a/src/rc/rc-misc.c +++ b/src/rc/rc-misc.c @@ -224,7 +224,7 @@ void env_config(void) setenv("RC_RUNLEVEL", e, 1); free(e); - if ((fp = fopen(RC_KSOFTLEVEL, "r"))) { + if ((fp = fopen(RC_KRUNLEVEL, "r"))) { memset(buffer, 0, sizeof (buffer)); if (fgets(buffer, sizeof (buffer), fp)) { l = strlen (buffer) - 1; diff --git a/src/rc/rc.c b/src/rc/rc.c index fab23255..85ab5578 100644 --- a/src/rc/rc.c +++ b/src/rc/rc.c @@ -367,14 +367,14 @@ static bool set_ksoftlevel(const char *level) strcmp(level, RC_LEVEL_SINGLE) == 0 || strcmp(level, RC_LEVEL_SYSINIT) == 0) { - if (exists(RC_KSOFTLEVEL) && - unlink(RC_KSOFTLEVEL) != 0) - eerror("unlink `%s': %s", RC_KSOFTLEVEL, strerror(errno)); + if (exists(RC_KRUNLEVEL) && + unlink(RC_KRUNLEVEL) != 0) + eerror("unlink `%s': %s", RC_KRUNLEVEL, strerror(errno)); return false; } - if (! (fp = fopen(RC_KSOFTLEVEL, "w"))) { - eerror("fopen `%s': %s", RC_KSOFTLEVEL, strerror(errno)); + if (! (fp = fopen(RC_KRUNLEVEL, "w"))) { + eerror("fopen `%s': %s", RC_KRUNLEVEL, strerror(errno)); return false; } @@ -388,11 +388,11 @@ static int get_ksoftlevel(char *buffer, int buffer_len) FILE *fp; int i = 0; - if (! exists(RC_KSOFTLEVEL)) + if (! exists(RC_KRUNLEVEL)) return 0; - if (! (fp = fopen(RC_KSOFTLEVEL, "r"))) { - eerror("fopen `%s': %s", RC_KSOFTLEVEL, strerror(errno)); + if (! (fp = fopen(RC_KRUNLEVEL, "r"))) { + eerror("fopen `%s': %s", RC_KRUNLEVEL, strerror(errno)); return -1; } @@ -683,7 +683,7 @@ static void do_newlevel(const char *newlevel) printf("Press %sI%s to enter interactive boot mode\n\n", ecolor(ECOLOR_GOOD), ecolor(ECOLOR_NORMAL)); - setenv("RC_SOFTLEVEL", newlevel, 1); + setenv("RC_RUNLEVEL", newlevel, 1); rc_plugin_run(RC_HOOK_RUNLEVEL_START_IN, newlevel); hook_out = RC_HOOK_RUNLEVEL_START_OUT; run_script(INITSH); @@ -902,10 +902,12 @@ interactive_option: #define getoptstring "o:" getoptstring_COMMON static const struct option longopts[] = { { "override", 1, NULL, 'o' }, + { "service", 1, NULL, 's' }, longopts_COMMON }; static const char * const longopts_help[] = { "override the next runlevel to change into\nwhen leaving single user or boot runlevels", + "runs the service specified with the rest\nof the arguments", longopts_help_COMMON }; #include "_usage.c" @@ -958,8 +960,7 @@ int main(int argc, char **argv) chdir("/"); /* RUNLEVEL is set by sysvinit as is a magic number - * RC_SOFTLEVEL is set by us and is the name for this magic number - * even though all our userland documentation refers to runlevel */ + * RC_RUNLEVEL is set by us and is the name for this magic number */ RUNLEVEL = getenv("RUNLEVEL"); PREVLEVEL = getenv("PREVLEVEL"); @@ -979,6 +980,16 @@ int main(int argc, char **argv) optarg = NULL; exit(set_ksoftlevel(optarg) ? EXIT_SUCCESS : EXIT_FAILURE); /* NOTREACHED */ + case 's': + newlevel = rc_service_resolve(optarg); + if (!newlevel) + eerrorx("%s: service `%s' does not exist", + applet, optarg); + argv += optind - 1; + *argv = newlevel; + execv(*argv, argv); + eerrorx("%s: %s", applet, strerror(errno)); + /* NOTREACHED */ case_RC_COMMON_GETOPT } } -- cgit v1.2.3