summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2007-10-29 16:02:18 +0000
committerRoy Marples <roy@marples.name>2007-10-29 16:02:18 +0000
commitc9fe3ade4c2d736a708d335bcace3b0cd3bee168 (patch)
tree1a4eca96c6080aa701de358a809189d5ca034f6e /src
parent8c85fa399fa1ed6ac3e402ef557fcd44d1787859 (diff)
downloadopenrc-c9fe3ade4c2d736a708d335bcace3b0cd3bee168.tar.gz
openrc-c9fe3ade4c2d736a708d335bcace3b0cd3bee168.tar.bz2
openrc-c9fe3ade4c2d736a708d335bcace3b0cd3bee168.tar.xz
rc --override foo will override the runlevel to load after boot or single user runlevels to avoid rc recursion, #196338
Diffstat (limited to 'src')
-rw-r--r--src/_usage.c15
-rw-r--r--src/checkown.c1
-rw-r--r--src/fstabinfo.c1
-rw-r--r--src/rc.c15
4 files changed, 25 insertions, 7 deletions
diff --git a/src/_usage.c b/src/_usage.c
index 6b96510..78d1e33 100644
--- a/src/_usage.c
+++ b/src/_usage.c
@@ -20,9 +20,18 @@ static void usage (int exit_status)
for (i = 0; longopts[i].name; ++i) {
int len = printf (" -%c, --%s %s", longopts[i].val, longopts[i].name,
has_arg[longopts[i].has_arg]);
- while (++len < 37)
- printf (" ");
- puts (longopts_help[i]);
+
+ char *lo = xstrdup (longopts_help[i]);
+ char *p = lo;
+ char *token;
+
+ while ((token = strsep (&p, "\n"))) {
+ while (++len < 37)
+ printf (" ");
+ puts (token);
+ len = 0;
+ }
+ free (lo);
}
exit (exit_status);
}
diff --git a/src/checkown.c b/src/checkown.c
index 9fd9de1..17ead7b 100644
--- a/src/checkown.c
+++ b/src/checkown.c
@@ -22,6 +22,7 @@
#include "builtins.h"
#include "einfo.h"
+#include "rc-misc.h"
static char *applet = NULL;
diff --git a/src/fstabinfo.c b/src/fstabinfo.c
index 4d927f7..5d840ca 100644
--- a/src/fstabinfo.c
+++ b/src/fstabinfo.c
@@ -46,6 +46,7 @@
#include "builtins.h"
#include "einfo.h"
#include "rc.h"
+#include "rc-misc.h"
#include "strlist.h"
#ifdef HAVE_GETMNTENT
diff --git a/src/rc.c b/src/rc.c
index 243539f..ebf2537 100644
--- a/src/rc.c
+++ b/src/rc.c
@@ -544,7 +544,7 @@ static void single_user (void)
#endif
}
-static void set_ksoftlevel (const char *level)
+static bool set_ksoftlevel (const char *level)
{
FILE *fp;
@@ -556,16 +556,17 @@ static void set_ksoftlevel (const char *level)
if (exists (RC_KSOFTLEVEL) &&
unlink (RC_KSOFTLEVEL) != 0)
eerror ("unlink `%s': %s", RC_KSOFTLEVEL, strerror (errno));
- return;
+ return (false);
}
if (! (fp = fopen (RC_KSOFTLEVEL, "w"))) {
eerror ("fopen `%s': %s", RC_KSOFTLEVEL, strerror (errno));
- return;
+ return (false);
}
fprintf (fp, "%s", level);
fclose (fp);
+ return (true);
}
static int get_ksoftlevel (char *buffer, int buffer_len)
@@ -718,11 +719,13 @@ static void run_script (const char *script) {
}
#include "_usage.h"
-#define getoptstring getoptstring_COMMON
+#define getoptstring "o:" getoptstring_COMMON
static struct option longopts[] = {
+ { "override", 1, NULL, 'o' },
longopts_COMMON
};
static const char * const longopts_help[] = {
+ "override the next runlevel to change into\nwhen leaving single user or boot runlevels",
longopts_help_COMMON
};
#include "_usage.c"
@@ -870,6 +873,10 @@ int main (int argc, char **argv)
longopts, (int *) 0)) != -1)
{
switch (opt) {
+ case 'o':
+ if (strlen (optarg) == 0)
+ optarg = NULL;
+ exit (set_ksoftlevel (optarg) ? EXIT_SUCCESS : EXIT_FAILURE);
case_RC_COMMON_GETOPT
}
}