- no obj-code changes. Fix indentation, use existing defines.
This commit is contained in:
parent
1101d1c980
commit
ad2fa65fc0
139
init/init.c
139
init/init.c
@ -43,16 +43,6 @@
|
|||||||
#define SHUTDOWN 0x40
|
#define SHUTDOWN 0x40
|
||||||
#define RESTART 0x80
|
#define RESTART 0x80
|
||||||
|
|
||||||
/*
|
|
||||||
#define STR_SYSINIT "\x01"
|
|
||||||
#define STR_RESPAWN "\x02"
|
|
||||||
#define STR_ASKFIRST "\x04"
|
|
||||||
#define STR_WAIT "\x08"
|
|
||||||
#define STR_ONCE "\x10"
|
|
||||||
#define STR_CTRLALTDEL "\x20"
|
|
||||||
#define STR_SHUTDOWN "\x40"
|
|
||||||
#define STR_RESTART "\x80"
|
|
||||||
*/
|
|
||||||
/* Set up a linked list of init_actions, to be read from inittab */
|
/* Set up a linked list of init_actions, to be read from inittab */
|
||||||
struct init_action {
|
struct init_action {
|
||||||
struct init_action *next;
|
struct init_action *next;
|
||||||
@ -142,7 +132,7 @@ static void message(int where, const char *fmt, ...)
|
|||||||
if (ENABLE_FEATURE_INIT_SYSLOG) {
|
if (ENABLE_FEATURE_INIT_SYSLOG) {
|
||||||
/* Log the message to syslogd */
|
/* Log the message to syslogd */
|
||||||
if (where & L_LOG) {
|
if (where & L_LOG) {
|
||||||
/* don't out "\r" */
|
/* don't print out "\r" */
|
||||||
openlog(applet_name, 0, LOG_DAEMON);
|
openlog(applet_name, 0, LOG_DAEMON);
|
||||||
syslog(LOG_INFO, "init: %s", msg + 1);
|
syslog(LOG_INFO, "init: %s", msg + 1);
|
||||||
closelog();
|
closelog();
|
||||||
@ -156,7 +146,7 @@ static void message(int where, const char *fmt, ...)
|
|||||||
* It's mine, all mine! Muhahahaha! */
|
* It's mine, all mine! Muhahahaha! */
|
||||||
if (log_fd < 0) {
|
if (log_fd < 0) {
|
||||||
if (!log_console) {
|
if (!log_console) {
|
||||||
log_fd = 2;
|
log_fd = STDERR_FILENO;
|
||||||
} else {
|
} else {
|
||||||
log_fd = device_open(log_console, O_WRONLY | O_NONBLOCK | O_NOCTTY);
|
log_fd = device_open(log_console, O_WRONLY | O_NONBLOCK | O_NOCTTY);
|
||||||
if (log_fd < 0) {
|
if (log_fd < 0) {
|
||||||
@ -169,7 +159,7 @@ static void message(int where, const char *fmt, ...)
|
|||||||
}
|
}
|
||||||
if (where & L_LOG) {
|
if (where & L_LOG) {
|
||||||
full_write(log_fd, msg, l);
|
full_write(log_fd, msg, l);
|
||||||
if (log_fd == 2)
|
if (log_fd == STDERR_FILENO)
|
||||||
return; /* don't print dup messages */
|
return; /* don't print dup messages */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -210,13 +200,14 @@ static void console_init(void)
|
|||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
s = getenv("CONSOLE");
|
s = getenv("CONSOLE");
|
||||||
if (!s) s = getenv("console");
|
if (!s)
|
||||||
|
s = getenv("console");
|
||||||
if (s) {
|
if (s) {
|
||||||
int fd = open(s, O_RDWR | O_NONBLOCK | O_NOCTTY);
|
int fd = open(s, O_RDWR | O_NONBLOCK | O_NOCTTY);
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
dup2(fd, 0);
|
dup2(fd, STDIN_FILENO);
|
||||||
dup2(fd, 1);
|
dup2(fd, STDOUT_FILENO);
|
||||||
xmove_fd(fd, 2);
|
xmove_fd(fd, STDERR_FILENO);
|
||||||
}
|
}
|
||||||
messageD(L_LOG, "console='%s'", s);
|
messageD(L_LOG, "console='%s'", s);
|
||||||
} else {
|
} else {
|
||||||
@ -255,7 +246,7 @@ static void set_sane_term(void)
|
|||||||
tty.c_cc[VSTOP] = 19; /* C-s */
|
tty.c_cc[VSTOP] = 19; /* C-s */
|
||||||
tty.c_cc[VSUSP] = 26; /* C-z */
|
tty.c_cc[VSUSP] = 26; /* C-z */
|
||||||
|
|
||||||
/* use line dicipline 0 */
|
/* use line discipline 0 */
|
||||||
tty.c_line = 0;
|
tty.c_line = 0;
|
||||||
|
|
||||||
/* Make it be sane */
|
/* Make it be sane */
|
||||||
@ -282,7 +273,7 @@ static void open_stdio_to_tty(const char* tty_name, int exit_on_failure)
|
|||||||
/* empty tty_name means "use init's tty", else... */
|
/* empty tty_name means "use init's tty", else... */
|
||||||
if (tty_name[0]) {
|
if (tty_name[0]) {
|
||||||
int fd;
|
int fd;
|
||||||
close(0);
|
close(STDIN_FILENO);
|
||||||
/* fd can be only < 0 or 0: */
|
/* fd can be only < 0 or 0: */
|
||||||
fd = device_open(tty_name, O_RDWR);
|
fd = device_open(tty_name, O_RDWR);
|
||||||
if (fd) {
|
if (fd) {
|
||||||
@ -292,12 +283,12 @@ static void open_stdio_to_tty(const char* tty_name, int exit_on_failure)
|
|||||||
_exit(EXIT_FAILURE);
|
_exit(EXIT_FAILURE);
|
||||||
if (ENABLE_DEBUG_INIT)
|
if (ENABLE_DEBUG_INIT)
|
||||||
_exit(2);
|
_exit(2);
|
||||||
/* NB: we don't reach this if we were called after vfork.
|
/* NB: we don't reach this if we were called after vfork.
|
||||||
* Thus halt_reboot_pwoff() itself need not be vfork-safe. */
|
* Thus halt_reboot_pwoff() itself need not be vfork-safe. */
|
||||||
halt_reboot_pwoff(SIGUSR1); /* halt the system */
|
halt_reboot_pwoff(SIGUSR1); /* halt the system */
|
||||||
}
|
}
|
||||||
dup2(0, 1);
|
dup2(STDIN_FILENO, STDOUT_FILENO);
|
||||||
dup2(0, 2);
|
dup2(STDIN_FILENO, STDERR_FILENO);
|
||||||
}
|
}
|
||||||
set_sane_term();
|
set_sane_term();
|
||||||
}
|
}
|
||||||
@ -346,8 +337,7 @@ static void init_exec(const char *command)
|
|||||||
ioctl(STDIN_FILENO, TIOCSCTTY, 0 /*only try, don't steal*/);
|
ioctl(STDIN_FILENO, TIOCSCTTY, 0 /*only try, don't steal*/);
|
||||||
}
|
}
|
||||||
BB_EXECVP(cmd[0] + dash, cmd);
|
BB_EXECVP(cmd[0] + dash, cmd);
|
||||||
message(L_LOG | L_CONSOLE, "Cannot run '%s': %s",
|
message(L_LOG | L_CONSOLE, "Cannot run '%s': %s", cmd[0], strerror(errno));
|
||||||
cmd[0], strerror(errno));
|
|
||||||
/* returns if execvp fails */
|
/* returns if execvp fails */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -434,7 +424,6 @@ static pid_t run(const struct init_action *a)
|
|||||||
waitfor(pid);
|
waitfor(pid);
|
||||||
_exit(EXIT_SUCCESS);
|
_exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Child - fall though to actually execute things */
|
/* Child - fall though to actually execute things */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -640,8 +629,7 @@ static void new_init_action(uint8_t action_type, const char *command, const char
|
|||||||
/* don't enter action if it's already in the list,
|
/* don't enter action if it's already in the list,
|
||||||
* but do overwrite existing actions */
|
* but do overwrite existing actions */
|
||||||
if ((strcmp(a->command, command) == 0)
|
if ((strcmp(a->command, command) == 0)
|
||||||
&& (strcmp(a->terminal, cons) == 0)
|
&& (strcmp(a->terminal, cons) == 0)) {
|
||||||
) {
|
|
||||||
a->action_type = action_type;
|
a->action_type = action_type;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -687,95 +675,6 @@ static void delete_init_action(struct init_action *action)
|
|||||||
*/
|
*/
|
||||||
static void parse_inittab(void)
|
static void parse_inittab(void)
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
FILE *file;
|
|
||||||
char buf[COMMAND_SIZE];
|
|
||||||
|
|
||||||
if (ENABLE_FEATURE_USE_INITTAB)
|
|
||||||
file = fopen(INITTAB, "r");
|
|
||||||
else
|
|
||||||
file = NULL;
|
|
||||||
|
|
||||||
/* No inittab file -- set up some default behavior */
|
|
||||||
if (file == NULL) {
|
|
||||||
/* Reboot on Ctrl-Alt-Del */
|
|
||||||
new_init_action(CTRLALTDEL, "reboot", "");
|
|
||||||
/* Umount all filesystems on halt/reboot */
|
|
||||||
new_init_action(SHUTDOWN, "umount -a -r", "");
|
|
||||||
/* Swapoff on halt/reboot */
|
|
||||||
if (ENABLE_SWAPONOFF)
|
|
||||||
new_init_action(SHUTDOWN, "swapoff -a", "");
|
|
||||||
/* Prepare to restart init when a QUIT is received */
|
|
||||||
new_init_action(RESTART, "init", "");
|
|
||||||
/* Askfirst shell on tty1-4 */
|
|
||||||
new_init_action(ASKFIRST, bb_default_login_shell, "");
|
|
||||||
new_init_action(ASKFIRST, bb_default_login_shell, VC_2);
|
|
||||||
new_init_action(ASKFIRST, bb_default_login_shell, VC_3);
|
|
||||||
new_init_action(ASKFIRST, bb_default_login_shell, VC_4);
|
|
||||||
/* sysinit */
|
|
||||||
new_init_action(SYSINIT, INIT_SCRIPT, "");
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (fgets(buf, COMMAND_SIZE, file) != NULL) {
|
|
||||||
static const char actions[] =
|
|
||||||
STR_SYSINIT "sysinit\0"
|
|
||||||
STR_RESPAWN "respawn\0"
|
|
||||||
STR_ASKFIRST "askfirst\0"
|
|
||||||
STR_WAIT "wait\0"
|
|
||||||
STR_ONCE "once\0"
|
|
||||||
STR_CTRLALTDEL "ctrlaltdel\0"
|
|
||||||
STR_SHUTDOWN "shutdown\0"
|
|
||||||
STR_RESTART "restart\0"
|
|
||||||
;
|
|
||||||
char tmpConsole[CONSOLE_NAME_SIZE];
|
|
||||||
char *id, *runlev, *action, *command;
|
|
||||||
const char *a;
|
|
||||||
|
|
||||||
/* Skip leading spaces */
|
|
||||||
id = skip_whitespace(buf);
|
|
||||||
/* Trim the trailing '\n' */
|
|
||||||
*strchrnul(id, '\n') = '\0';
|
|
||||||
/* Skip the line if it is a comment */
|
|
||||||
if (*id == '#' || *id == '\0')
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* Line is: "id:runlevel_ignored:action:command" */
|
|
||||||
runlev = strchr(id, ':');
|
|
||||||
if (runlev == NULL /*|| runlev[1] == '\0' - not needed */)
|
|
||||||
goto bad_entry;
|
|
||||||
action = strchr(runlev + 1, ':');
|
|
||||||
if (action == NULL /*|| action[1] == '\0' - not needed */)
|
|
||||||
goto bad_entry;
|
|
||||||
command = strchr(action + 1, ':');
|
|
||||||
if (command == NULL || command[1] == '\0')
|
|
||||||
goto bad_entry;
|
|
||||||
|
|
||||||
*command = '\0'; /* action => ":action\0" now */
|
|
||||||
for (a = actions; a[0]; a += strlen(a) + 1) {
|
|
||||||
if (strcmp(a + 1, action + 1) == 0) {
|
|
||||||
*runlev = '\0';
|
|
||||||
if (*id != '\0') {
|
|
||||||
if (strncmp(id, "/dev/", 5) == 0)
|
|
||||||
id += 5;
|
|
||||||
strcpy(tmpConsole, "/dev/");
|
|
||||||
safe_strncpy(tmpConsole + 5, id,
|
|
||||||
sizeof(tmpConsole) - 5);
|
|
||||||
id = tmpConsole;
|
|
||||||
}
|
|
||||||
new_init_action((uint8_t)a[0], command + 1, id);
|
|
||||||
goto next_line;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*command = ':';
|
|
||||||
/* Choke on an unknown action */
|
|
||||||
bad_entry:
|
|
||||||
message(L_LOG | L_CONSOLE, "Bad inittab entry: %s", id);
|
|
||||||
next_line: ;
|
|
||||||
}
|
|
||||||
fclose(file);
|
|
||||||
#else
|
|
||||||
char *token[4];
|
char *token[4];
|
||||||
/* order must correspond to SYSINIT..RESTART constants */
|
/* order must correspond to SYSINIT..RESTART constants */
|
||||||
static const char actions[] ALIGN1 =
|
static const char actions[] ALIGN1 =
|
||||||
@ -808,7 +707,7 @@ static void parse_inittab(void)
|
|||||||
/* optional_tty:ignored_runlevel:action:command
|
/* optional_tty:ignored_runlevel:action:command
|
||||||
* Delims are not to be collapsed and need exactly 4 tokens
|
* Delims are not to be collapsed and need exactly 4 tokens
|
||||||
*/
|
*/
|
||||||
while (config_read(parser, token, 4, 0, "#:", PARSE_DONT_TRIM|PARSE_DONT_REDUCE|PARSE_LAST_IS_GREEDY)) {
|
while (config_read(parser, token, 4, 0, "#:", PARSE_DONT_TRIM|PARSE_DONT_REDUCE|PARSE_LAST_IS_GREEDY)) {
|
||||||
int action;
|
int action;
|
||||||
char *tty = token[0];
|
char *tty = token[0];
|
||||||
|
|
||||||
@ -828,10 +727,10 @@ static void parse_inittab(void)
|
|||||||
free(tty);
|
free(tty);
|
||||||
continue;
|
continue;
|
||||||
bad_entry:
|
bad_entry:
|
||||||
message(L_LOG | L_CONSOLE, "Bad inittab entry at line %d", parser->lineno);
|
message(L_LOG | L_CONSOLE, "Bad inittab entry at line %d",
|
||||||
|
parser->lineno);
|
||||||
}
|
}
|
||||||
config_close(parser);
|
config_close(parser);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ENABLE_FEATURE_USE_INITTAB
|
#if ENABLE_FEATURE_USE_INITTAB
|
||||||
|
Loading…
Reference in New Issue
Block a user