#!/usr/bin/perl # # perms - show the rwx pattern for a given mode # Usage: perms 123 # prints: # ---x-w--wx 0123 # use warnings; use strict; sub show_flag ($$$) { my ( $place, $mask, $oct ) = ( shift, shift, shift ); my @flag = qw(- - -); if ( $oct >= 4 ) { $flag[0] = "r"; $flag[1] = "w" if ( $oct >= 6 ); # 6,7 } else { $flag[1] = "w" if ( $oct >= 2 ); # 2,3 } if ( $place == 1 && $mask % 2 ) { $flag[2] = do { $oct % 2 } ? "t" : "T"; } elsif ( $place == 3 && $mask >= 4 ) { $flag[2] = do { $oct % 2 } ? "s" : "S"; } elsif ( $place == 2 && ( $mask == 2 || $mask == 3 || $mask >= 6 ) ) { $flag[2] = do { $oct % 2 } ? "s" : "S"; } else { $flag[2] = do { $oct % 2 } ? "x" : "-"; } return join( "", @flag ); } my ( $m, $u, $g, $o ); if ( $#ARGV == 0 ) { my $perms = shift; $perms = "0" . $perms if ( $perms =~ /^[0-7]{3}$/ ); if ( $perms =~ /^[0-7]{4}$/ ) { ( $m, $u, $g, $o ) = split( //, $perms ); printf( "-%s%s%s $m$u$g$o\n", show_flag( 3, $m, $u ), show_flag( 2, $m, $g ), show_flag( 1, $m, $o ) ); } elsif ( $perms =~ /^-([-r][-w][-xSs]){2}([-r][-w][-xTt])$/ ) { for $m ( 0 .. 7 ) { for $u ( 0 .. 7 ) { for $g ( 0 .. 7 ) { for $o ( 0 .. 7 ) { if ( $perms =~ sprintf( "-%s%s%s", show_flag( 3, $m, $u ), show_flag( 2, $m, $g ), show_flag( 1, $m, $o ) ) ) { print "$perms $m$u$g$o\n"; } } } } } } } else { for $m ( 0 .. 7 ) { for $u ( 0 .. 7 ) { for $g ( 0 .. 7 ) { for $o ( 0 .. 7 ) { printf( "-%s%s%s $m$u$g$o\n", show_flag( 3, $m, $u ), show_flag( 2, $m, $g ), show_flag( 1, $m, $o ) ); } } } } } # # NB: This could be golfed into something a lot sexier! # It was a quick knock-up to figure out the logic. #