#!/usr/bin/perl # # Many comments # use warnings; use strict; use lib'./'; use File::Path qw(make_path remove_tree); use Getopt::Std; use Data::Dumper; use POSIX; use constant ( FALSE => 0, TRUE => 1); sub usage { print STDERR "SetPermissions -d -m \n"; } # Get any command line parameters. my %options = (); getopts("d:m:", \%options); # Get the directory path name. my $dirPathName = ""; if (defined($options{d})) { $dirPathName = $options{d}; } else { usage; die "ERROR: the directory path name must be supplied."; } # Get the directory mode. my $dirMode = ""; if (defined($options{m})) { $dirMode = $options{m}; } else { usage; die "ERROR: the directory mode must be supplied."; } ############################################# # Create a directory if it is not already there. # Parameters: # 1) String : The directory path name. # 2) String : The directory mode. # sub smoothMakeDir { my ($dirPathName, $mode) = @_; if ( ! -e $dirPathName ) { my $err; my $saveUmask = umask(); print STDERR "MODE: " . $mode . "\n"; my $usedMode = oct($Mode); umask(0); print STDERR "usedMode: " . $usedMode . "\n"; make_path( $dirPathName, { mode => $usedMode, error => \$err ) ); print STDERR Dumper($err); if ( @$err ) { print STDERR "$!\n"; print STDERR "ERROR: Failed to create the directory: " . $dirPathName . "\n"; umask($saveUmask); die "Failed to create a directory"; } umask($saveUmask); } return 0; } print STDERR "\n"; smoothMakeDir( $dirPathName . "1", $dirMode ); print STDERR "\n"; smoothMakeDir( $dirPathName . "2", 0777 ); print STDERR "\n"; smoothMakeDir( $dirPathName . "3", "0777" ); RESULTS: MODE: 0777 usedMode: 511 $VAR1 = []; MODE: 511 usedMode: 329 $VAR1 = []; MODE: 0777 usedMode: 511 $VAR1 = []; ls -al dr----x--t 2 myuserid mygroup 0 Oct 22 11:22 david1 drwxrwxrwx 2 myuserid mygroup 0 Oct 22 11:22 david2 dr----x--t 2 myuserid mygroup 0 Oct 22 11:22 david3