mirror of
https://github.com/troglobit/finit.git
synced 2026-11-03 13:28:27 +00:00
Debian now boots to X!
finit.conf:
Use this as /etc/finit.conf on a Debian 6.0 based system with X
installed and sysklogd instead of rsyslogd. Works.
services:
Alternative method for extending the finit boot procedure. Simply
place this script file in an /etc/finit.d/ directory. The script
uses the standard run-parts tool to chain load other start scripts.
helpers.c:
o New functions:
- run(): home grown system() replacement
- run_interactive(): display progress and status when called
o Bugfix start_process(), make sure to use same signal setup for
children as in run() and run_interactive(). Also, use execvp()
instead of execv() to allow searching $PATH for executables.
finit.h:
o Move signal specific code to new signal.h.
o Bypass verbosity setting to let echo() always print to screen.
finit.c:
o Make run_parts() the default, remove external deps, it works.
o Use run() and run_interactive() to speed up execution further
on embedded systems where forking is expensive.
o Kernel cmdline "quiet" should not close STDIO since this makes
it impossible to run some daemons and start scripts. Instead,
we let "quiet" toggle the finit verbosity setting.
o Remove kernel cmdline "--verbose" (Upstart compat), to be used
to enable verbose finit when kernel should be quiet.
o Setup kernel specific settings in /etc/sysctl.conf
o Fix D-Bus startup problems. Probably what caused X from not
working initially. Silly rabbit.
o Use system() workaround to start X, cannot get it to start
at all using run() or run_interactive() at the moment.
signal.h:
New file, header file for signal.c. Was about time.
signal.c:
Remove blocking of SIGCHLD from sig_setup(), instead we setup
SIGCHLD early in sig_init() to handle fork() in run() & C:o.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
This commit is contained in:
1 parent
d21dc2b477
commit
077a7e82e0
13 files changed
+296
-131
No files matched your search
@@ -43,48 +43,32 @@
|
||||
|
||||
#include "finit.h"
|
||||
#include "helpers.h"
|
||||
|
||||
#define SETSIG(sa, sig, fun, flags) \
|
||||
do { \
|
||||
sa.sa_sigaction = fun; \
|
||||
sa.sa_flags = SA_SIGINFO | flags; \
|
||||
sigemptyset(&sa.sa_mask); \
|
||||
sigaction(sig, &sa, NULL); \
|
||||
} while (0)
|
||||
|
||||
#define IGNSIG(sa, sig, flags) \
|
||||
do { \
|
||||
sa.sa_handler = SIG_IGN; \
|
||||
sa.sa_flags = flags; \
|
||||
sigemptyset(&sa.sa_mask); \
|
||||
sigaction(sig, &sa, NULL); \
|
||||
} while (0)
|
||||
#include "signal.h"
|
||||
|
||||
static int stopped = 0;
|
||||
|
||||
|
||||
void do_shutdown (int sig)
|
||||
{
|
||||
touch(SYNC_SHUTDOWN);
|
||||
|
||||
if (sdown) {
|
||||
_d("Calling shutdown hook: %s", sdown);
|
||||
system(sdown);
|
||||
}
|
||||
if (sdown)
|
||||
run_interactive(sdown, "Calling shutdown hook: %s", sdown);
|
||||
|
||||
_d("Sending SIGTERM to all processes.");
|
||||
kill(-1, SIGTERM);
|
||||
sleep(2);
|
||||
system("/usr/sbin/alsactl store > /dev/null 2>&1");
|
||||
run_interactive("/usr/sbin/alsactl store > /dev/null 2>&1", "Saving sound settings");
|
||||
_d("Saving the system clock.");
|
||||
system("/sbin/hwclock --systohc");
|
||||
run_interactive("/sbin/hwclock --utc --systohc", "Saving system time (UTC) to RTC");
|
||||
_d("Sending SIGKILL to remaining processes.");
|
||||
kill(-1, SIGKILL);
|
||||
|
||||
sync();
|
||||
sync();
|
||||
_d("Unmounting file systems, remounting / read-only.");
|
||||
system("/bin/umount -fa 2>/dev/null");
|
||||
system("/bin/mount -n -o remount,ro / 2>/dev/null");
|
||||
run("/bin/umount -fa 2>/dev/null");
|
||||
run("/bin/mount -n -o remount,ro / 2>/dev/null");
|
||||
|
||||
_d("%s.", sig == SIGINT || sig == SIGUSR1 ? "Rebooting" : "Halting");
|
||||
if (sig == SIGINT || sig == SIGUSR1)
|
||||
@@ -146,7 +130,7 @@ int sig_stopped(void)
|
||||
}
|
||||
|
||||
/*
|
||||
* Inital signal setup - ignore everything until we're capable of responding
|
||||
* Inital signal setup - ignore everything but SIGCHLD until we're capable of responding
|
||||
*/
|
||||
void sig_init(void)
|
||||
{
|
||||
@@ -155,6 +139,8 @@ void sig_init(void)
|
||||
|
||||
for (i = 1; i < NSIG; i++)
|
||||
IGNSIG(sa, i, SA_RESTART);
|
||||
|
||||
SETSIG(sa, SIGCHLD, chld_handler, SA_RESTART);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -162,7 +148,6 @@ void sig_init(void)
|
||||
*/
|
||||
void sig_setup(void)
|
||||
{
|
||||
sigset_t nmask;
|
||||
struct sigaction sa;
|
||||
|
||||
_d("Setup signals");
|
||||
@@ -192,12 +177,6 @@ void sig_setup(void)
|
||||
SETSIG(sa, SIGSTOP, sigstop_handler, 0);
|
||||
SETSIG(sa, SIGTSTP, sigstop_handler, 0);
|
||||
SETSIG(sa, SIGCONT, sigcont_handler, 0);
|
||||
SETSIG(sa, SIGCHLD, chld_handler, SA_RESTART);
|
||||
|
||||
/* Block SIGCHLD while forking */
|
||||
sigemptyset(&nmask);
|
||||
sigaddset(&nmask, SIGCHLD);
|
||||
sigprocmask(SIG_BLOCK, &nmask, NULL);
|
||||
|
||||
/* Disable CTRL-ALT-DELETE from kernel, we handle shutdown gracefully with SIGINT, above */
|
||||
reboot(RB_DISABLE_CAD);
|
||||
|
||||
Reference in new issue
Block a user