Don't do interactive when changing init, #174141.

This commit is contained in:
Roy Marples 2007-07-11 13:02:05 +00:00
parent 356c41f77c
commit 74d52e749d
2 changed files with 34 additions and 27 deletions

View File

@ -1,6 +1,10 @@
# ChangeLog for Gentoo System Intialization ("rc") scripts # ChangeLog for Gentoo System Intialization ("rc") scripts
# Copyright 1999-2007 Gentoo Foundation; Distributed under the GPLv2 # Copyright 1999-2007 Gentoo Foundation; Distributed under the GPLv2
11 Jul 2007; Roy Marples <uberlord@gentoo.org>:
Don't do interactive when changing init, #174141.
10 Jul 2007; Roy Marples <uberlord@gentoo.org>: 10 Jul 2007; Roy Marples <uberlord@gentoo.org>:
init scripts and their extra options can now have descriptions, #184327. init scripts and their extra options can now have descriptions, #184327.

View File

@ -58,6 +58,9 @@
extern char **environ; extern char **environ;
static char *RUNLEVEL = NULL;
static char *PREVLEVEL = NULL;
static char *applet = NULL; static char *applet = NULL;
static char **env = NULL; static char **env = NULL;
static char **newenv = NULL; static char **newenv = NULL;
@ -84,7 +87,7 @@ static void cleanup (void)
rc_plugin_unload (); rc_plugin_unload ();
if (! rc_in_plugin && termios_orig) { if (! rc_in_plugin && termios_orig) {
tcsetattr (STDIN_FILENO, TCSANOW, termios_orig); tcsetattr (fileno (stdin), TCSANOW, termios_orig);
free (termios_orig); free (termios_orig);
} }
@ -338,18 +341,19 @@ static char read_key (bool block)
{ {
struct termios termios; struct termios termios;
char c = 0; char c = 0;
int fd = fileno (stdin);
if (! isatty (STDIN_FILENO)) if (! isatty (fd))
return (false); return (false);
/* Now save our terminal settings. We need to restore them at exit as we /* Now save our terminal settings. We need to restore them at exit as we
will be changing it for non-blocking reads for Interactive */ will be changing it for non-blocking reads for Interactive */
if (! termios_orig) { if (! termios_orig) {
termios_orig = rc_xmalloc (sizeof (struct termios)); termios_orig = rc_xmalloc (sizeof (struct termios));
tcgetattr (STDIN_FILENO, termios_orig); tcgetattr (fd, termios_orig);
} }
tcgetattr (STDIN_FILENO, &termios); tcgetattr (fd, &termios);
termios.c_lflag &= ~(ICANON | ECHO); termios.c_lflag &= ~(ICANON | ECHO);
if (block) if (block)
termios.c_cc[VMIN] = 1; termios.c_cc[VMIN] = 1;
@ -357,11 +361,11 @@ static char read_key (bool block)
termios.c_cc[VMIN] = 0; termios.c_cc[VMIN] = 0;
termios.c_cc[VTIME] = 0; termios.c_cc[VTIME] = 0;
} }
tcsetattr (STDIN_FILENO, TCSANOW, &termios); tcsetattr (fd, TCSANOW, &termios);
read (STDIN_FILENO, &c, 1); read (fd, &c, 1);
tcsetattr (STDIN_FILENO, TCSANOW, termios_orig); tcsetattr (fd, TCSANOW, termios_orig);
return (c); return (c);
} }
@ -370,6 +374,12 @@ static bool want_interactive (void)
{ {
char c; char c;
if (PREVLEVEL &&
strcmp (PREVLEVEL, "N") != 0 &&
strcmp (PREVLEVEL, "S") != 0 &&
strcmp (PREVLEVEL, "1") != 0)
return (false);
if (! rc_is_env ("RC_INTERACTIVE", "yes")) if (! rc_is_env ("RC_INTERACTIVE", "yes"))
return (false); return (false);
@ -539,8 +549,6 @@ static void handle_signal (int sig)
{ {
int serrno = errno; int serrno = errno;
char signame[10] = { '\0' }; char signame[10] = { '\0' };
char *run;
char *prev;
pidlist_t *pl; pidlist_t *pl;
pid_t pid; pid_t pid;
int status = 0; int status = 0;
@ -583,14 +591,12 @@ static void handle_signal (int sig)
rc_plugin_run (rc_hook_abort, NULL); rc_plugin_run (rc_hook_abort, NULL);
/* Only drop into single user mode if we're booting */ /* Only drop into single user mode if we're booting */
run = getenv ("RUNLEVEL"); if ((PREVLEVEL &&
prev = getenv ("PREVLEVEL"); (strcmp (PREVLEVEL, "S") == 0 ||
if ((prev && strcmp (PREVLEVEL, "1") == 0)) ||
(strcmp (prev, "S") == 0 || (RUNLEVEL &&
strcmp (prev, "1") == 0)) || (strcmp (RUNLEVEL, "S") == 0 ||
(run && strcmp (RUNLEVEL, "1") == 0)))
(strcmp (run, "S") == 0 ||
strcmp (run, "1") == 0)))
single_user (); single_user ();
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
@ -637,8 +643,6 @@ static struct option longopts[] = {
int main (int argc, char **argv) int main (int argc, char **argv)
{ {
char *RUNLEVEL = NULL;
char *PREVLEVEL = NULL;
char *runlevel = NULL; char *runlevel = NULL;
char *newlevel = NULL; char *newlevel = NULL;
char *service = NULL; char *service = NULL;
@ -701,6 +705,12 @@ int main (int argc, char **argv)
/* Change dir to / to ensure all scripts don't use stuff in pwd */ /* Change dir to / to ensure all scripts don't use stuff in pwd */
chdir ("/"); 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 */
RUNLEVEL = getenv ("RUNLEVEL");
PREVLEVEL = getenv ("PREVLEVEL");
/* Setup a signal handler */ /* Setup a signal handler */
signal (SIGINT, handle_signal); signal (SIGINT, handle_signal);
signal (SIGQUIT, handle_signal); signal (SIGQUIT, handle_signal);
@ -769,13 +779,6 @@ int main (int argc, char **argv)
interactive = rc_exists (INTERACTIVE); interactive = rc_exists (INTERACTIVE);
rc_plugin_load (); rc_plugin_load ();
/* 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 */
RUNLEVEL = getenv ("RUNLEVEL");
PREVLEVEL = getenv ("PREVLEVEL");
/* Load current softlevel */ /* Load current softlevel */
runlevel = rc_get_runlevel (); runlevel = rc_get_runlevel ();