From c9fe3ade4c2d736a708d335bcace3b0cd3bee168 Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Mon, 29 Oct 2007 16:02:18 +0000 Subject: [PATCH] rc --override foo will override the runlevel to load after boot or single user runlevels to avoid rc recursion, #196338 --- ChangeLog | 3 +++ src/_usage.c | 15 ++++++++++++--- src/checkown.c | 1 + src/fstabinfo.c | 1 + src/rc.c | 15 +++++++++++---- 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index d819f09e..901ba64e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,9 @@ 29 Oct 2007; Roy Marples : + rc --override foo will override the runlevel to load after boot + or single user runlevels to avoid rc recursion, #196338 + /etc/mtab is now a true reflection on /proc/mounts. The only exception is that we punt any / on tmpfs entry, #194615. diff --git a/src/_usage.c b/src/_usage.c index 6b96510d..78d1e337 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 9fd9de1a..17ead7b8 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 4d927f71..5d840caa 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 243539f3..ebf25378 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 } }