7 my ($passwd,$dashuid,$chown,$phase) = @ARGV;
9 my $find = "find -xdev";
11 warn "strips setuid bits!";
14 # construct array mapping
17 my $re = '^(\w[^:]*)\:[^:]+\:(\d+)\:';
20 my ($xname,$xid) = @_;
21 # returns the actual uid that source uid xid was (perhaps mistakenly)
23 open D, "$passwd-dst" or die $!;
25 m/$re/o or die "$_ $!";
26 my ($dname,$did) = ($1,$2);
27 return $did if $dname eq $xname;
33 open S, "$passwd-src" or die $!;
35 m/$re/o or die "$_ $!";
36 my ($sname,$sid) = ($1,$2);
37 my $did = find_did($sname,$sid);
38 push @{ $undomap{$did} }, $sid;
44 printf "$find $dashuid $in -print0 | xargs -0r $chown -- $out\n"
50 foreach my $sid (keys %undomap) {
51 my @dids = @{ $undomap{$sid} };
52 next if @dids==1 && $dids[0]==$sid;
54 mkmap($sid,$sid+$offset);
55 } elsif ($phase eq '2') {
57 mkmap($sid+$offset,$dids[0]);
59 print "# ambiguous $sid->@dids\n";
60 print "$find $dashuid ".($sid+$offset)." -ls\n"
63 } elsif ($phase eq '0') {
71 if ($phase eq '0' && @ambigs) {
73 (join " -o ", map { "$dashuid $_" } @ambigs).
78 close STDOUT or die $!;