Once again syncing after too long an absence
[p5sagit/p5-mst-13.2.git] / vms / ext / Stdio / Stdio.pm
CommitLineData
0d7e20a5 1# VMS::Stdio - VMS extensions to Perl's stdio calls
748a9306 2#
3# Author: Charles Bailey bailey@genetics.upenn.edu
562a7b0c 4# Version: 2.2
5# Revised: 19-Jul-1998
c1441b10 6# Docs revised: 13-Oct-1998 Dan Sugalski <sugalskd@ous.edu>
0d7e20a5 7
8package VMS::Stdio;
9
10require 5.002;
11use vars qw( $VERSION @EXPORT @EXPORT_OK %EXPORT_TAGS @ISA );
12use Carp '&croak';
13use DynaLoader ();
14use Exporter ();
15
562a7b0c 16$VERSION = '2.2';
740ce14c 17@ISA = qw( Exporter DynaLoader IO::File );
0d7e20a5 18@EXPORT = qw( &O_APPEND &O_CREAT &O_EXCL &O_NDELAY &O_NOWAIT
19 &O_RDONLY &O_RDWR &O_TRUNC &O_WRONLY );
562a7b0c 20@EXPORT_OK = qw( &binmode &flush &getname &remove &rewind &sync &setdef &tmpnam
17f28c40 21 &vmsopen &vmssysopen &waitfh &writeof );
0d7e20a5 22%EXPORT_TAGS = ( CONSTANTS => [ qw( &O_APPEND &O_CREAT &O_EXCL &O_NDELAY
23 &O_NOWAIT &O_RDONLY &O_RDWR &O_TRUNC
24 &O_WRONLY ) ],
562a7b0c 25 FUNCTIONS => [ qw( &binmode &flush &getname &remove &rewind
26 &setdef &sync &tmpnam &vmsopen &vmssysopen
17f28c40 27 &waitfh &writeof ) ] );
0d7e20a5 28
29bootstrap VMS::Stdio $VERSION;
30
31sub AUTOLOAD {
32 my($constname) = $AUTOLOAD;
33 $constname =~ s/.*:://;
34 if ($constname =~ /^O_/) {
35 my($val) = constant($constname);
36 defined $val or croak("Unknown VMS::Stdio constant $constname");
09b7f37c 37 *$AUTOLOAD = sub { $val; }
0d7e20a5 38 }
740ce14c 39 else { # We don't know about it; hand off to IO::File
40 require IO::File;
55497cff 41
5f05dabc 42 *$AUTOLOAD = eval "sub { shift->IO::File::$constname(\@_) }";
43 croak "Error autoloading IO::File::$constname: $@" if $@;
0d7e20a5 44 }
45 goto &$AUTOLOAD;
46}
47
48sub DESTROY { close($_[0]); }
49
50
51################################################################################
52# Intercept calls to old VMS::stdio package, complain, and hand off
53# This will be removed in a future version of VMS::Stdio
54
55package VMS::stdio;
56
57sub AUTOLOAD {
58 my($func) = $AUTOLOAD;
59 $func =~ s/.*:://;
60 # Cheap trick: we know DynaLoader has required Carp.pm
61 Carp::carp("Old package VMS::stdio is now VMS::Stdio; please update your code");
62 if ($func eq 'vmsfopen') {
63 Carp::carp("Old function &vmsfopen is now &vmsopen");
64 goto &VMS::Stdio::vmsopen;
65 }
66 elsif ($func eq 'fgetname') {
67 Carp::carp("Old function &fgetname is now &getname");
68 goto &VMS::Stdio::getname;
69 }
70 else { goto &{"VMS::Stdio::$func"}; }
71}
72
73package VMS::Stdio; # in case we ever use AutoLoader
74
751;
76
77__END__
748a9306 78
79=head1 NAME
80
2ceaccd7 81VMS::Stdio - standard I/O functions via VMS extensions
748a9306 82
83=head1 SYNOPSIS
84
c1441b10 85 use VMS::Stdio qw( &flush &getname &remove &rewind &setdef &sync &tmpnam
86 &vmsopen &vmssysopen &waitfh &writeof );
87 setdef("new:[default.dir]");
88 $uniquename = tmpnam;
89 $fh = vmsopen("my.file","rfm=var","alq=100",...) or die $!;
90 $name = getname($fh);
91 print $fh "Hello, world!\n";
92 flush($fh);
93 sync($fh);
94 rewind($fh);
95 $line = <$fh>;
96 undef $fh; # closes file
97 $fh = vmssysopen("another.file", O_RDONLY | O_NDELAY, 0, "ctx=bin");
98 sysread($fh,$data,128);
99 waitfh($fh);
100 close($fh);
101 remove("another.file");
102 writeof($pipefh);
562a7b0c 103 binmode($fh);
c1441b10 104
748a9306 105=head1 DESCRIPTION
106
2ceaccd7 107This package gives Perl scripts access via VMS extensions to several
0d7e20a5 108C stdio operations not available through Perl's CORE I/O functions.
109The specific routines are described below. These functions are
110prototyped as unary operators, with the exception of C<vmsopen>
111and C<vmssysopen>, which can take any number of arguments, and
112C<tmpnam>, which takes none.
113
114All of the routines are available for export, though none are
115exported by default. All of the constants used by C<vmssysopen>
116to specify access modes are exported by default. The routines
117are associated with the Exporter tag FUNCTIONS, and the constants
118are associated with the Exporter tag CONSTANTS, so you can more
119easily choose what you'd like to import:
120
121 # import constants, but not functions
122 use VMS::Stdio; # same as use VMS::Stdio qw( :DEFAULT );
123 # import functions, but not constants
124 use VMS::Stdio qw( !:CONSTANTS :FUNCTIONS );
125 # import both
126 use VMS::Stdio qw( :CONSTANTS :FUNCTIONS );
127 # import neither
128 use VMS::Stdio ();
129
130Of course, you can also choose to import specific functions by
131name, as usual.
132
740ce14c 133This package C<ISA> IO::File, so that you can call IO::File
0d7e20a5 134methods on the handles returned by C<vmsopen> and C<vmssysopen>.
740ce14c 135The IO::File package is not initialized, however, until you
0d7e20a5 136actually call a method that VMS::Stdio doesn't provide. This
0e06870b 137is done to save startup time for users who don't wish to use
740ce14c 138the IO::File methods.
0d7e20a5 139
140B<Note:> In order to conform to naming conventions for Perl
141extensions and functions, the name of this package has been
142changed to VMS::Stdio as of Perl 5.002, and the names of some
143routines have been changed. Calls to the old VMS::stdio routines
144will generate a warning, and will be routed to the equivalent
145VMS::Stdio function. This compatibility interface will be
146removed in a future release of this extension, so please
147update your code to use the new routines.
148
2ceaccd7 149=over
150
562a7b0c 151=item binmode
152
153This function causes the file handle to be reopened with the CRTL's
154carriage control processing disabled; its effect is the same as that
155of the C<b> access mode in C<vmsopen>. After the file is reopened,
156the file pointer is positioned as close to its position before the
157call as possible (I<i.e.> as close as fsetpos() can get it -- for
158some record-structured files, it's not possible to return to the
159exact byte offset in the file). Because the file must be reopened,
160this function cannot be used on temporary-delete files. C<binmode>
161returns true if successful, and C<undef> if not.
162
163Note that the effect of C<binmode> differs from that of the binmode()
164function on operating systems such as Windows and MSDOS, and is not
165needed to process most types of file.
166
0d7e20a5 167=item flush
168
169This function causes the contents of stdio buffers for the specified
170file handle to be flushed. If C<undef> is used as the argument to
171C<flush>, all currently open file handles are flushed. Like the CRTL
172fflush() routine, it does not flush any underlying RMS buffers for the
173file, so the data may not be flushed all the way to the disk. C<flush>
174returns a true value if successful, and C<undef> if not.
175
176=item getname
177
178The C<getname> function returns the file specification associated
740ce14c 179with a Perl I/O handle. If an error occurs, it returns C<undef>.
748a9306 180
0d7e20a5 181=item remove
748a9306 182
0d7e20a5 183This function deletes the file named in its argument, returning
184a true value if successful and C<undef> if not. It differs from
185the CORE Perl function C<unlink> in that it does not try to
186reset file protection if the original protection does not give
187you delete access to the file (cf. L<perlvms>). In other words,
188C<remove> is equivalent to
189
190 unlink($file) if VMS::Filespec::candelete($file);
748a9306 191
0d7e20a5 192=item rewind
193
194C<rewind> resets the current position of the specified file handle
195to the beginning of the file. It's really just a convenience
196method equivalent in effect to C<seek($fh,0,0)>. It returns a
197true value if successful, and C<undef> if it fails.
198
17f28c40 199=item setdef
200
201This function sets the default device and directory for the process.
202It is identical to the built-in chdir() operator, except that the change
203persists after Perl exits. It returns a true value on success, and
0e06870b 204C<undef> if it encounters an error.
17f28c40 205
0d7e20a5 206=item sync
207
208This function flushes buffered data for the specified file handle
209from stdio and RMS buffers all the way to disk. If successful, it
210returns a true value; otherwise, it returns C<undef>.
211
212=item tmpnam
748a9306 213
214The C<tmpnam> function returns a unique string which can be used
215as a filename when creating temporary files. If, for some
216reason, it is unable to generate a name, it returns C<undef>.
217
0d7e20a5 218=item vmsopen
748a9306 219
0d7e20a5 220The C<vmsopen> function enables you to specify optional RMS arguments
5f05dabc 221to the VMS CRTL when opening a file. Its operation is similar to the built-in
0d7e20a5 222Perl C<open> function (see L<perlfunc> for a complete description),
5f05dabc 223but it will only open normal files; it cannot open pipes or duplicate
740ce14c 224existing I/O handles. Up to 8 optional arguments may follow the
748a9306 225file name. These arguments should be strings which specify
0d7e20a5 226optional file characteristics as allowed by the CRTL. (See the
227CRTL reference manual description of creat() and fopen() for details.)
228If successful, C<vmsopen> returns a VMS::Stdio file handle; if an
229error occurs, it returns C<undef>.
230
5f05dabc 231You can use the file handle returned by C<vmsopen> just as you
0d7e20a5 232would any other Perl file handle. The class VMS::Stdio ISA
740ce14c 233IO::File, so you can call IO::File methods using the handle
0d7e20a5 234returned by C<vmsopen>. However, C<use>ing VMS::Stdio does not
740ce14c 235automatically C<use> IO::File; you must do so explicitly in
236your program if you want to call IO::File methods. This is
237done to avoid the overhead of initializing the IO::File package
0d7e20a5 238in programs which intend to use the handle returned by C<vmsopen>
239as a normal Perl file handle only. When the scalar containing
240a VMS::Stdio file handle is overwritten, C<undef>d, or goes
241out of scope, the associated file is closed automatically.
242
c1441b10 243=over 4
244
245=head2 File characteristic options
246
247=over 2
248
249=item alq=INTEGER
250
251Sets the allocation quantity for this file
252
253=item bls=INTEGER
254
255File blocksize
256
257=item ctx=STRING
258
259Sets the context for the file. Takes one of these arguments:
260
261=over 4
262
263=item bin
264
265Disables LF to CRLF translation
266
267=item cvt
268
269Negates previous setting of C<ctx=noctx>
270
271=item nocvt
272
273Disables conversion of FORTRAN carriage control
274
275=item rec
276
277Force record-mode access
278
279=item stm
280
281Force stream mode
282
283=item xplct
284
285Causes records to be flushed I<only> when the file is closed, or when an
286explicit flush is done
287
288=back
289
290=item deq=INTEGER
291
292Sets the default extension quantity
293
294=item dna=FILESPEC
295
296Sets the default filename string. Used to fill in any missing pieces of the
297filename passed.
298
299=item fop=STRING
300
301File processing option. Takes one or more of the following (in a
302comma-separated list if there's more than one)
303
304=over 4
305
306=item ctg
307
308Contiguous.
309
310=item cbt
311
312Contiguous-best-try.
313
314=item dfw
315
316Deferred write; only applicable to files opened for shared access.
317
318=item dlt
319
320Delete file on close.
321
322=item tef
323
324Truncate at end-of-file.
325
326=item cif
327
328Create if nonexistent.
329
330=item sup
331
332Supersede.
333
334=item scf
335
336Submit as command file on close.
337
338=item spl
339
340Spool to system printer on close.
341
342=item tmd
343
344Temporary delete.
345
346=item tmp
347
348Temporary (no file directory).
349
350=item nef
351
352Not end-of-file.
353
354=item rck
355
356Read check compare operation.
357
358=item wck
359
360Write check compare operation.
361
362=item mxv
363
364Maximize version number.
365
366=item rwo
367
368Rewind file on open.
369
370=item pos
371
372Current position.
373
374=item rwc
375
376Rewind file on close.
377
378=item sqo
379
380File can only be processed in a sequential manner.
381
382=back
383
384=item fsz=INTEGER
385
386Fixed header size
387
388=item gbc=INTEGER
389
390Global buffers requested for the file
391
392=item mbc=INTEGER
393
394Multiblock count
395
396=item mbf=INTEGER
397
398Bultibuffer count
399
400=item mrs=INTEGER
401
402Maximum record size
403
404=item rat=STRING
405
406File record attributes. Takes one of the following:
407
408=over 4
409
410=item cr
411
412Carriage-return control.
413
414=item blk
415
416Disallow records to span block boundaries.
417
418=item ftn
419
420FORTRAN print control.
421
422=item none
423
424Explicitly forces no carriage control.
425
426=item prn
427
428Print file format.
429
430=back
431
432=item rfm=STRING
433
434File record format. Takes one of the following:
435
436=over 4
437
438=item fix
439
440Fixed-length record format.
441
442=item stm
443
444RMS stream record format.
445
446=item stmlf
447
448Stream format with line-feed terminator.
449
450=item stmcr
451
452Stream format with carriage-return terminator.
453
454=item var
455
456Variable-length record format.
457
458=item vfc
459
460Variable-length record with fixed control.
461
462=item udf
463
464Undefined format
465
466=back
467
468=item rop=STRING
469
470Record processing operations. Takes one or more of the following in a
471comma-separated list:
472
473=over 4
474
475=item asy
476
477Asynchronous I/O.
478
479=item cco
480
481Cancel Ctrl/O (used with Terminal I/O).
482
483=item cvt
484
485Capitalizes characters on a read from the terminal.
486
487=item eof
488
489Positions the record stream to the end-of-file for the connect operation
490only.
491
492=item nlk
493
494Do not lock record.
495
496=item pmt
497
498Enables use of the prompt specified by pmt=usr-prmpt on input from the
499terminal.
500
501=item pta
502
503Eliminates any information in the type-ahead buffer on a read from the
504terminal.
505
506=item rea
507
508Locks record for a read operation for this process, while allowing other
509accessors to read the record.
510
511=item rlk
512
513Locks record for write.
514
515=item rne
516
517Suppresses echoing of input data on the screen as it is entered on the
518keyboard.
519
520=item rnf
521
522Indicates that Ctrl/U, Ctrl/R, and DELETE are not to be considered control
523commands on terminal input, but are to be passed to the application
524program.
525
526=item rrl
527
528Reads regardless of lock.
529
530=item syncsts
531
532Returns success status of RMS$_SYNCH if the requested service completes its
533task immediately.
534
535=item tmo
536
537Timeout I/O.
538
539=item tpt
540
541Allows put/write services using sequential record access mode to occur at
542any point in the file, truncating the file at that point.
543
544=item ulk
545
546Prohibits RMS from automatically unlocking records.
547
548=item wat
549
550Wait until record is available, if currently locked by another stream.
551
552=item rah
553
554Read ahead.
555
556=item wbh
557
558Write behind.
559
560=back
561
562=item rtv=INTEGER
563
564The number of retrieval pointers that RMS has to maintain (0 to 127255)
565
566=item shr=STRING
567
568File sharing options. Choose one of the following:
569
570=over 4
571
572=item del
573
574Allows users to delete.
575
576=item get
577
578Allows users to read.
579
580=item mse
581
582Allows mainstream access.
583
584=item nil
585
586Prohibits file sharing.
587
588=item put
589
590Allows users to write.
591
592=item upd
593
594Allows users to update.
595
596=item upi
597
598Allows one or more writers.
599
600=back
601
602=item tmo=INTEGER
603
604I/O timeout value
605
606=back
607
608=back
609
0d7e20a5 610=item vmssysopen
611
612This function bears the same relationship to the CORE function
613C<sysopen> as C<vmsopen> does to C<open>. Its first three arguments
614are the name, access flags, and permissions for the file. Like
615C<vmsopen>, it takes up to 8 additional string arguments which
616specify file characteristics. Its return value is identical to
617that of C<vmsopen>.
618
619The symbolic constants for the mode argument are exported by
620VMS::Stdio by default, and are also exported by the Fcntl package.
621
622=item waitfh
623
624This function causes Perl to wait for the completion of an I/O
625operation on the file handle specified as its argument. It is
626used with handles opened for asynchronous I/O, and performs its
627task by calling the CRTL routine fwait().
748a9306 628
17f28c40 629=item writeof
630
631This function writes an EOF to a file handle, if the device driver
632supports this operation. Its primary use is to send an EOF to a
633subprocess through a pipe opened for writing without closing the
634pipe. It returns a true value if successful, and C<undef> if
635it encounters an error.
636
748a9306 637=head1 REVISION
638
c1441b10 639This document was last revised on 13-Oct-1998, for Perl 5.004, 5.005, and
ee8c7f54 6405.6.0.
748a9306 641
642=cut