dab/scripts/init.pl
2012-04-10 10:51:40 +02:00

81 lines
1.4 KiB
Perl

#!/usr/bin/perl -w
use strict;
use POSIX qw (:sys_wait_h strftime);
use POSIX qw(EINTR);
use IO::Socket::UNIX;
$SIG{CHLD} = sub {
1 while waitpid(-1, WNOHANG) > 0;
};
$SIG{INT} = sub {
print "stopping init\n";
exit (0);
};
mkdir "/dev";
mkdir "/var/";
mkdir "/var/log";
my $logfile = "/var/log/init.log";
close (STDOUT);
open (STDOUT, ">>$logfile");
close (STDERR);
open STDERR, ">&STDOUT";
select STDERR; $| = 1; # make unbuffered
select STDOUT; $| = 1; # make unbuffered
my $args = join (" ", @ARGV);
if ($$ != 1) {
my $l = shift @ARGV;
if (defined ($l) && $l eq '0') {
print "initctl $args\n";
kill 2, 1;
} else {
print "initctl $args (ignored)\n";
}
exit (0);
}
print "starting init $args\n";
# only start once when pid == 1
# ignore runlevel change requests
exit (0) if $$ != 1;
if (! -d "/proc/$$") {
system ("mount -t proc proc /proc") == 0 ||
die "unable to mount proc filesystem\n";
}
system ("hostname localhost") == 0 ||
die "unable to set hostname\n";
# provide simple syslog
my $sock = IO::Socket::UNIX->new (Local => "/dev/log", Listen => 5);
while ((my $fd = $sock->accept()) ||($! == EINTR)) {
next if !$fd; # EINTR
while (defined (my $line = <$fd>)) {
$line =~ s/\0/\n/g;
chomp $line;
$line =~ s/^<\d+>//mg;
next if $line =~ m/^\s*$/;
print "$line\n";
}
close ($fd);
}
print "exit init\n";
exit (0);