rc --override foo will override the runlevel to load after boot or single user runlevels to avoid rc recursion, #196338

This commit is contained in:
Roy Marples 2007-10-29 16:02:18 +00:00
parent 8c85fa399f
commit c9fe3ade4c
5 changed files with 28 additions and 7 deletions

View File

@ -3,6 +3,9 @@
29 Oct 2007; Roy Marples <uberlord@gentoo.org>:
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.

View File

@ -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);
}

View File

@ -22,6 +22,7 @@
#include "builtins.h"
#include "einfo.h"
#include "rc-misc.h"
static char *applet = NULL;

View File

@ -46,6 +46,7 @@
#include "builtins.h"
#include "einfo.h"
#include "rc.h"
#include "rc-misc.h"
#include "strlist.h"
#ifdef HAVE_GETMNTENT

View File

@ -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
}
}