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) }