#endif
-#if defined(__UCLIBC__) && !defined(__ARCH_HAS_MMU__)
-#define fork vfork
-#endif
-
#define INIT_BUFFS_SIZE 256
/* From <linux/vt.h> */
signal(SIGINT, SIG_DFL);
signal(SIGTERM, SIG_DFL);
signal(SIGHUP, SIG_DFL);
+ signal(SIGQUIT, SIG_DFL);
signal(SIGCONT, SIG_DFL);
signal(SIGSTOP, SIG_DFL);
signal(SIGTSTP, SIG_DFL);
}
}
+#if !defined(__UCLIBC__) || defined(__ARCH_HAS_MMU__)
if (a->action & ASKFIRST) {
char c;
/*
while(read(0, &c, 1) == 1 && c != '\n')
;
}
+#endif
/* Log the process name and args */
message(LOG, "Starting pid %d, console %s: '%s'",
/* first disable all our signals */
sigemptyset(&block_signals);
sigaddset(&block_signals, SIGHUP);
+ sigaddset(&block_signals, SIGQUIT);
sigaddset(&block_signals, SIGCHLD);
sigaddset(&block_signals, SIGUSR1);
sigaddset(&block_signals, SIGUSR2);
/* unblock all signals, blocked in shutdown_system() */
sigemptyset(&unblock_signals);
sigaddset(&unblock_signals, SIGHUP);
+ sigaddset(&unblock_signals, SIGQUIT);
sigaddset(&unblock_signals, SIGCHLD);
sigaddset(&unblock_signals, SIGUSR1);
sigaddset(&unblock_signals, SIGUSR2);
static void new_init_action(int action, const char *command, const char *cons)
{
- struct init_action *new_action, *a;
+ struct init_action *new_action, *a, *last;
if (*cons == '\0')
cons = console;
}
/* Append to the end of the list */
- for (a = init_action_list; a && a->next; a = a->next) {
- /* don't enter action if it's already in the list */
+ for (a = last = init_action_list; a; a = a->next) {
+ /* don't enter action if it's already in the list,
+ * but do overwrite existing actions */
if ((strcmp(a->command, command) == 0) &&
(strcmp(a->terminal, cons) ==0)) {
+ a->action = action;
free(new_action);
return;
}
+ last = a;
}
- if (a) {
- a->next = new_action;
+ if (last) {
+ last->next = new_action;
} else {
init_action_list = new_action;
}
#endif /* CONFIG_FEATURE_USE_INITTAB */
}
+#ifdef CONFIG_FEATURE_USE_INITTAB
static void reload_signal(int sig)
{
- message(LOG, "Reloading /etc/inittab");
- parse_inittab();
+ struct init_action *a, *tmp;
+
+ message(LOG, "Reloading /etc/inittab");
+
+ /* disable old entrys */
+ for (a = init_action_list; a; a = a->next ) {
+ a->action = ONCE;
+ }
+
+ parse_inittab();
+
+ /* remove unused entrys */
+ for (a = init_action_list; a; a = tmp) {
+ tmp = a->next;
+ if (a->action & (ONCE | SYSINIT | WAIT ) &&
+ a->pid == 0 ) {
+ delete_init_action(a);
+ }
+ }
run_actions(RESPAWN);
- return;
+ return;
}
-
+#endif /* CONFIG_FEATURE_USE_INITTAB */
+
extern int init_main(int argc, char **argv)
{
struct init_action *a;
/* Set up sig handlers -- be sure to
* clear all of these in run() */
signal(SIGHUP, exec_signal);
+ signal(SIGQUIT, exec_signal);
signal(SIGUSR1, halt_signal);
signal(SIGUSR2, halt_signal);
signal(SIGINT, ctrlaltdel_signal);
/* Next run anything to be run only once */
run_actions(ONCE);
+#ifdef CONFIG_FEATURE_USE_INITTAB
/* Redefine SIGHUP to reread /etc/inittab */
signal(SIGHUP, reload_signal);
+#else
+ signal(SIGHUP, SIG_IGN);
+#endif /* CONFIG_FEATURE_USE_INITTAB */
+
/* Now run the looping stuff for the rest of forever */
while (1) {