From 8ecf7e98497c98662a3e934f720beaf3e0cf1f3e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Petr=20P=C3=ADsa=C5=99?= Date: Tue, 12 May 2015 13:25:55 +0200 Subject: [PATCH] rebuildreset: Preserve file permissions When reseting a package lists using rebuildreset(1) too, `all' and `done' files changed permissions to 0600. This patch preserves the permissions and ownerships of those files. --- bin/rebuildreset | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/bin/rebuildreset b/bin/rebuildreset index 9e6252c..748fbaf 100755 --- a/bin/rebuildreset +++ b/bin/rebuildreset @@ -85,6 +85,21 @@ Configuration is in L format. Following options are needed: =cut +# Copy file permissions and ownership from source file handle to target file +# handle. Croaks on error. +sub copy_file_attributes { + my ($source_handle, $source_name, $target_handle, $target_name) = @_; + my @source_meta = stat($source_handle) or + croak "Could not retrieve `$source_name' meta-data: $!"; + if (defined $source_meta[2]) { + chmod($source_meta[2], $target_handle) or + croak "Could not change `$target_name' permissions: $!"; + } + if (defined $source_meta[4] and defined $source_meta[5]) { + chown($source_meta[4], $source_meta[5], $target_name) or + croak "Could not change `$target_name' ownership: $!"; + } +} # Remove listed packages from file. sub edit_file { @@ -102,6 +117,7 @@ sub edit_file { # Create output file my ($new_file, $new_file_name) = File::Temp::tempfile($file_name . 'XXXXXX', UNLINK => 0, EXLOCK => 1); + copy_file_attributes($file, $file_name, $new_file, $new_file_name); # Filter input file into output file while (local $_ = <$file>) { -- 2.11.4.GIT