This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
(NEXT|OPEN)STEP hints
[perl5.git] / vms / ext / Stdio / Stdio.pm
CommitLineData
0d7e20a5 1# VMS::Stdio - VMS extensions to Perl's stdio calls
748a9306
LW
2#
3# Author: Charles Bailey bailey@genetics.upenn.edu
ff0cee69 4# Version: 2.02
5# Revised: 15-Feb-1997
0d7e20a5 6
7package VMS::Stdio;
8
9require 5.002;
10use vars qw( $VERSION @EXPORT @EXPORT_OK %EXPORT_TAGS @ISA );
11use Carp '&croak';
12use DynaLoader ();
13use Exporter ();
14
ff0cee69 15$VERSION = '2.02';
740ce14c 16@ISA = qw( Exporter DynaLoader IO::File );
0d7e20a5 17@EXPORT = qw( &O_APPEND &O_CREAT &O_EXCL &O_NDELAY &O_NOWAIT
18 &O_RDONLY &O_RDWR &O_TRUNC &O_WRONLY );
19@EXPORT_OK = qw( &flush &getname &remove &rewind &sync &tmpnam
20 &vmsopen &vmssysopen &waitfh );
21%EXPORT_TAGS = ( CONSTANTS => [ qw( &O_APPEND &O_CREAT &O_EXCL &O_NDELAY
22 &O_NOWAIT &O_RDONLY &O_RDWR &O_TRUNC
23 &O_WRONLY ) ],
24 FUNCTIONS => [ qw( &flush &getname &remove &rewind &sync
25 &tmpnam &vmsopen &vmssysopen &waitfh ) ] );
26
27bootstrap VMS::Stdio $VERSION;
28
29sub AUTOLOAD {
30 my($constname) = $AUTOLOAD;
31 $constname =~ s/.*:://;
32 if ($constname =~ /^O_/) {
33 my($val) = constant($constname);
34 defined $val or croak("Unknown VMS::Stdio constant $constname");
5f05dabc 35 *$AUTOLOAD = sub { val; }
0d7e20a5 36 }
740ce14c 37 else { # We don't know about it; hand off to IO::File
38 require IO::File;
55497cff 39
5f05dabc 40 *$AUTOLOAD = eval "sub { shift->IO::File::$constname(\@_) }";
41 croak "Error autoloading IO::File::$constname: $@" if $@;
0d7e20a5 42 }
43 goto &$AUTOLOAD;
44}
45
46sub DESTROY { close($_[0]); }
47
48
49################################################################################
50# Intercept calls to old VMS::stdio package, complain, and hand off
51# This will be removed in a future version of VMS::Stdio
52
53package VMS::stdio;
54
55sub AUTOLOAD {
56 my($func) = $AUTOLOAD;
57 $func =~ s/.*:://;
58 # Cheap trick: we know DynaLoader has required Carp.pm
59 Carp::carp("Old package VMS::stdio is now VMS::Stdio; please update your code");
60 if ($func eq 'vmsfopen') {
61 Carp::carp("Old function &vmsfopen is now &vmsopen");
62 goto &VMS::Stdio::vmsopen;
63 }
64 elsif ($func eq 'fgetname') {
65 Carp::carp("Old function &fgetname is now &getname");
66 goto &VMS::Stdio::getname;
67 }
68 else { goto &{"VMS::Stdio::$func"}; }
69}
70
71package VMS::Stdio; # in case we ever use AutoLoader
72
731;
74
75__END__
748a9306
LW
76
77=head1 NAME
78
0d7e20a5 79VMS::Stdio
748a9306
LW
80
81=head1 SYNOPSIS
82
0d7e20a5 83use VMS::Stdio qw( &flush &getname &remove &rewind &sync &tmpnam
84 &vmsopen &vmssysopen &waitfh );
85$uniquename = tmpnam;
86$fh = vmsopen("my.file","rfm=var","alq=100",...) or die $!;
87$name = getname($fh);
88print $fh "Hello, world!\n";
89flush($fh);
90sync($fh);
91rewind($fh);
92$line = <$fh>;
93undef $fh; # closes file
94$fh = vmssysopen("another.file", O_RDONLY | O_NDELAY, 0, "ctx=bin");
95sysread($fh,$data,128);
96waitfh($fh);
97close($fh);
98remove("another.file");
748a9306
LW
99
100=head1 DESCRIPTION
101
0d7e20a5 102This package gives Perl scripts access to VMS extensions to several
103C stdio operations not available through Perl's CORE I/O functions.
104The specific routines are described below. These functions are
105prototyped as unary operators, with the exception of C<vmsopen>
106and C<vmssysopen>, which can take any number of arguments, and
107C<tmpnam>, which takes none.
108
109All of the routines are available for export, though none are
110exported by default. All of the constants used by C<vmssysopen>
111to specify access modes are exported by default. The routines
112are associated with the Exporter tag FUNCTIONS, and the constants
113are associated with the Exporter tag CONSTANTS, so you can more
114easily choose what you'd like to import:
115
116 # import constants, but not functions
117 use VMS::Stdio; # same as use VMS::Stdio qw( :DEFAULT );
118 # import functions, but not constants
119 use VMS::Stdio qw( !:CONSTANTS :FUNCTIONS );
120 # import both
121 use VMS::Stdio qw( :CONSTANTS :FUNCTIONS );
122 # import neither
123 use VMS::Stdio ();
124
125Of course, you can also choose to import specific functions by
126name, as usual.
127
740ce14c 128This package C<ISA> IO::File, so that you can call IO::File
0d7e20a5 129methods on the handles returned by C<vmsopen> and C<vmssysopen>.
740ce14c 130The IO::File package is not initialized, however, until you
0d7e20a5 131actually call a method that VMS::Stdio doesn't provide. This
132is doen to save startup time for users who don't wish to use
740ce14c 133the IO::File methods.
0d7e20a5 134
135B<Note:> In order to conform to naming conventions for Perl
136extensions and functions, the name of this package has been
137changed to VMS::Stdio as of Perl 5.002, and the names of some
138routines have been changed. Calls to the old VMS::stdio routines
139will generate a warning, and will be routed to the equivalent
140VMS::Stdio function. This compatibility interface will be
141removed in a future release of this extension, so please
142update your code to use the new routines.
143
144=item flush
145
146This function causes the contents of stdio buffers for the specified
147file handle to be flushed. If C<undef> is used as the argument to
148C<flush>, all currently open file handles are flushed. Like the CRTL
149fflush() routine, it does not flush any underlying RMS buffers for the
150file, so the data may not be flushed all the way to the disk. C<flush>
151returns a true value if successful, and C<undef> if not.
152
153=item getname
154
155The C<getname> function returns the file specification associated
740ce14c 156with a Perl I/O handle. If an error occurs, it returns C<undef>.
748a9306 157
0d7e20a5 158=item remove
748a9306 159
0d7e20a5 160This function deletes the file named in its argument, returning
161a true value if successful and C<undef> if not. It differs from
162the CORE Perl function C<unlink> in that it does not try to
163reset file protection if the original protection does not give
164you delete access to the file (cf. L<perlvms>). In other words,
165C<remove> is equivalent to
166
167 unlink($file) if VMS::Filespec::candelete($file);
748a9306 168
0d7e20a5 169=item rewind
170
171C<rewind> resets the current position of the specified file handle
172to the beginning of the file. It's really just a convenience
173method equivalent in effect to C<seek($fh,0,0)>. It returns a
174true value if successful, and C<undef> if it fails.
175
176=item sync
177
178This function flushes buffered data for the specified file handle
179from stdio and RMS buffers all the way to disk. If successful, it
180returns a true value; otherwise, it returns C<undef>.
181
182=item tmpnam
748a9306
LW
183
184The C<tmpnam> function returns a unique string which can be used
185as a filename when creating temporary files. If, for some
186reason, it is unable to generate a name, it returns C<undef>.
187
0d7e20a5 188=item vmsopen
748a9306 189
0d7e20a5 190The C<vmsopen> function enables you to specify optional RMS arguments
5f05dabc 191to the VMS CRTL when opening a file. Its operation is similar to the built-in
0d7e20a5 192Perl C<open> function (see L<perlfunc> for a complete description),
5f05dabc 193but it will only open normal files; it cannot open pipes or duplicate
740ce14c 194existing I/O handles. Up to 8 optional arguments may follow the
748a9306 195file name. These arguments should be strings which specify
0d7e20a5 196optional file characteristics as allowed by the CRTL. (See the
197CRTL reference manual description of creat() and fopen() for details.)
198If successful, C<vmsopen> returns a VMS::Stdio file handle; if an
199error occurs, it returns C<undef>.
200
5f05dabc 201You can use the file handle returned by C<vmsopen> just as you
0d7e20a5 202would any other Perl file handle. The class VMS::Stdio ISA
740ce14c 203IO::File, so you can call IO::File methods using the handle
0d7e20a5 204returned by C<vmsopen>. However, C<use>ing VMS::Stdio does not
740ce14c 205automatically C<use> IO::File; you must do so explicitly in
206your program if you want to call IO::File methods. This is
207done to avoid the overhead of initializing the IO::File package
0d7e20a5 208in programs which intend to use the handle returned by C<vmsopen>
209as a normal Perl file handle only. When the scalar containing
210a VMS::Stdio file handle is overwritten, C<undef>d, or goes
211out of scope, the associated file is closed automatically.
212
213=item vmssysopen
214
215This function bears the same relationship to the CORE function
216C<sysopen> as C<vmsopen> does to C<open>. Its first three arguments
217are the name, access flags, and permissions for the file. Like
218C<vmsopen>, it takes up to 8 additional string arguments which
219specify file characteristics. Its return value is identical to
220that of C<vmsopen>.
221
222The symbolic constants for the mode argument are exported by
223VMS::Stdio by default, and are also exported by the Fcntl package.
224
225=item waitfh
226
227This function causes Perl to wait for the completion of an I/O
228operation on the file handle specified as its argument. It is
229used with handles opened for asynchronous I/O, and performs its
230task by calling the CRTL routine fwait().
748a9306
LW
231
232=head1 REVISION
233
5f05dabc 234This document was last revised on 10-Dec-1996, for Perl 5.004.
748a9306
LW
235
236=cut