mirror of
				https://git.proxmox.com/git/dab
				synced 2025-11-04 03:30:05 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			89 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			1.6 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";
 | 
						|
 | 
						|
 | 
						|
# start one child doing nothing - to avoid that we get killed
 | 
						|
if (fork() == 0) {
 | 
						|
    $0 = 'dummy child';
 | 
						|
    for (;;) { sleep 5; }
 | 
						|
    exit 0;
 | 
						|
}
 | 
						|
 | 
						|
# provide simple syslog
 | 
						|
 | 
						|
my $sock =  IO::Socket::UNIX->new (Local => "/dev/log", Listen => 5) ||
 | 
						|
    die "can't open socket /dev/log -  $!\n";
 | 
						|
 | 
						|
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);
 |