use Fcntl ':mode';
my %TYPE = (S_IFDIR,'d',S_IFCHR,'c',S_IFBLK,'b',S_IFREG,'-',S_IFLNK,'l',
S_IFSOCK,'s');
sub o
{
my ($mode, $xr, $xid) = @_;
(($mode & ($xr | $xid)) == ($xr | $xid)) ? 's'
: ($mode & $xr) ? 'x' : ($mode & $xid) ? 'S' : '-';
}
sub strmode
{
my ($mode) = @_;
($TYPE{$mode & S_IFMT} || '?')
. (($mode & S_IRUSR) ? 'r' : '-')
. (($mode & S_IWUSR) ? 'w' : '-')
. o($mode, S_IXUSR, S_ISUID)
. (($mode & S_IRGRP) ? 'r' : '-')
. (($mode & S_IWGRP) ? 'w' : '-')
. o($mode, S_IXGRP, S_ISGID)
. (($mode & S_IROTH) ? 'r' : '-')
. (($mode & S_IWOTH) ? 'w' : '-')
. o($mode, S_IXOTH, S_ISVTX)
}
####
#!/usr/bin/perl -l
sub i{'-'}
sub o{$m&$_[0]?$m&$_[1]?'s':x:$m&$_[1]?S:i}
print qw(? c d b - l s)[($m=(lstat)[2])>>13]
,$m&256?r:i
,$m&128?w:i
,o(64,2048)
,$m&32?r:i
,$m&16?w:i
,o(8,1024)
,$m&4?r:i
,$m&2?w:i
,o(1,512)
," $_"for@ARGV;
####
#!/usr/bin/perl -l
for$f(@ARGV){
$_=sprintf"%9b",($m=(lstat$f)[2])&511;
y/01/\0\xff/;
$_&=rwxrwxrwx;
y/\0/-/;
print qw(? c d b - l s)[$m>>13],"$_ $f"
}