VMS::Device provides access to device information and can allocate, deallocate, mount, dismount, and initialize devices.
use VMS::Device '/.*/'; @type_list = device_types(); @class_list = device_classes(); @dev_list = device_list($DeviceName[, $DeviceClass[, $DeviceType]]); $DevInfoHashRef = device_info($DeviceName); $BitmapHashRef = decode_device_bitmap($InfoName, $BitmapValue); $Status = mount(\%Device_properties); $Status = dismount($DevName[, \%Dismount_flags]); [Unimplemented] $DeviceAllocated = allocate($DevName[, $FirstAvail[, $AccMode]]); $Status = deallocate($DevName[, $AccMode]); $Status = initialize($DevName[, $VolumeName[, \%DevProperties]]);
This short example program uses VMS::Device to report on available free disk space on locally mounted volumes.
use strict; use warnings; use VMS::Device qw(device_list device_info decode_device_bitmap); my @info = grep { my $char = decode_device_bitmap("DEVCHAR",$_->{DEVCHAR}); $char->{MNT} && !$char->{DMT} && !$char->{FOR}; } map { device_info($_); } (@ARGV) ? @ARGV : device_list("*","DISK"); die "No devices selected" unless @info; my ($tot_space, $tot_free, $tot_used, $cnt) = (0, 0, 0, 0); for (@info) { my $tot = $_->{MAXBLOCK}; my $free = $_->{FREEBLOCKS}; my $used = $tot - $free; my $megs_tot = $tot / 2048; my $megs_free = $free / 2048; my $megs_used = $used / 2048; $tot_space += $tot; $tot_free += $free; $tot_used += $used; if (!$cnt) { printf("%25s %-29s %s\n","","Blocks","Bytes"); printf("%-12s %-12s %-9s %-9s %-9s %-5s %-5s %-5s %-5s\n", "Device","Volume","Total","Free","Used","Total","Free","Used", "%Used"); } $cnt++; for ($megs_free, $megs_used, $megs_tot) { if ($_ > 9999) { $_ = int(($_ / 1024) + .5) . "G"; } else { $_ = int($_ + .5) . "M"; } } printf("%-12s %-12s %9d %9d %9d %5s %5s %5s %5.1f\n", $_->{DEVNAM},$_->{VOLNAM},$tot,$free,$used,$megs_tot, $megs_free,$megs_used,$used/$tot*100); } if ($cnt > 1) { my $tot_megs = $tot_space / 2048; my $tot_free_megs = $tot_free / 2048; my $tot_used_megs = $tot_used / 2048; printf("\nTotal of %d drive%s\n",scalar(@info),($#info) ? "s" : ""); printf(" %10d blocks %6d MB\n",$tot_space,$tot_megs); printf(" %10d free %6d MB\n", $tot_free, $tot_free_megs); printf(" %10d used %6d MB\n", $tot_used, $tot_used_megs); }