use strict;
use IO::File;
use Data::Dumper;
+use POSIX;
use vars qw($quis
$mode $doall
" -v --verbose extra verbose\n";
}
-cfg_fail("config filename $etcfile should have been absolute path of a file")
- unless $etcfile =~ m,^/, && $etcfile !~ m,/$,;
+cfg_fail("config filename $etcfile should not be directory")
+ if $etcfile =~ m,/$,;
use vars qw($default_dir);
-$default_dir= $etcfile;
-$default_dir =~ s,/[^/]+$,,;
+$default_dir= $etcfile =~ m,^.*/, ? $& : './';
use vars qw($slave_dir $slave_prefix $slave_suffix);
$slave_dir= 'slave';
debug_dump('@zone_cfg_list %zone_cfg');
process_zones($mode ? @zone_cfg_list : @ARGV);
debug_dump('%output_contents');
+output_files() if $install;
exit 0;
sub qualify ($) {
my ($i) = @_;
- $i= "$default_dir/$i" unless $i =~ m,^/,;
+ $i= "$default_dir$i" unless $i =~ m,^/,;
return $i;
}
$$cfg{'file'});
}
+sub output_files () {
+ my ($fn,$ofn,$mfn,$l,$dir, $maxmode,$h,@to_install);
+
+ foreach $ofn (keys %output_contents) {
+ $fn= $ofn; $mfn= "output file $fn";
+ for (;;) {
+ if (!lstat $fn) {
+ $! == &ENOENT or die "$quis: stat $mfn:\n $!\n";
+ $maxmode= 0666;
+ last;
+ } elsif (-f _) {
+ $maxmode= (stat _)[2];
+ last;
+ } elsif (-l _) {
+ defined($l= readlink $fn)
+ or die "$quis: readlink $mfn:\n $!\n";
+ $dir= $fn =~ m,^.*/, ? $& : './';
+ $fn= "$dir$l" unless $l =~ m,^/,;
+ $mfn= "output file $fn (symlink target of $ofn)";
+ } else {
+ die "$quis: output file $mfn exists but is not a file".
+ " (or symlink to one)";
+ }
+ }
+ unlink "$fn.new" or $! == &ENOENT or
+ die "$quis: cannot clear out old .new version of $mfn:\n $!";
+ $h= new IO::File "$fn.new",'w',$maxmode
+ or die("$quis: create .new version of $mfn:\n $!");
+ print $h
+ "# generated by $quis, do not edit\n",
+ $output_contents{$ofn}
+ or die "$quis: write data to .new version of $mfn:\n $!";
+ $h->close
+ or die "$quis: close .new version of $mfn:\n $!";
+ push @to_install, $fn,$mfn;
+ }
+
+ while (($fn,$mfn, @to_install) = @to_install) {
+ rename "$fn.new",$fn
+ or die "$quis: install new version of $mfn:\n $!";
+ }
+}
#-------------------- general utilities