#!/usr/bin/perl -w use strict; use FileHandle; sub convert_acl($) { my ($value) = @_; local $_ = $value; die "ACL value must be hex encoded\n" unless (s/^0x//); s/\s//g; my ($x4, $x8) = ('([0-9A-Fa-f]{4})', '([0-9A-Fa-f]{8})'); if (s/^01000000//) { my $new_value = '0x02000000 '; while ($_ ne '') { if (s/^(0100|0400|1000|2000)$x4//) { $new_value .= "$1$2ffffffff "; } elsif (s/^(0200|0800)$x4$x8//) { $new_value .= "$1$2$3 "; } else { die "ACL format not recognized\n" } } return $new_value; } elsif (s/^02000000//) { my $new_value = '0x01000000 '; while ($_ ne '') { if (s/^(0100|0400|1000|2000)$x4$x8//) { $new_value .= "$1$2 "; } elsif (s/^(0200|0800)$x4$x8//) { $new_value .= "$1$2$3 "; } else { die "ACL format not recognized\n" } } return $new_value; } else { die "ACL format not recognized\n" } } sub check_name($) { my ($name) = @_; if ($name =~ m[^[^A-Za-z]]) { print STDERR "Renaming attribute `user.$name' to `X$name'.\n"; return "X$name"; } return $name; } sub convert($) { my ($file) = @_; eval { while (<$file>) { m[^(#.*)?$] || s[^system\.posix_acl_access=(0x02.*)] ['$acl=' . convert_acl($1)]e || s[^system\.posix_acl_default=(0x02.*)] ['$defacl=' . convert_acl($1)]e || s[^user\.([^=]*)][check_name($1)]e || s[^\$acl=(0x01.*)] ['system.posix_acl_access=' . convert_acl($1)]e || s[^\$defacl=(0x01.*)] ['system.posix_acl_default=' . convert_acl($1)]e || s[^([A-Za-z][^=]*)][user.$1] || die "Input format error\n"; print; } }; if ($@) { chomp $@; print STDERR "$@ in line $..\n"; } return (not $@); } unless (@ARGV) { printf STDERR <close unless ($arg eq '-'); } exit (not $good);