do a much better job at handling owners and groups
This commit is contained in:
parent
9d40a8be1c
commit
b2162c8751
@ -1,4 +1,4 @@
|
||||
# $OpenBSD: FS.pm,v 1.2 2008/10/27 11:12:01 espie Exp $
|
||||
# $OpenBSD: FS.pm,v 1.3 2008/10/28 14:32:08 espie Exp $
|
||||
# Copyright (c) 2008 Marc Espie <espie@openbsd.org>
|
||||
#
|
||||
# Permission to use, copy, modify, and distribute this software for any
|
||||
@ -19,8 +19,9 @@ use warnings;
|
||||
package FS::File;
|
||||
sub new
|
||||
{
|
||||
my ($class, $filename, $type) = @_;
|
||||
bless {path =>$filename, type => $type}, $class
|
||||
my ($class, $filename, $type, $owner, $group) = @_;
|
||||
bless {path =>$filename, type => $type, owner => $owner,
|
||||
group => $group}, $class
|
||||
}
|
||||
|
||||
sub type
|
||||
@ -33,6 +34,16 @@ sub path
|
||||
shift->{path};
|
||||
}
|
||||
|
||||
sub owner
|
||||
{
|
||||
shift->{owner};
|
||||
}
|
||||
|
||||
sub group
|
||||
{
|
||||
shift->{group};
|
||||
}
|
||||
|
||||
package FS;
|
||||
|
||||
my $destdir;
|
||||
@ -40,6 +51,7 @@ use OpenBSD::Mtree;
|
||||
use File::Find;
|
||||
use File::Spec;
|
||||
use File::Basename;
|
||||
use OpenBSD::IdCache;
|
||||
# existing files are classified according to the following routine
|
||||
|
||||
sub get_type
|
||||
@ -249,6 +261,8 @@ sub scan_destdir
|
||||
my $archname = $Config{'archname'};
|
||||
my $installprivlib = $Config{'installprivlib'};
|
||||
my $installarchlib = $Config{'installarchlib'};
|
||||
my $uid_lookup = OpenBSD::UnameCache->new;
|
||||
my $gid_lookup = OpenBSD::GnameCache->new;
|
||||
|
||||
find(
|
||||
sub {
|
||||
@ -265,8 +279,11 @@ sub scan_destdir
|
||||
}
|
||||
return if $File::Find::name =~ m/pear\/lib\/\.(?:filemap|lock)$/;
|
||||
my $path = undest($File::Find::name);
|
||||
my ($uid, $gid) = (stat $_)[4,5];
|
||||
$path =~ s,^/etc/X11/app-defaults\b,/usr/local/lib/X11/app-defaults,;
|
||||
$files{$path} = FS::File->new($path, $type);
|
||||
$files{$path} = FS::File->new($path, $type,
|
||||
$uid_lookup->lookup($uid),
|
||||
$gid_lookup->lookup($gid));
|
||||
}, $destdir);
|
||||
zap_dirs(\%files, $destdir.'/etc/X11/app-defaults');
|
||||
return \%files;
|
||||
|
@ -1,5 +1,5 @@
|
||||
#! /usr/bin/perl
|
||||
# $OpenBSD: make-plist,v 1.117 2008/10/28 13:29:01 espie Exp $
|
||||
# $OpenBSD: make-plist,v 1.118 2008/10/28 14:32:08 espie Exp $
|
||||
# Copyright (c) 2004-2008 Marc Espie <espie@openbsd.org>
|
||||
#
|
||||
# Permission to use, copy, modify, and distribute this software for any
|
||||
@ -283,7 +283,7 @@ sub clone_tags
|
||||
my $n = $t->clone;
|
||||
if ($n->isa("OpenBSD::PackingElement::Sample") ||
|
||||
$n->isa("OpenBSD::PackingElement::SampleDir")) {
|
||||
main::handle_modes($plist, $n, $t);
|
||||
main::handle_modes($plist, $n, $t, undef, undef);
|
||||
}
|
||||
$n->add_object($plist);
|
||||
$plist->{nonempty} = 1;
|
||||
@ -395,15 +395,28 @@ sub stringize
|
||||
return '!%%'.shift->{name}.'%%';
|
||||
}
|
||||
|
||||
package OpenBSD::PackingElement::Owner;
|
||||
sub register2
|
||||
{
|
||||
my ($self, $plist, $haystack) = @_;
|
||||
|
||||
$self->SUPER::register2($plist, $haystack);
|
||||
push(@{$haystack->{$main::subst->do($self->{name})}}, $self);
|
||||
}
|
||||
|
||||
package OpenBSD::PackingElement::Group;
|
||||
sub register2
|
||||
{
|
||||
&OpenBSD::PackingElement::Owner::register2;
|
||||
}
|
||||
|
||||
package OpenBSD::PackingElement::FileObject;
|
||||
sub register2
|
||||
{
|
||||
my ($self, $plist, $haystack) = @_;
|
||||
|
||||
$self->SUPER::register2($plist, $haystack);
|
||||
my $fullname = $self->fullname;
|
||||
my $n = $main::subst->do($fullname);
|
||||
push(@{$haystack->{$n}}, $self);
|
||||
push(@{$haystack->{$main::subst->do($self->fullname)}}, $self);
|
||||
}
|
||||
|
||||
package OpenBSD::PackingElement::FileBase;
|
||||
@ -658,10 +671,11 @@ sub create_object
|
||||
# for now, we copy over stuff from old items.
|
||||
sub handle_modes
|
||||
{
|
||||
my ($plist, $item, $o) = @_;
|
||||
my ($plist, $item, $o, $file, $haystack) = @_;
|
||||
my ($mode, $owner, $group) = ('', '', '');
|
||||
my ($oldmode, $oldowner, $oldgroup) = ($plist->{state}->{mode}, $plist->{state}->{owner}, $plist->{state}->{group});
|
||||
$oldmode = '' unless defined $oldmode;
|
||||
|
||||
$oldowner = '' unless defined $oldowner;
|
||||
$oldgroup = '' unless defined $oldgroup;
|
||||
|
||||
@ -682,6 +696,42 @@ sub handle_modes
|
||||
$group = $item->{group};
|
||||
}
|
||||
}
|
||||
if (defined $file) {
|
||||
if (defined $haystack->{$file->owner}) {
|
||||
for my $o (@{$haystack->{$file->owner}}) {
|
||||
if ($o->isa("OpenBSD::PackingElement::Owner")) {
|
||||
if ($owner ne '') {
|
||||
if ($main::subst->do($owner) eq $file->owner) {
|
||||
last;
|
||||
} else {
|
||||
print "File owner does not match for ",
|
||||
$file->path, " ($owner vs. ",
|
||||
$file->owner, ")\n";
|
||||
}
|
||||
} else {
|
||||
$owner = $o->{name};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (defined $haystack->{$file->group}) {
|
||||
for my $g (@{$haystack->{$file->group}}) {
|
||||
if ($g->isa("OpenBSD::PackingElement::Group")) {
|
||||
if ($group ne '') {
|
||||
if ($main::subst->do($group) eq $file->group) {
|
||||
last;
|
||||
} else {
|
||||
print "File group does not match for ",
|
||||
$file->path, " ($group vs. ",
|
||||
$file->group, ")\n";
|
||||
}
|
||||
} else {
|
||||
$group = $g->{name};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($mode ne $oldmode) {
|
||||
OpenBSD::PackingElement::Mode->add($plist, $mode);
|
||||
}
|
||||
@ -714,7 +764,7 @@ sub short_name
|
||||
# If the resulting name is arch-dependent, we warn.
|
||||
# We don't fix it automatically, as this may need special handling.
|
||||
if ($short =~ m/i386|m68k|sparc/) {
|
||||
print STDERR "make-plist: generated plist $plist->{filename} contains arch-dependent\n";
|
||||
print STDERR "make-plist: $plist->{filename} contains arch-dependent\n";
|
||||
print STDERR "\t$short\n";
|
||||
}
|
||||
return $short;
|
||||
@ -725,15 +775,15 @@ sub bad_files
|
||||
my ($short, $plist) = @_;
|
||||
|
||||
if ($short =~ /\.orig$/) {
|
||||
print STDERR "make-plist: generated plist $plist->{filename} may contain patched file\n";
|
||||
print STDERR "make-plist: $plist->{filename} may contain patched file\n";
|
||||
print STDERR "\t$short\n";
|
||||
}
|
||||
if ($short =~ /\/\.[^\/]*\.swp$/) {
|
||||
print STDERR "make-plist: generated plist $plist->{filename} may contain vim swap file\n";
|
||||
print STDERR "make-plist: $plist->{filename} may contain vim swap file\n";
|
||||
print STDERR "\t$short\n";
|
||||
}
|
||||
if ($short =~ /\~$/) {
|
||||
print STDERR "make-plist: generated plist $plist->{filename} may contain emacs temp file\n";
|
||||
print STDERR "make-plist: $plist->{filename} may contain emacs temp file\n";
|
||||
print STDERR "\t$short\n";
|
||||
}
|
||||
}
|
||||
@ -748,6 +798,7 @@ sub handle_file
|
||||
my $default = $allplists->[0];
|
||||
if (defined $haystack->{$file->path}) {
|
||||
for my $item (@{$haystack->{$file->path}}) {
|
||||
next if $item->isa("OpenBSD::PackingElement::State");
|
||||
my $p = $item->{plist}->{replacement};
|
||||
if ($file->type eq 'directory' &&
|
||||
$p->{mtree}->{$file->path}) {
|
||||
@ -761,7 +812,7 @@ sub handle_file
|
||||
}
|
||||
$foundit = $item;
|
||||
if ($o->can("compute_modes")) {
|
||||
handle_modes($p, $item, $o);
|
||||
handle_modes($p, $item, $o, $file, $haystack);
|
||||
}
|
||||
$o->add_object($p);
|
||||
$item->{accounted_for} = $o;
|
||||
@ -785,8 +836,15 @@ sub handle_file
|
||||
if (!defined $o) {
|
||||
next;
|
||||
}
|
||||
bad_files($short, $p);
|
||||
if (($file->type eq 'library' || $file->type eq 'plugin') && !$shared_only) {
|
||||
if (defined $p->{shared}) {
|
||||
$p->{wantshared} = 1;
|
||||
$p = $p->{shared};
|
||||
}
|
||||
}
|
||||
if ($o->can("compute_modes")) {
|
||||
handle_modes($p, undef, $o);
|
||||
handle_modes($p, undef, $o, $file, $haystack);
|
||||
}
|
||||
$o->add_object($p);
|
||||
$p->{nonempty} = 1;
|
||||
@ -834,7 +892,7 @@ sub handle_file
|
||||
$p->{wantshared} = 1;
|
||||
$p = $p->{shared};
|
||||
}
|
||||
handle_modes($p, undef, $o);
|
||||
handle_modes($p, undef, $o, $file, $haystack);
|
||||
$o->add_object($p);
|
||||
$p->{nonempty} = 1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user