diff options
author | Marcus Brinkmann <marcus@gnu.org> | 2001-10-01 08:28:17 +0000 |
---|---|---|
committer | Marcus Brinkmann <marcus@gnu.org> | 2001-10-01 08:28:17 +0000 |
commit | b64ffb6ccda693a6ed39b48e8862a4dae862477c (patch) | |
tree | f6426ad7f489b8e82edf5cd52f0cbf2b9612a787 /debian/update-rc.d | |
parent | 22dc8fd28ca44399c8aade54e7ddd265c2f58d7b (diff) |
2001-10-01 Marcus Brinkmann <marcus@gnu.org>
* changelog: Update to current version.
* update-rc.d: New file moved from dpkg to here.
* rules: Install update-rc.d.
Diffstat (limited to 'debian/update-rc.d')
-rwxr-xr-x | debian/update-rc.d | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/debian/update-rc.d b/debian/update-rc.d new file mode 100755 index 00000000..83d12ffd --- /dev/null +++ b/debian/update-rc.d @@ -0,0 +1,207 @@ +#! /usr/bin/perl +# +# update-rc.d Update the links in /etc/rc[0-9S].d/ +# +# Version: @(#)update-rc.d.pl 2.02 05-Mar-1998 miquels@cistron.nl +# + +$initd = "/etc/init.d"; +$etcd = "/etc/rc"; +$notreally = 0; + +# Print usage message and die. + +sub usage { + print STDERR "update-rc.d: error: @_\n" if ($#_ >= 0); + print STDERR <<EOF; +usage: update-rc.d [-n] [-f] <basename> remove + update-rc.d [-n] <basename> defaults [NN | sNN kNN] + update-rc.d [-n] <basename> start|stop NN runlvl [runlvl] [...] . + -n: not really + -f: force +EOF + exit (1); +} + +# Check out options. + +while($#ARGV >= 0 && ($_ = $ARGV[0]) =~ /^-/) { + shift @ARGV; + if (/^-n$/) { $notreally++; next } + if (/^-f$/) { $force++; next } + if (/^-h|--help$/) { &usage; } + &usage("unknown option"); +} + +# Action. + +&usage() if ($#ARGV < 1); +$bn = shift @ARGV; +if ($ARGV[0] ne 'remove') { + if (! -f "$initd/$bn") { + print STDERR "update-rc.d: $initd/$bn: file does not exist\n"; + exit (1); + } +} elsif (-f "$initd/$bn") { + if (!$force) { + printf STDERR "update-rc.d: $initd/$bn exists during rc.d purge (use -f to force)\n"; + exit (1); + } else { + printf STDERR "update-rc.d: $initd/$bn exists during rc.d purge (continuing)\n"; + } +} + +$_ = $ARGV[0]; +if (/^remove$/) { &checklinks ("remove"); } +elsif (/^defaults$/) { &defaults; &makelinks } +elsif (/^(start|stop)$/) { &startstop; &makelinks; } +else { &usage; } + +exit (0); + +# Check if there are links in /etc/rc[0-9S].d/ +# Remove if the first argument is "remove" and the links +# point to $bn. + +sub is_link () { + my ($op, $fn, $bn) = @_; + if (! -l $fn) { + print STDERR "update-rc.d: warning: $fn is not a symbolic link\n"; + return 0; + } else { + $linkdst = readlink ($fn); + if (! defined $linkdst) { + die ("update-rc.d: error reading symbolic link: $!\n"); + } + if (($linkdst ne "../init.d/$bn") && ($linkdst ne "../init.d/$bn")) { + print STDERR "update-rc.d: warning: $fn is not a link to ../init.d/$bn\n"; + return 0; + } + } + return 1; +} + +sub checklinks { + my ($i, $found, $fn, $islnk); + + print " Removing any system startup links for $initd/$bn ...\n" + if ($_[0] eq 'remove'); + + $found = 0; + + foreach $i (0..9, 'S') { + unless (chdir ("$etcd$i.d")) { + next if ($i =~ m/^[789S]$/); + die("update-rc.d: chdir $etcd$i.d: $!\n"); + } + opendir(DIR, "."); + foreach $_ (readdir(DIR)) { + next unless (/^[SK]\d\d$bn$/); + $fn = "$etcd$i.d/$_"; + $found = 1; + $islnk = &is_link ($_[0], $fn, $bn); + next if ($_[0] ne 'remove'); + if (! $islnk) { + print " $fn is not a link to ../init.d/$bn; not removing\n"; + next; + } + print " $etcd$i.d/$_\n"; + next if ($notreally); + unlink ("$etcd$i.d/$_") || + die("update-rc.d: unlink: $!\n"); + } + closedir(DIR); + } + $found; +} + +# Process the arguments after the "defaults" keyword. + +sub defaults { + my ($start, $stop) = (20, 20); + + &usage ("defaults takes only one or two codenumbers") if ($#ARGV > 2); + $start = $stop = $ARGV[1] if ($#ARGV >= 1); + $stop = $ARGV[2] if ($#ARGV >= 2); + &usage ("codenumber must be a number between 0 and 99") + if ($start !~ /^\d\d?$/ || $stop !~ /^\d\d?$/); + + $start = sprintf("%02d", $start); + $stop = sprintf("%02d", $stop); + + $stoplinks[0] = $stoplinks[1] = $stoplinks[6] = "K$stop"; + $startlinks[2] = $startlinks[3] = + $startlinks[4] = $startlinks[5] = "S$start"; + + 1; +} + +# Process the arguments after the start or stop keyword. + +sub startstop { + + my($letter, $NN, $level); + + while ($#ARGV >= 0) { + if ($ARGV[0] eq 'start') { $letter = 'S'; } + elsif ($ARGV[0] eq 'stop') { $letter = 'K' } + else { + &usage("expected start|stop"); + } + + if ($ARGV[1] !~ /^\d\d?$/) { + &usage("expected NN after $ARGV[0]"); + } + $NN = sprintf("%02d", $ARGV[1]); + + shift @ARGV; shift @ARGV; + $level = shift @ARGV; + do { + if ($level !~ m/^[0-9S]$/) { + &usage( + "expected runlevel [0-9S] (did you forget \".\" ?)"); + } + if (! -d "$etcd$level.d") { + print STDERR + "update-rc.d: $etcd$level.d: no such directory\n"; + exit(1); + } + $level = 99 if ($level eq 'S'); + $startlinks[$level] = "$letter$NN" if ($letter eq 'S'); + $stoplinks[$level] = "$letter$NN" if ($letter eq 'K'); + } while (($level = shift @ARGV) ne '.'); + &usage("action with list of runlevels not terminated by \`.'") + if ($level ne '.'); + } + 1; +} + +# Create the links. + +sub makelinks { + my($t, $i); + my @links; + + if (&checklinks) { + print " System startup links for $initd/$bn already exist.\n"; + exit (0); + } + print " Adding system startup for $initd/$bn ...\n"; + + # nice unreadable perl mess :) + + for($t = 0; $t < 2; $t++) { + @links = $t ? @startlinks : @stoplinks; + for($i = 0; $i <= $#links; $i++) { + $lvl = $i; + $lvl = 'S' if ($i == 99); + next if ($links[$i] eq ''); + print " $etcd$lvl.d/$links[$i]$bn -> ../init.d/$bn\n"; + next if ($notreally); + symlink("../init.d/$bn", "$etcd$lvl.d/$links[$i]$bn") + || die("update-rc.d: symlink: $!\n"); + } + } + + 1; +} |