diff options
author | Roy Marples <roy@marples.name> | 2007-10-29 16:02:18 +0000 |
---|---|---|
committer | Roy Marples <roy@marples.name> | 2007-10-29 16:02:18 +0000 |
commit | c9fe3ade4c2d736a708d335bcace3b0cd3bee168 (patch) | |
tree | 1a4eca96c6080aa701de358a809189d5ca034f6e /src | |
parent | 8c85fa399fa1ed6ac3e402ef557fcd44d1787859 (diff) |
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.c | 15 | ||||
-rw-r--r-- | src/checkown.c | 1 | ||||
-rw-r--r-- | src/fstabinfo.c | 1 | ||||
-rw-r--r-- | src/rc.c | 15 |
4 files changed, 25 insertions, 7 deletions
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 @@ -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 } } |