Don't do interactive when changing init, #174141.
This commit is contained in:
parent
356c41f77c
commit
74d52e749d
@ -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.
|
||||||
|
55
src/rc.c
55
src/rc.c
@ -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 ();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user