aboutsummaryrefslogtreecommitdiff
path: root/toys/pending/init.c
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2014-04-16 08:54:19 -0500
committerRob Landley <rob@landley.net>2014-04-16 08:54:19 -0500
commit6c64f5f186d26d4c95d408979d33831935e026f1 (patch)
treeb08b59e7f980f3ab74d856923175dae0d4cd87c2 /toys/pending/init.c
parent76e1cb3ada7fb12f38e248a08c2deedc5c9ce888 (diff)
downloadtoybox-6c64f5f186d26d4c95d408979d33831935e026f1.tar.gz
Revert lots of half-finished local debris I didn't mean to check in with Isaac's roadmap update.
Mercurial's "import" command is still broken, committing local tree changes to files that weren't even touched by the patch because the hg developers inisist, when I point out how stupid it is, that they meant to do that. (hg record can do hunks, but import can't even track _files_.)
Diffstat (limited to 'toys/pending/init.c')
-rw-r--r--toys/pending/init.c44
1 files changed, 20 insertions, 24 deletions
diff --git a/toys/pending/init.c b/toys/pending/init.c
index ca3c6cc4..8199e748 100644
--- a/toys/pending/init.c
+++ b/toys/pending/init.c
@@ -13,10 +13,7 @@ config INIT
help
usage: init
- System V style init.
-
- First program to run (as PID 1) when the system comes up, reading
- /etc/inittab to determine actions.
+ init the system.
*/
#include "toys.h"
@@ -44,9 +41,8 @@ int caught_signal;
static void initialize_console(void)
{
int fd;
- char *p = getenv("CONSOLE");
+ char *p = (p = getenv("CONSOLE")) ? p : getenv("console");
- if (!p) p = getenv("console");
if (!p) {
fd = open("/dev/null", O_RDWR);
if (fd >= 0) {
@@ -66,11 +62,11 @@ static void initialize_console(void)
if (!getenv("TERM")) putenv("TERM=linux");
}
-static void reset_term(int fd)
+static void set_sane_term(void)
{
struct termios terminal;
- tcgetattr(fd, &terminal);
+ tcgetattr(0, &terminal);
terminal.c_cc[VINTR] = 3; //ctrl-c
terminal.c_cc[VQUIT] = 28; /*ctrl-\*/
terminal.c_cc[VERASE] = 127; //ctrl-?
@@ -81,16 +77,12 @@ static void reset_term(int fd)
terminal.c_cc[VSUSP] = 26; //ctrl-z
terminal.c_line = 0;
- terminal.c_cflag &= CRTSCTS|PARODD|PARENB|CSTOPB|CSIZE|CBAUDEX|CBAUD;
- terminal.c_cflag |= CLOCAL|HUPCL|CREAD;
-
- //enable start/stop input and output control + map CR to NL on input
- terminal.c_iflag = IXON|IXOFF|ICRNL;
-
- //Map NL to CR-NL on output
- terminal.c_oflag = ONLCR|OPOST;
+ terminal.c_cflag = terminal.c_cflag&(CRTSCTS|PARODD|PARENB|CSTOPB|CSIZE|CBAUDEX|CBAUD);
+ terminal.c_cflag = terminal.c_cflag|(CLOCAL|HUPCL|CREAD);
+ terminal.c_iflag = IXON|IXOFF|ICRNL;//enable start/stop input and output control + map CR to NL on input
+ terminal.c_oflag = ONLCR|OPOST;//Map NL to CR-NL on output
terminal.c_lflag = IEXTEN|ECHOKE|ECHOCTL|ECHOK|ECHOE|ECHO|ICANON|ISIG;
- tcsetattr(fd, TCSANOW, &terminal);
+ tcsetattr(0, TCSANOW, &terminal);
}
static void add_new_action(uint8_t action,char *command,char *term)
@@ -258,7 +250,7 @@ static pid_t final_run(struct action_list_seed *x)
dup2(0, 2);
}
}
- reset_term(0);
+ set_sane_term();
run_command(x->command);
_exit(-1);
}
@@ -289,7 +281,6 @@ static void waitforpid(pid_t pid)
if (kill(y, 0)) break;
}
}
-
static void run_action_from_list(int action)
{
pid_t pid;
@@ -311,7 +302,14 @@ static void set_default(void)
{
sigset_t signal_set_c;
- sigatexit(SIG_DFL);
+ signal(SIGUSR1,SIG_DFL);
+ signal(SIGUSR2,SIG_DFL);
+ signal(SIGTERM,SIG_DFL);
+ signal(SIGQUIT,SIG_DFL);
+ signal(SIGINT,SIG_DFL);
+ signal(SIGHUP,SIG_DFL);
+ signal(SIGTSTP,SIG_DFL);
+ signal(SIGSTOP,SIG_DFL);
sigfillset(&signal_set_c);
sigprocmask(SIG_UNBLOCK,&signal_set_c, NULL);
@@ -359,7 +357,6 @@ static void halt_poweroff_reboot_handler(int sig_no)
while(1) sleep(1);
}
-
static void restart_init_handler(int sig_no)
{
struct action_list_seed *x;
@@ -389,7 +386,7 @@ static void restart_init_handler(int sig_no)
} else {
dup2(0, 1);
dup2(0, 2);
- reset_term(0);
+ set_sane_term();
run_command(x->command);
}
}
@@ -443,7 +440,7 @@ void init_main(void)
if (getpid() != 1) error_exit("Already running");
printf("Started init\n");
initialize_console();
- reset_term(0);
+ set_sane_term();
if (chdir("/")) perror_exit("Can't cd to /");
setsid();
@@ -452,7 +449,6 @@ void init_main(void)
putenv("PATH=/sbin:/usr/sbin:/bin:/usr/bin");
putenv("SHELL=/bin/sh");
putenv("USER=root");
-
inittab_parsing();
signal(SIGUSR1, halt_poweroff_reboot_handler);//halt
signal(SIGUSR2, halt_poweroff_reboot_handler);//poweroff