1=head1 NAME 2 3perlvms - VMS-specific documentation for Perl 4 5=head1 DESCRIPTION 6 7Gathered below are notes describing details of Perl 5's 8behavior on VMS. They are a supplement to the regular Perl 5 9documentation, so we have focussed on the ways in which Perl 105 functions differently under VMS than it does under Unix, 11and on the interactions between Perl and the rest of the 12operating system. We haven't tried to duplicate complete 13descriptions of Perl features from the main Perl 14documentation, which can be found in the F<[.pod]> 15subdirectory of the Perl distribution. 16 17We hope these notes will save you from confusion and lost 18sleep when writing Perl scripts on VMS. If you find we've 19missed something you think should appear here, please don't 20hesitate to drop a line to vmsperl@perl.org. 21 22=head1 Installation 23 24Directions for building and installing Perl 5 can be found in 25the file F<README.vms> in the main source directory of the 26Perl distribution. 27 28=head1 Organization of Perl Images 29 30=head2 Core Images 31 32During the build process, three Perl images are produced. 33F<Miniperl.Exe> is an executable image which contains all of 34the basic functionality of Perl, but cannot take advantage of 35Perl XS extensions and has a hard-wired list of library locations 36for loading pure-Perl modules. It is used extensively to build and 37test Perl and various extensions, but is not installed. 38 39Most of the complete Perl resides in the shareable image F<PerlShr.Exe>, 40which provides a core to which the Perl executable image and all Perl 41extensions are linked. It is generally located via the logical name 42F<PERLSHR>. While it's possible to put the image in F<SYS$SHARE> to 43make it loadable, that's not recommended. And while you may wish to 44INSTALL the image for performance reasons, you should not install it 45with privileges; if you do, the result will not be what you expect as 46image privileges are disabled during Perl start-up. 47 48Finally, F<Perl.Exe> is an executable image containing the main 49entry point for Perl, as well as some initialization code. It 50should be placed in a public directory, and made world executable. 51In order to run Perl with command line arguments, you should 52define a foreign command to invoke this image. 53 54=head2 Perl Extensions 55 56Perl extensions are packages which provide both XS and Perl code 57to add new functionality to perl. (XS is a meta-language which 58simplifies writing C code which interacts with Perl, see 59L<perlxs> for more details.) The Perl code for an 60extension is treated like any other library module - it's 61made available in your script through the appropriate 62C<use> or C<require> statement, and usually defines a Perl 63package containing the extension. 64 65The portion of the extension provided by the XS code may be 66connected to the rest of Perl in either of two ways. In the 67B<static> configuration, the object code for the extension is 68linked directly into F<PerlShr.Exe>, and is initialized whenever 69Perl is invoked. In the B<dynamic> configuration, the extension's 70machine code is placed into a separate shareable image, which is 71mapped by Perl's DynaLoader when the extension is C<use>d or 72C<require>d in your script. This allows you to maintain the 73extension as a separate entity, at the cost of keeping track of the 74additional shareable image. Most extensions can be set up as either 75static or dynamic. 76 77The source code for an extension usually resides in its own 78directory. At least three files are generally provided: 79I<Extshortname>F<.xs> (where I<Extshortname> is the portion of 80the extension's name following the last C<::>), containing 81the XS code, I<Extshortname>F<.pm>, the Perl library module 82for the extension, and F<Makefile.PL>, a Perl script which uses 83the C<MakeMaker> library modules supplied with Perl to generate 84a F<Descrip.MMS> file for the extension. 85 86=head2 Installing static extensions 87 88Since static extensions are incorporated directly into 89F<PerlShr.Exe>, you'll have to rebuild Perl to incorporate a 90new extension. You should edit the main F<Descrip.MMS> or F<Makefile> 91you use to build Perl, adding the extension's name to the C<ext> 92macro, and the extension's object file to the C<extobj> macro. 93You'll also need to build the extension's object file, either 94by adding dependencies to the main F<Descrip.MMS>, or using a 95separate F<Descrip.MMS> for the extension. Then, rebuild 96F<PerlShr.Exe> to incorporate the new code. 97 98Finally, you'll need to copy the extension's Perl library 99module to the F<[.>I<Extname>F<]> subdirectory under one 100of the directories in C<@INC>, where I<Extname> is the name 101of the extension, with all C<::> replaced by C<.> (e.g. 102the library module for extension Foo::Bar would be copied 103to a F<[.Foo.Bar]> subdirectory). 104 105=head2 Installing dynamic extensions 106 107In general, the distributed kit for a Perl extension includes 108a file named Makefile.PL, which is a Perl program which is used 109to create a F<Descrip.MMS> file which can be used to build and 110install the files required by the extension. The kit should be 111unpacked into a directory tree B<not> under the main Perl source 112directory, and the procedure for building the extension is simply 113 114 $ perl Makefile.PL ! Create Descrip.MMS 115 $ mmk ! Build necessary files 116 $ mmk test ! Run test code, if supplied 117 $ mmk install ! Install into public Perl tree 118 119VMS support for this process in the current release of Perl 120is sufficient to handle most extensions. (See the MakeMaker 121documentation for more details on installation options for 122extensions.) 123 124=over 4 125 126=item * 127 128the F<[.Lib.Auto.>I<Arch>I<$PVers>I<Extname>F<]> subdirectory 129of one of the directories in C<@INC> (where I<PVers> 130is the version of Perl you're using, as supplied in C<$]>, 131with '.' converted to '_'), or 132 133=item * 134 135one of the directories in C<@INC>, or 136 137=item * 138 139a directory which the extensions Perl library module 140passes to the DynaLoader when asking it to map 141the shareable image, or 142 143=item * 144 145F<Sys$Share> or F<Sys$Library>. 146 147=back 148 149If the shareable image isn't in any of these places, you'll need 150to define a logical name I<Extshortname>, where I<Extshortname> 151is the portion of the extension's name after the last C<::>, which 152translates to the full file specification of the shareable image. 153 154=head1 File specifications 155 156=head2 Syntax 157 158We have tried to make Perl aware of both VMS-style and Unix-style file 159specifications wherever possible. You may use either style, or both, 160on the command line and in scripts, but you may not combine the two 161styles within a single file specification. VMS Perl interprets Unix 162pathnames in much the same way as the CRTL (I<e.g.> the first component 163of an absolute path is read as the device name for the VMS file 164specification). There are a set of functions provided in the 165C<VMS::Filespec> package for explicit interconversion between VMS and 166Unix syntax; its documentation provides more details. 167 168We've tried to minimize the dependence of Perl library 169modules on Unix syntax, but you may find that some of these, 170as well as some scripts written for Unix systems, will 171require that you use Unix syntax, since they will assume that 172'/' is the directory separator, I<etc.> If you find instances 173of this in the Perl distribution itself, please let us know, 174so we can try to work around them. 175 176Also when working on Perl programs on VMS, if you need a syntax 177in a specific operating system format, then you need either to 178check the appropriate DECC$ feature logical, or call a conversion 179routine to force it to that format. 180 181The feature logical name DECC$FILENAME_UNIX_REPORT modifies traditional 182Perl behavior in the conversion of file specifications from Unix to VMS 183format in order to follow the extended character handling rules now 184expected by the CRTL. Specifically, when this feature is in effect, the 185C<./.../> in a Unix path is now translated to C<[.^.^.^.]> instead of 186the traditional VMS C<[...]>. To be compatible with what MakeMaker 187expects, if a VMS path cannot be translated to a Unix path, it is 188passed through unchanged, so C<unixify("[...]")> will return C<[...]>. 189 190There are several ambiguous cases where a conversion routine cannot 191determine whether an input filename is in Unix format or in VMS format, 192since now both VMS and Unix file specifications may have characters in 193them that could be mistaken for syntax delimiters of the other type. So 194some pathnames simply cannot be used in a mode that allows either type 195of pathname to be present. Perl will tend to assume that an ambiguous 196filename is in Unix format. 197 198Allowing "." as a version delimiter is simply incompatible with 199determining whether a pathname is in VMS format or in Unix format with 200extended file syntax. There is no way to know whether "perl-5.8.6" is a 201Unix "perl-5.8.6" or a VMS "perl-5.8;6" when passing it to unixify() or 202vmsify(). 203 204The DECC$FILENAME_UNIX_REPORT logical name controls how Perl interprets 205filenames to the extent that Perl uses the CRTL internally for many 206purposes, and attempts to follow CRTL conventions for reporting 207filenames. The DECC$FILENAME_UNIX_ONLY feature differs in that it 208expects all filenames passed to the C run-time to be already in Unix 209format. This feature is not yet supported in Perl since Perl uses 210traditional OpenVMS file specifications internally and in the test 211harness, and it is not yet clear whether this mode will be useful or 212useable. The feature logical name DECC$POSIX_COMPLIANT_PATHNAMES is new 213with the RMS Symbolic Link SDK and included with OpenVMS v8.3, but is 214not yet supported in Perl. 215 216=head2 Filename Case 217 218Perl enables DECC$EFS_CASE_PRESERVE and DECC$ARGV_PARSE_STYLE by 219default. Note that the latter only takes effect when extended parse 220is set in the process in which Perl is running. When these features 221are explicitly disabled in the environment or the CRTL does not support 222them, Perl follows the traditional CRTL behavior of downcasing command-line 223arguments and returning file specifications in lower case only. 224 225I<N. B.> It is very easy to get tripped up using a mixture of other 226programs, external utilities, and Perl scripts that are in varying 227states of being able to handle case preservation. For example, a file 228created by an older version of an archive utility or a build utility 229such as MMK or MMS may generate a filename in all upper case even on an 230ODS-5 volume. If this filename is later retrieved by a Perl script or 231module in a case preserving environment, that upper case name may not 232match the mixed-case or lower-case expectations of the Perl code. Your 233best bet is to follow an all-or-nothing approach to case preservation: 234either don't use it at all, or make sure your entire toolchain and 235application environment support and use it. 236 237OpenVMS Alpha v7.3-1 and later and all version of OpenVMS I64 support 238case sensitivity as a process setting (see S<C<SET PROCESS 239/CASE_LOOKUP=SENSITIVE>>). Perl does not currently support case 240sensitivity on VMS, but it may in the future, so Perl programs should 241use the C<< File::Spec->case_tolerant >> method to determine the state, and 242not the C<$^O> variable. 243 244=head2 Symbolic Links 245 246When built on an ODS-5 volume with symbolic links enabled, Perl by 247default supports symbolic links when the requisite support is available 248in the filesystem and CRTL (generally 64-bit OpenVMS v8.3 and later). 249There are a number of limitations and caveats to be aware of when 250working with symbolic links on VMS. Most notably, the target of a valid 251symbolic link must be expressed as a Unix-style path and it must exist 252on a volume visible from your POSIX root (see the S<C<SHOW ROOT>> command 253in DCL help). For further details on symbolic link capabilities and 254requirements, see chapter 12 of the CRTL manual that ships with OpenVMS 255v8.3 or later. 256 257=head2 Wildcard expansion 258 259File specifications containing wildcards are allowed both on 260the command line and within Perl globs (e.g. C<E<lt>*.cE<gt>>). If 261the wildcard filespec uses VMS syntax, the resultant 262filespecs will follow VMS syntax; if a Unix-style filespec is 263passed in, Unix-style filespecs will be returned. 264Similar to the behavior of wildcard globbing for a Unix shell, 265one can escape command line wildcards with double quotation 266marks C<"> around a perl program command line argument. However, 267owing to the stripping of C<"> characters carried out by the C 268handling of argv you will need to escape a construct such as 269this one (in a directory containing the files F<PERL.C>, F<PERL.EXE>, 270F<PERL.H>, and F<PERL.OBJ>): 271 272 $ perl -e "print join(' ',@ARGV)" perl.* 273 perl.c perl.exe perl.h perl.obj 274 275in the following triple quoted manner: 276 277 $ perl -e "print join(' ',@ARGV)" """perl.*""" 278 perl.* 279 280In both the case of unquoted command line arguments or in calls 281to C<glob()> VMS wildcard expansion is performed. (csh-style 282wildcard expansion is available if you use C<File::Glob::glob>.) 283If the wildcard filespec contains a device or directory 284specification, then the resultant filespecs will also contain 285a device and directory; otherwise, device and directory 286information are removed. VMS-style resultant filespecs will 287contain a full device and directory, while Unix-style 288resultant filespecs will contain only as much of a directory 289path as was present in the input filespec. For example, if 290your default directory is Perl_Root:[000000], the expansion 291of C<[.t]*.*> will yield filespecs like 292"perl_root:[t]base.dir", while the expansion of C<t/*/*> will 293yield filespecs like "t/base.dir". (This is done to match 294the behavior of glob expansion performed by Unix shells.) 295 296Similarly, the resultant filespec will contain the file version 297only if one was present in the input filespec. 298 299 300=head2 Pipes 301 302Input and output pipes to Perl filehandles are supported; the 303"file name" is passed to lib$spawn() for asynchronous 304execution. You should be careful to close any pipes you have 305opened in a Perl script, lest you leave any "orphaned" 306subprocesses around when Perl exits. 307 308You may also use backticks to invoke a DCL subprocess, whose 309output is used as the return value of the expression. The 310string between the backticks is handled as if it were the 311argument to the C<system> operator (see below). In this case, 312Perl will wait for the subprocess to complete before continuing. 313 314The mailbox (MBX) that perl can create to communicate with a pipe 315defaults to a buffer size of 8192 on 64-bit systems, 512 on VAX. The 316default buffer size is adjustable via the logical name PERL_MBX_SIZE 317provided that the value falls between 128 and the SYSGEN parameter 318MAXBUF inclusive. For example, to set the mailbox size to 32767 use 319C<$ENV{'PERL_MBX_SIZE'} = 32767;> and then open and use pipe constructs. 320An alternative would be to issue the command: 321 322 $ Define PERL_MBX_SIZE 32767 323 324before running your wide record pipe program. A larger value may 325improve performance at the expense of the BYTLM UAF quota. 326 327=head1 PERL5LIB and PERLLIB 328 329The PERL5LIB and PERLLIB environment elements work as documented in L<perl>, 330except that the element separator is, by default, '|' instead of ':'. 331However, when running under a Unix shell as determined by the logical 332name C<GNV$UNIX_SHELL>, the separator will be ':' as on Unix systems. The 333directory specifications may use either VMS or Unix syntax. 334 335=head1 The Perl Forked Debugger 336 337The Perl forked debugger places the debugger commands and output in a 338separate X-11 terminal window so that commands and output from multiple 339processes are not mixed together. 340 341Perl on VMS supports an emulation of the forked debugger when Perl is 342run on a VMS system that has X11 support installed. 343 344To use the forked debugger, you need to have the default display set to an 345X-11 Server and some environment variables set that Unix expects. 346 347The forked debugger requires the environment variable C<TERM> to be C<xterm>, 348and the environment variable C<DISPLAY> to exist. C<xterm> must be in 349lower case. 350 351 $define TERM "xterm" 352 353 $define DISPLAY "hostname:0.0" 354 355Currently the value of C<DISPLAY> is ignored. It is recommended that it be set 356to be the hostname of the display, the server and screen in Unix notation. In 357the future the value of DISPLAY may be honored by Perl instead of using the 358default display. 359 360It may be helpful to always use the forked debugger so that script I/O is 361separated from debugger I/O. You can force the debugger to be forked by 362assigning a value to the logical name <PERLDB_PIDS> that is not a process 363identification number. 364 365 $define PERLDB_PIDS XXXX 366 367 368=head1 PERL_VMS_EXCEPTION_DEBUG 369 370The PERL_VMS_EXCEPTION_DEBUG being defined as "ENABLE" will cause the VMS 371debugger to be invoked if a fatal exception that is not otherwise 372handled is raised. The purpose of this is to allow debugging of 373internal Perl problems that would cause such a condition. 374 375This allows the programmer to look at the execution stack and variables to 376find out the cause of the exception. As the debugger is being invoked as 377the Perl interpreter is about to do a fatal exit, continuing the execution 378in debug mode is usually not practical. 379 380Starting Perl in the VMS debugger may change the program execution 381profile in a way that such problems are not reproduced. 382 383The C<kill> function can be used to test this functionality from within 384a program. 385 386In typical VMS style, only the first letter of the value of this logical 387name is actually checked in a case insensitive mode, and it is considered 388enabled if it is the value "T","1" or "E". 389 390This logical name must be defined before Perl is started. 391 392=head1 Command line 393 394=head2 I/O redirection and backgrounding 395 396Perl for VMS supports redirection of input and output on the 397command line, using a subset of Bourne shell syntax: 398 399=over 4 400 401=item * 402 403C<E<lt>file> reads stdin from C<file>, 404 405=item * 406 407C<E<gt>file> writes stdout to C<file>, 408 409=item * 410 411C<E<gt>E<gt>file> appends stdout to C<file>, 412 413=item * 414 415C<2E<gt>file> writes stderr to C<file>, 416 417=item * 418 419C<2E<gt>E<gt>file> appends stderr to C<file>, and 420 421=item * 422 423C<< 2>&1 >> redirects stderr to stdout. 424 425=back 426 427In addition, output may be piped to a subprocess, using the 428character '|'. Anything after this character on the command 429line is passed to a subprocess for execution; the subprocess 430takes the output of Perl as its input. 431 432Finally, if the command line ends with '&', the entire 433command is run in the background as an asynchronous 434subprocess. 435 436=head2 Command line switches 437 438The following command line switches behave differently under 439VMS than described in L<perlrun>. Note also that in order 440to pass uppercase switches to Perl, you need to enclose 441them in double-quotes on the command line, since the CRTL 442downcases all unquoted strings. 443 444On newer 64 bit versions of OpenVMS, a process setting now 445controls if the quoting is needed to preserve the case of 446command line arguments. 447 448=over 4 449 450=item -i 451 452If the C<-i> switch is present but no extension for a backup 453copy is given, then inplace editing creates a new version of 454a file; the existing copy is not deleted. (Note that if 455an extension is given, an existing file is renamed to the backup 456file, as is the case under other operating systems, so it does 457not remain as a previous version under the original filename.) 458 459=item -S 460 461If the C<"-S"> or C<-"S"> switch is present I<and> the script 462name does not contain a directory, then Perl translates the 463logical name DCL$PATH as a searchlist, using each translation 464as a directory in which to look for the script. In addition, 465if no file type is specified, Perl looks in each directory 466for a file matching the name specified, with a blank type, 467a type of F<.pl>, and a type of F<.com>, in that order. 468 469=item -u 470 471The C<-u> switch causes the VMS debugger to be invoked 472after the Perl program is compiled, but before it has 473run. It does not create a core dump file. 474 475=back 476 477=head1 Perl functions 478 479As of the time this document was last revised, the following 480Perl functions were implemented in the VMS port of Perl 481(functions marked with * are discussed in more detail below): 482 483 file tests*, abs, alarm, atan, backticks*, binmode*, bless, 484 caller, chdir, chmod, chown, chomp, chop, chr, 485 close, closedir, cos, crypt*, defined, delete, die, do, dump*, 486 each, endgrent, endpwent, eof, eval, exec*, exists, exit, exp, 487 fileno, flock getc, getgrent*, getgrgid*, getgrnam, getlogin, 488 getppid, getpwent*, getpwnam*, getpwuid*, glob, gmtime*, goto, 489 grep, hex, ioctl, import, index, int, join, keys, kill*, 490 last, lc, lcfirst, lchown*, length, link*, local, localtime, log, 491 lstat, m//, map, mkdir, my, next, no, oct, open, opendir, ord, 492 pack, pipe, pop, pos, print, printf, push, q//, qq//, qw//, 493 qx//*, quotemeta, rand, read, readdir, readlink*, redo, ref, 494 rename, require, reset, return, reverse, rewinddir, rindex, 495 rmdir, s///, scalar, seek, seekdir, select(internal), 496 select (system call)*, setgrent, setpwent, shift, sin, sleep, 497 socketpair, sort, splice, split, sprintf, sqrt, srand, stat, 498 study, substr, symlink*, sysread, system*, syswrite, tell, 499 telldir, tie, time, times*, tr///, uc, ucfirst, umask, 500 undef, unlink*, unpack, untie, unshift, use, utime*, 501 values, vec, wait, waitpid*, wantarray, warn, write, y/// 502 503The following functions were not implemented in the VMS port, 504and calling them produces a fatal error (usually) or 505undefined behavior (rarely, we hope): 506 507 chroot, dbmclose, dbmopen, fork*, getpgrp, getpriority, 508 msgctl, msgget, msgsend, msgrcv, semctl, 509 semget, semop, setpgrp, setpriority, shmctl, shmget, 510 shmread, shmwrite, syscall 511 512The following functions are available on Perls compiled with Dec C 5135.2 or greater and running VMS 7.0 or greater: 514 515 truncate 516 517The following functions are available on Perls built on VMS 7.2 or 518greater: 519 520 fcntl (without locking) 521 522The following functions may or may not be implemented, 523depending on what type of socket support you've built into 524your copy of Perl: 525 526 accept, bind, connect, getpeername, 527 gethostbyname, getnetbyname, getprotobyname, 528 getservbyname, gethostbyaddr, getnetbyaddr, 529 getprotobynumber, getservbyport, gethostent, 530 getnetent, getprotoent, getservent, sethostent, 531 setnetent, setprotoent, setservent, endhostent, 532 endnetent, endprotoent, endservent, getsockname, 533 getsockopt, listen, recv, select(system call)*, 534 send, setsockopt, shutdown, socket 535 536The following function is available on Perls built on 64 bit OpenVMS v8.2 537with hard links enabled on an ODS-5 formatted build disk. CRTL support 538is in principle available as of OpenVMS v7.3-1, and better configuration 539support could detect this. 540 541 link 542 543The following functions are available on Perls built on 64 bit OpenVMS 544v8.2 and later. CRTL support is in principle available as of OpenVMS 545v7.3-2, and better configuration support could detect this. 546 547 getgrgid, getgrnam, getpwnam, getpwuid, 548 setgrent, ttyname 549 550The following functions are available on Perls built on 64 bit OpenVMS v8.2 551and later. 552 553 statvfs, socketpair 554 555=over 4 556 557=item File tests 558 559The tests C<-b>, C<-B>, C<-c>, C<-C>, C<-d>, C<-e>, C<-f>, 560C<-o>, C<-M>, C<-s>, C<-S>, C<-t>, C<-T>, and C<-z> work as 561advertised. The return values for C<-r>, C<-w>, and C<-x> 562tell you whether you can actually access the file; this may 563not reflect the UIC-based file protections. Since real and 564effective UIC don't differ under VMS, C<-O>, C<-R>, C<-W>, 565and C<-X> are equivalent to C<-o>, C<-r>, C<-w>, and C<-x>. 566Similarly, several other tests, including C<-A>, C<-g>, C<-k>, 567C<-l>, C<-p>, and C<-u>, aren't particularly meaningful under 568VMS, and the values returned by these tests reflect whatever 569your CRTL C<stat()> routine does to the equivalent bits in the 570st_mode field. Finally, C<-d> returns true if passed a device 571specification without an explicit directory (e.g. C<DUA1:>), as 572well as if passed a directory. 573 574There are DECC feature logical names AND ODS-5 volume attributes that 575also control what values are returned for the date fields. 576 577Note: Some sites have reported problems when using the file-access 578tests (C<-r>, C<-w>, and C<-x>) on files accessed via DEC's DFS. 579Specifically, since DFS does not currently provide access to the 580extended file header of files on remote volumes, attempts to 581examine the ACL fail, and the file tests will return false, 582with C<$!> indicating that the file does not exist. You can 583use C<stat> on these files, since that checks UIC-based protection 584only, and then manually check the appropriate bits, as defined by 585your C compiler's F<stat.h>, in the mode value it returns, if you 586need an approximation of the file's protections. 587 588=item backticks 589 590Backticks create a subprocess, and pass the enclosed string 591to it for execution as a DCL command. Since the subprocess is 592created directly via C<lib$spawn()>, any valid DCL command string 593may be specified. 594 595=item binmode FILEHANDLE 596 597The C<binmode> operator will attempt to insure that no translation 598of carriage control occurs on input from or output to this filehandle. 599Since this involves reopening the file and then restoring its 600file position indicator, if this function returns FALSE, the 601underlying filehandle may no longer point to an open file, or may 602point to a different position in the file than before C<binmode> 603was called. 604 605Note that C<binmode> is generally not necessary when using normal 606filehandles; it is provided so that you can control I/O to existing 607record-structured files when necessary. You can also use the 608C<vmsfopen> function in the VMS::Stdio extension to gain finer 609control of I/O to files and devices with different record structures. 610 611=item crypt PLAINTEXT, USER 612 613The C<crypt> operator uses the C<sys$hash_password> system 614service to generate the hashed representation of PLAINTEXT. 615If USER is a valid username, the algorithm and salt values 616are taken from that user's UAF record. If it is not, then 617the preferred algorithm and a salt of 0 are used. The 618quadword encrypted value is returned as an 8-character string. 619 620The value returned by C<crypt> may be compared against 621the encrypted password from the UAF returned by the C<getpw*> 622functions, in order to authenticate users. If you're 623going to do this, remember that the encrypted password in 624the UAF was generated using uppercase username and 625password strings; you'll have to upcase the arguments to 626C<crypt> to insure that you'll get the proper value: 627 628 sub validate_passwd { 629 my($user,$passwd) = @_; 630 my($pwdhash); 631 if ( !($pwdhash = (getpwnam($user))[1]) || 632 $pwdhash ne crypt("\U$passwd","\U$name") ) { 633 intruder_alert($name); 634 } 635 return 1; 636 } 637 638 639=item die 640 641C<die> will force the native VMS exit status to be an SS$_ABORT code 642if neither of the $! or $? status values are ones that would cause 643the native status to be interpreted as being what VMS classifies as 644SEVERE_ERROR severity for DCL error handling. 645 646When C<PERL_VMS_POSIX_EXIT> is active (see L</"$?"> below), the native VMS exit 647status value will have either one of the C<$!> or C<$?> or C<$^E> or 648the Unix value 255 encoded into it in a way that the effective original 649value can be decoded by other programs written in C, including Perl 650and the GNV package. As per the normal non-VMS behavior of C<die> if 651either C<$!> or C<$?> are non-zero, one of those values will be 652encoded into a native VMS status value. If both of the Unix status 653values are 0, and the C<$^E> value is set one of ERROR or SEVERE_ERROR 654severity, then the C<$^E> value will be used as the exit code as is. 655If none of the above apply, the Unix value of 255 will be encoded into 656a native VMS exit status value. 657 658Please note a significant difference in the behavior of C<die> in 659the C<PERL_VMS_POSIX_EXIT> mode is that it does not force a VMS 660SEVERE_ERROR status on exit. The Unix exit values of 2 through 661255 will be encoded in VMS status values with severity levels of 662SUCCESS. The Unix exit value of 1 will be encoded in a VMS status 663value with a severity level of ERROR. This is to be compatible with 664how the VMS C library encodes these values. 665 666The minimum severity level set by C<die> in C<PERL_VMS_POSIX_EXIT> mode 667may be changed to be ERROR or higher in the future depending on the 668results of testing and further review. 669 670See L</"$?"> for a description of the encoding of the Unix value to 671produce a native VMS status containing it. 672 673=item dump 674 675Rather than causing Perl to abort and dump core, the C<dump> 676operator invokes the VMS debugger. If you continue to 677execute the Perl program under the debugger, control will 678be transferred to the label specified as the argument to 679C<dump>, or, if no label was specified, back to the 680beginning of the program. All other state of the program 681(I<e.g.> values of variables, open file handles) are not 682affected by calling C<dump>. 683 684=item exec LIST 685 686A call to C<exec> will cause Perl to exit, and to invoke the command 687given as an argument to C<exec> via C<lib$do_command>. If the 688argument begins with '@' or '$' (other than as part of a filespec), 689then it is executed as a DCL command. Otherwise, the first token on 690the command line is treated as the filespec of an image to run, and 691an attempt is made to invoke it (using F<.Exe> and the process 692defaults to expand the filespec) and pass the rest of C<exec>'s 693argument to it as parameters. If the token has no file type, and 694matches a file with null type, then an attempt is made to determine 695whether the file is an executable image which should be invoked 696using C<MCR> or a text file which should be passed to DCL as a 697command procedure. 698 699=item fork 700 701While in principle the C<fork> operator could be implemented via 702(and with the same rather severe limitations as) the CRTL C<vfork()> 703routine, and while some internal support to do just that is in 704place, the implementation has never been completed, making C<fork> 705currently unavailable. A true kernel C<fork()> is expected in a 706future version of VMS, and the pseudo-fork based on interpreter 707threads may be available in a future version of Perl on VMS (see 708L<perlfork>). In the meantime, use C<system>, backticks, or piped 709filehandles to create subprocesses. 710 711=item getpwent 712 713=item getpwnam 714 715=item getpwuid 716 717These operators obtain the information described in L<perlfunc>, 718if you have the privileges necessary to retrieve the named user's 719UAF information via C<sys$getuai>. If not, then only the C<$name>, 720C<$uid>, and C<$gid> items are returned. The C<$dir> item contains 721the login directory in VMS syntax, while the C<$comment> item 722contains the login directory in Unix syntax. The C<$gcos> item 723contains the owner field from the UAF record. The C<$quota> 724item is not used. 725 726=item gmtime 727 728The C<gmtime> operator will function properly if you have a 729working CRTL C<gmtime()> routine, or if the logical name 730SYS$TIMEZONE_DIFFERENTIAL is defined as the number of seconds 731which must be added to UTC to yield local time. (This logical 732name is defined automatically if you are running a version of 733VMS with built-in UTC support.) If neither of these cases is 734true, a warning message is printed, and C<undef> is returned. 735 736=item kill 737 738In most cases, C<kill> is implemented via the undocumented system 739service C<$SIGPRC>, which has the same calling sequence as C<$FORCEX>, but 740throws an exception in the target process rather than forcing it to call 741C<$EXIT>. Generally speaking, C<kill> follows the behavior of the 742CRTL's C<kill()> function, but unlike that function can be called from 743within a signal handler. Also, unlike the C<kill> in some versions of 744the CRTL, Perl's C<kill> checks the validity of the signal passed in and 745returns an error rather than attempting to send an unrecognized signal. 746 747Also, negative signal values don't do anything special under 748VMS; they're just converted to the corresponding positive value. 749 750=item qx// 751 752See the entry on C<backticks> above. 753 754=item select (system call) 755 756If Perl was not built with socket support, the system call 757version of C<select> is not available at all. If socket 758support is present, then the system call version of 759C<select> functions only for file descriptors attached 760to sockets. It will not provide information about regular 761files or pipes, since the CRTL C<select()> routine does not 762provide this functionality. 763 764=item stat EXPR 765 766Since VMS keeps track of files according to a different scheme 767than Unix, it's not really possible to represent the file's ID 768in the C<st_dev> and C<st_ino> fields of a C<struct stat>. Perl 769tries its best, though, and the values it uses are pretty unlikely 770to be the same for two different files. We can't guarantee this, 771though, so caveat scriptor. 772 773=item system LIST 774 775The C<system> operator creates a subprocess, and passes its 776arguments to the subprocess for execution as a DCL command. 777Since the subprocess is created directly via C<lib$spawn()>, any 778valid DCL command string may be specified. If the string begins with 779'@', it is treated as a DCL command unconditionally. Otherwise, if 780the first token contains a character used as a delimiter in file 781specification (e.g. C<:> or C<]>), an attempt is made to expand it 782using a default type of F<.Exe> and the process defaults, and if 783successful, the resulting file is invoked via C<MCR>. This allows you 784to invoke an image directly simply by passing the file specification 785to C<system>, a common Unixish idiom. If the token has no file type, 786and matches a file with null type, then an attempt is made to 787determine whether the file is an executable image which should be 788invoked using C<MCR> or a text file which should be passed to DCL 789as a command procedure. 790 791If LIST consists of the empty string, C<system> spawns an 792interactive DCL subprocess, in the same fashion as typing 793B<SPAWN> at the DCL prompt. 794 795Perl waits for the subprocess to complete before continuing 796execution in the current process. As described in L<perlfunc>, 797the return value of C<system> is a fake "status" which follows 798POSIX semantics unless the pragma C<use vmsish 'status'> is in 799effect; see the description of C<$?> in this document for more 800detail. 801 802=item time 803 804The value returned by C<time> is the offset in seconds from 80501-JAN-1970 00:00:00 (just like the CRTL's times() routine), in order 806to make life easier for code coming in from the POSIX/Unix world. 807 808=item times 809 810The array returned by the C<times> operator is divided up 811according to the same rules the CRTL C<times()> routine. 812Therefore, the "system time" elements will always be 0, since 813there is no difference between "user time" and "system" time 814under VMS, and the time accumulated by a subprocess may or may 815not appear separately in the "child time" field, depending on 816whether C<times()> keeps track of subprocesses separately. Note 817especially that the VAXCRTL (at least) keeps track only of 818subprocesses spawned using C<fork()> and C<exec()>; it will not 819accumulate the times of subprocesses spawned via pipes, C<system()>, 820or backticks. 821 822=item unlink LIST 823 824C<unlink> will delete the highest version of a file only; in 825order to delete all versions, you need to say 826 827 1 while unlink LIST; 828 829You may need to make this change to scripts written for a 830Unix system which expect that after a call to C<unlink>, 831no files with the names passed to C<unlink> will exist. 832(Note: This can be changed at compile time; if you 833C<use Config> and C<$Config{'d_unlink_all_versions'}> is 834C<define>, then C<unlink> will delete all versions of a 835file on the first call.) 836 837C<unlink> will delete a file if at all possible, even if it 838requires changing file protection (though it won't try to 839change the protection of the parent directory). You can tell 840whether you've got explicit delete access to a file by using the 841C<VMS::Filespec::candelete> operator. For instance, in order 842to delete only files to which you have delete access, you could 843say something like 844 845 sub safe_unlink { 846 my($file,$num); 847 foreach $file (@_) { 848 next unless VMS::Filespec::candelete($file); 849 $num += unlink $file; 850 } 851 $num; 852 } 853 854(or you could just use C<VMS::Stdio::remove>, if you've installed 855the VMS::Stdio extension distributed with Perl). If C<unlink> has to 856change the file protection to delete the file, and you interrupt it 857in midstream, the file may be left intact, but with a changed ACL 858allowing you delete access. 859 860This behavior of C<unlink> is to be compatible with POSIX behavior 861and not traditional VMS behavior. 862 863=item utime LIST 864 865This operator changes only the modification time of the file (VMS 866revision date) on ODS-2 volumes and ODS-5 volumes without access 867dates enabled. On ODS-5 volumes with access dates enabled, the 868true access time is modified. 869 870=item waitpid PID,FLAGS 871 872If PID is a subprocess started by a piped C<open()> (see L<open>), 873C<waitpid> will wait for that subprocess, and return its final status 874value in C<$?>. If PID is a subprocess created in some other way (e.g. 875SPAWNed before Perl was invoked), C<waitpid> will simply check once per 876second whether the process has completed, and return when it has. (If 877PID specifies a process that isn't a subprocess of the current process, 878and you invoked Perl with the C<-w> switch, a warning will be issued.) 879 880Returns PID on success, -1 on error. The FLAGS argument is ignored 881in all cases. 882 883=back 884 885=head1 Perl variables 886 887The following VMS-specific information applies to the indicated 888"special" Perl variables, in addition to the general information 889in L<perlvar>. Where there is a conflict, this information 890takes precedence. 891 892=over 4 893 894=item %ENV 895 896The operation of the C<%ENV> array depends on the translation 897of the logical name F<PERL_ENV_TABLES>. If defined, it should 898be a search list, each element of which specifies a location 899for C<%ENV> elements. If you tell Perl to read or set the 900element C<$ENV{>I<name>C<}>, then Perl uses the translations of 901F<PERL_ENV_TABLES> as follows: 902 903=over 4 904 905=item CRTL_ENV 906 907This string tells Perl to consult the CRTL's internal C<environ> array 908of key-value pairs, using I<name> as the key. In most cases, this 909contains only a few keys, but if Perl was invoked via the C 910C<exec[lv]e()> function, as is the case for some embedded Perl 911applications or when running under a shell such as GNV bash, the 912C<environ> array may have been populated by the calling program. 913 914=item CLISYM_[LOCAL] 915 916A string beginning with C<CLISYM_>tells Perl to consult the CLI's 917symbol tables, using I<name> as the name of the symbol. When reading 918an element of C<%ENV>, the local symbol table is scanned first, followed 919by the global symbol table.. The characters following C<CLISYM_> are 920significant when an element of C<%ENV> is set or deleted: if the 921complete string is C<CLISYM_LOCAL>, the change is made in the local 922symbol table; otherwise the global symbol table is changed. 923 924=item Any other string 925 926If an element of F<PERL_ENV_TABLES> translates to any other string, 927that string is used as the name of a logical name table, which is 928consulted using I<name> as the logical name. The normal search 929order of access modes is used. 930 931=back 932 933F<PERL_ENV_TABLES> is translated once when Perl starts up; any changes 934you make while Perl is running do not affect the behavior of C<%ENV>. 935If F<PERL_ENV_TABLES> is not defined, then Perl defaults to consulting 936first the logical name tables specified by F<LNM$FILE_DEV>, and then 937the CRTL C<environ> array. This default order is reversed when the 938logical name F<GNV$UNIX_SHELL> is defined, such as when running under 939GNV bash. 940 941For operations on %ENV entries based on logical names or DCL symbols, the 942key string is treated as if it were entirely uppercase, regardless of the 943case actually specified in the Perl expression. Entries in %ENV based on the 944CRTL's environ array preserve the case of the key string when stored, and 945lookups are case sensitive. 946 947When an element of C<%ENV> is read, the locations to which 948F<PERL_ENV_TABLES> points are checked in order, and the value 949obtained from the first successful lookup is returned. If the 950name of the C<%ENV> element contains a semi-colon, it and 951any characters after it are removed. These are ignored when 952the CRTL C<environ> array or a CLI symbol table is consulted. 953However, the name is looked up in a logical name table, the 954suffix after the semi-colon is treated as the translation index 955to be used for the lookup. This lets you look up successive values 956for search list logical names. For instance, if you say 957 958 $ Define STORY once,upon,a,time,there,was 959 $ perl -e "for ($i = 0; $i <= 6; $i++) " - 960 _$ -e "{ print $ENV{'story;'.$i},' '}" 961 962Perl will print C<ONCE UPON A TIME THERE WAS>, assuming, of course, 963that F<PERL_ENV_TABLES> is set up so that the logical name C<story> 964is found, rather than a CLI symbol or CRTL C<environ> element with 965the same name. 966 967When an element of C<%ENV> is set to a defined string, the 968corresponding definition is made in the location to which the 969first translation of F<PERL_ENV_TABLES> points. If this causes a 970logical name to be created, it is defined in supervisor mode. 971(The same is done if an existing logical name was defined in 972executive or kernel mode; an existing user or supervisor mode 973logical name is reset to the new value.) If the value is an empty 974string, the logical name's translation is defined as a single C<NUL> 975(ASCII C<\0>) character, since a logical name cannot translate to a 976zero-length string. (This restriction does not apply to CLI symbols 977or CRTL C<environ> values; they are set to the empty string.) 978 979When an element of C<%ENV> is set to C<undef>, the element is looked 980up as if it were being read, and if it is found, it is deleted. (An 981item "deleted" from the CRTL C<environ> array is set to the empty 982string.) Using C<delete> to remove an element from C<%ENV> has a 983similar effect, but after the element is deleted, another attempt is 984made to look up the element, so an inner-mode logical name or a name 985in another location will replace the logical name just deleted. In 986either case, only the first value found searching PERL_ENV_TABLES is 987altered. It is not possible at present to define a search list 988logical name via %ENV. 989 990The element C<$ENV{DEFAULT}> is special: when read, it returns 991Perl's current default device and directory, and when set, it 992resets them, regardless of the definition of F<PERL_ENV_TABLES>. 993It cannot be cleared or deleted; attempts to do so are silently 994ignored. 995 996Note that if you want to pass on any elements of the 997C-local environ array to a subprocess which isn't 998started by fork/exec, or isn't running a C program, you 999can "promote" them to logical names in the current 1000process, which will then be inherited by all subprocesses, 1001by saying 1002 1003 foreach my $key (qw[C-local keys you want promoted]) { 1004 my $temp = $ENV{$key}; # read from C-local array 1005 $ENV{$key} = $temp; # and define as logical name 1006 } 1007 1008(You can't just say C<$ENV{$key} = $ENV{$key}>, since the 1009Perl optimizer is smart enough to elide the expression.) 1010 1011Don't try to clear C<%ENV> by saying C<%ENV = ();>, it will throw 1012a fatal error. This is equivalent to doing the following from DCL: 1013 1014 DELETE/LOGICAL * 1015 1016You can imagine how bad things would be if, for example, the SYS$MANAGER 1017or SYS$SYSTEM logical names were deleted. 1018 1019At present, the first time you iterate over %ENV using 1020C<keys>, or C<values>, you will incur a time penalty as all 1021logical names are read, in order to fully populate %ENV. 1022Subsequent iterations will not reread logical names, so they 1023won't be as slow, but they also won't reflect any changes 1024to logical name tables caused by other programs. 1025 1026You do need to be careful with the logical names representing 1027process-permanent files, such as C<SYS$INPUT> and C<SYS$OUTPUT>. 1028The translations for these logical names are prepended with a 1029two-byte binary value (0x1B 0x00) that needs to be stripped off 1030if you want to use it. (In previous versions of Perl it wasn't 1031possible to get the values of these logical names, as the null 1032byte acted as an end-of-string marker) 1033 1034=item $! 1035 1036The string value of C<$!> is that returned by the CRTL's 1037strerror() function, so it will include the VMS message for 1038VMS-specific errors. The numeric value of C<$!> is the 1039value of C<errno>, except if errno is EVMSERR, in which 1040case C<$!> contains the value of vaxc$errno. Setting C<$!> 1041always sets errno to the value specified. If this value is 1042EVMSERR, it also sets vaxc$errno to 4 (NONAME-F-NOMSG), so 1043that the string value of C<$!> won't reflect the VMS error 1044message from before C<$!> was set. 1045 1046=item $^E 1047 1048This variable provides direct access to VMS status values 1049in vaxc$errno, which are often more specific than the 1050generic Unix-style error messages in C<$!>. Its numeric value 1051is the value of vaxc$errno, and its string value is the 1052corresponding VMS message string, as retrieved by sys$getmsg(). 1053Setting C<$^E> sets vaxc$errno to the value specified. 1054 1055While Perl attempts to keep the vaxc$errno value to be current, if 1056errno is not EVMSERR, it may not be from the current operation. 1057 1058=item $? 1059 1060The "status value" returned in C<$?> is synthesized from the 1061actual exit status of the subprocess in a way that approximates 1062POSIX wait(5) semantics, in order to allow Perl programs to 1063portably test for successful completion of subprocesses. The 1064low order 8 bits of C<$?> are always 0 under VMS, since the 1065termination status of a process may or may not have been 1066generated by an exception. 1067 1068The next 8 bits contain the termination status of the program. 1069 1070If the child process follows the convention of C programs 1071compiled with the _POSIX_EXIT macro set, the status value will 1072contain the actual value of 0 to 255 returned by that program 1073on a normal exit. 1074 1075With the _POSIX_EXIT macro set, the Unix exit value of zero is 1076represented as a VMS native status of 1, and the Unix values 1077from 2 to 255 are encoded by the equation: 1078 1079 VMS_status = 0x35a000 + (unix_value * 8) + 1. 1080 1081And in the special case of Unix value 1 the encoding is: 1082 1083 VMS_status = 0x35a000 + 8 + 2 + 0x10000000. 1084 1085For other termination statuses, the severity portion of the 1086subprocess's exit status is used: if the severity was success or 1087informational, these bits are all 0; if the severity was 1088warning, they contain a value of 1; if the severity was 1089error or fatal error, they contain the actual severity bits, 1090which turns out to be a value of 2 for error and 4 for severe_error. 1091Fatal is another term for the severe_error status. 1092 1093As a result, C<$?> will always be zero if the subprocess's exit 1094status indicated successful completion, and non-zero if a 1095warning or error occurred or a program compliant with encoding 1096_POSIX_EXIT values was run and set a status. 1097 1098How can you tell the difference between a non-zero status that is 1099the result of a VMS native error status or an encoded Unix status? 1100You can not unless you look at the ${^CHILD_ERROR_NATIVE} value. 1101The ${^CHILD_ERROR_NATIVE} value returns the actual VMS status value 1102and check the severity bits. If the severity bits are equal to 1, 1103then if the numeric value for C<$?> is between 2 and 255 or 0, then 1104C<$?> accurately reflects a value passed back from a Unix application. 1105If C<$?> is 1, and the severity bits indicate a VMS error (2), then 1106C<$?> is from a Unix application exit value. 1107 1108In practice, Perl scripts that call programs that return _POSIX_EXIT 1109type status values will be expecting those values, and programs that 1110call traditional VMS programs will either be expecting the previous 1111behavior or just checking for a non-zero status. 1112 1113And success is always the value 0 in all behaviors. 1114 1115When the actual VMS termination status of the child is an error, 1116internally the C<$!> value will be set to the closest Unix errno 1117value to that error so that Perl scripts that test for error 1118messages will see the expected Unix style error message instead 1119of a VMS message. 1120 1121Conversely, when setting C<$?> in an END block, an attempt is made 1122to convert the POSIX value into a native status intelligible to 1123the operating system upon exiting Perl. What this boils down to 1124is that setting C<$?> to zero results in the generic success value 1125SS$_NORMAL, and setting C<$?> to a non-zero value results in the 1126generic failure status SS$_ABORT. See also L<perlport/exit>. 1127 1128With the C<PERL_VMS_POSIX_EXIT> logical name defined as "ENABLE", 1129setting C<$?> will cause the new value to be encoded into C<$^E> 1130so that either the original parent or child exit status values 1131 0 to 255 can be automatically recovered by C programs expecting 1132_POSIX_EXIT behavior. If both a parent and a child exit value are 1133non-zero, then it will be assumed that this is actually a VMS native 1134status value to be passed through. The special value of 0xFFFF is 1135almost a NOOP as it will cause the current native VMS status in the 1136C library to become the current native Perl VMS status, and is handled 1137this way as it is known to not be a valid native VMS status value. 1138It is recommend that only values in the range of normal Unix parent or 1139child status numbers, 0 to 255 are used. 1140 1141The pragma C<use vmsish 'status'> makes C<$?> reflect the actual 1142VMS exit status instead of the default emulation of POSIX status 1143described above. This pragma also disables the conversion of 1144non-zero values to SS$_ABORT when setting C<$?> in an END 1145block (but zero will still be converted to SS$_NORMAL). 1146 1147Do not use the pragma C<use vmsish 'status'> with C<PERL_VMS_POSIX_EXIT> 1148enabled, as they are at times requesting conflicting actions and the 1149consequence of ignoring this advice will be undefined to allow future 1150improvements in the POSIX exit handling. 1151 1152In general, with C<PERL_VMS_POSIX_EXIT> enabled, more detailed information 1153will be available in the exit status for DCL scripts or other native VMS tools, 1154and will give the expected information for Posix programs. It has not been 1155made the default in order to preserve backward compatibility. 1156 1157N.B. Setting C<DECC$FILENAME_UNIX_REPORT> implicitly enables 1158C<PERL_VMS_POSIX_EXIT>. 1159 1160=item $| 1161 1162Setting C<$|> for an I/O stream causes data to be flushed 1163all the way to disk on each write (I<i.e.> not just to 1164the underlying RMS buffers for a file). In other words, 1165it's equivalent to calling fflush() and fsync() from C. 1166 1167=back 1168 1169=head1 Standard modules with VMS-specific differences 1170 1171=head2 SDBM_File 1172 1173SDBM_File works properly on VMS. It has, however, one minor 1174difference. The database directory file created has a F<.sdbm_dir> 1175extension rather than a F<.dir> extension. F<.dir> files are VMS filesystem 1176directory files, and using them for other purposes could cause unacceptable 1177problems. 1178 1179=head1 Revision date 1180 1181Please see the git repository for revision history. 1182 1183=head1 AUTHOR 1184 1185Charles Bailey bailey@cor.newman.upenn.edu 1186Craig Berry craigberry@mac.com 1187Dan Sugalski dan@sidhe.org 1188John Malmberg wb8tyw@qsl.net 1189