diff options
Diffstat (limited to 'upstream/mageia-cauldron/man3pm/File::Temp.3pm')
-rw-r--r-- | upstream/mageia-cauldron/man3pm/File::Temp.3pm | 1058 |
1 files changed, 1058 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man3pm/File::Temp.3pm b/upstream/mageia-cauldron/man3pm/File::Temp.3pm new file mode 100644 index 00000000..c65fc7ce --- /dev/null +++ b/upstream/mageia-cauldron/man3pm/File::Temp.3pm @@ -0,0 +1,1058 @@ +.\" -*- mode: troff; coding: utf-8 -*- +.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43) +.\" +.\" Standard preamble: +.\" ======================================================================== +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft CW +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. +.ie n \{\ +. ds C` "" +. ds C' "" +'br\} +.el\{\ +. ds C` +. ds C' +'br\} +.\" +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" +.\" If the F register is >0, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.\" +.\" Avoid warning from groff about undefined register 'F'. +.de IX +.. +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{\ +. if \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. if !\nF==2 \{\ +. nr % 0 +. nr F 2 +. \} +. \} +.\} +.rr rF +.\" ======================================================================== +.\" +.IX Title "File::Temp 3pm" +.TH File::Temp 3pm 2023-11-28 "perl v5.38.2" "Perl Programmers Reference Guide" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.if n .ad l +.nh +.SH NAME +File::Temp \- return name and handle of a temporary file safely +.SH VERSION +.IX Header "VERSION" +version 0.2311 +.SH SYNOPSIS +.IX Header "SYNOPSIS" +.Vb 1 +\& use File::Temp qw/ tempfile tempdir /; +\& +\& $fh = tempfile(); +\& ($fh, $filename) = tempfile(); +\& +\& ($fh, $filename) = tempfile( $template, DIR => $dir); +\& ($fh, $filename) = tempfile( $template, SUFFIX => \*(Aq.dat\*(Aq); +\& ($fh, $filename) = tempfile( $template, TMPDIR => 1 ); +\& +\& binmode( $fh, ":utf8" ); +\& +\& $dir = tempdir( CLEANUP => 1 ); +\& ($fh, $filename) = tempfile( DIR => $dir ); +.Ve +.PP +Object interface: +.PP +.Vb 3 +\& require File::Temp; +\& use File::Temp (); +\& use File::Temp qw/ :seekable /; +\& +\& $fh = File::Temp\->new(); +\& $fname = $fh\->filename; +\& +\& $fh = File::Temp\->new(TEMPLATE => $template); +\& $fname = $fh\->filename; +\& +\& $tmp = File::Temp\->new( UNLINK => 0, SUFFIX => \*(Aq.dat\*(Aq ); +\& print $tmp "Some data\en"; +\& print "Filename is $tmp\en"; +\& $tmp\->seek( 0, SEEK_END ); +\& +\& $dir = File::Temp\->newdir(); # CLEANUP => 1 by default +.Ve +.PP +The following interfaces are provided for compatibility with +existing APIs. They should not be used in new code. +.PP +MkTemp family: +.PP +.Vb 1 +\& use File::Temp qw/ :mktemp /; +\& +\& ($fh, $file) = mkstemp( "tmpfileXXXXX" ); +\& ($fh, $file) = mkstemps( "tmpfileXXXXXX", $suffix); +\& +\& $tmpdir = mkdtemp( $template ); +\& +\& $unopened_file = mktemp( $template ); +.Ve +.PP +POSIX functions: +.PP +.Vb 1 +\& use File::Temp qw/ :POSIX /; +\& +\& $file = tmpnam(); +\& $fh = tmpfile(); +\& +\& ($fh, $file) = tmpnam(); +.Ve +.PP +Compatibility functions: +.PP +.Vb 1 +\& $unopened_file = File::Temp::tempnam( $dir, $pfx ); +.Ve +.SH DESCRIPTION +.IX Header "DESCRIPTION" +\&\f(CW\*(C`File::Temp\*(C'\fR can be used to create and open temporary files in a safe +way. There is both a function interface and an object-oriented +interface. The File::Temp constructor or the \fBtempfile()\fR function can +be used to return the name and the open filehandle of a temporary +file. The \fBtempdir()\fR function can be used to create a temporary +directory. +.PP +The security aspect of temporary file creation is emphasized such that +a filehandle and filename are returned together. This helps guarantee +that a race condition can not occur where the temporary file is +created by another process between checking for the existence of the +file and its opening. Additional security levels are provided to +check, for example, that the sticky bit is set on world writable +directories. See "safe_level" for more information. +.PP +For compatibility with popular C library functions, Perl implementations of +the \fBmkstemp()\fR family of functions are provided. These are, \fBmkstemp()\fR, +\&\fBmkstemps()\fR, \fBmkdtemp()\fR and \fBmktemp()\fR. +.PP +Additionally, implementations of the standard POSIX +\&\fBtmpnam()\fR and \fBtmpfile()\fR functions are provided if required. +.PP +Implementations of \fBmktemp()\fR, \fBtmpnam()\fR, and \fBtempnam()\fR are provided, +but should be used with caution since they return only a filename +that was valid when function was called, so cannot guarantee +that the file will not exist by the time the caller opens the filename. +.PP +Filehandles returned by these functions support the seekable methods. +.SH "OBJECT-ORIENTED INTERFACE" +.IX Header "OBJECT-ORIENTED INTERFACE" +This is the primary interface for interacting with +\&\f(CW\*(C`File::Temp\*(C'\fR. Using the OO interface a temporary file can be created +when the object is constructed and the file can be removed when the +object is no longer required. +.PP +Note that there is no method to obtain the filehandle from the +\&\f(CW\*(C`File::Temp\*(C'\fR object. The object itself acts as a filehandle. The object +isa \f(CW\*(C`IO::Handle\*(C'\fR and isa \f(CW\*(C`IO::Seekable\*(C'\fR so all those methods are +available. +.PP +Also, the object is configured such that it stringifies to the name of the +temporary file and so can be compared to a filename directly. It numifies +to the \f(CW\*(C`refaddr\*(C'\fR the same as other handles and so can be compared to other +handles with \f(CW\*(C`==\*(C'\fR. +.PP +.Vb 2 +\& $fh eq $filename # as a string +\& $fh != \e*STDOUT # as a number +.Ve +.PP +Available since 0.14. +.IP \fBnew\fR 4 +.IX Item "new" +Create a temporary file object. +.Sp +.Vb 1 +\& my $tmp = File::Temp\->new(); +.Ve +.Sp +by default the object is constructed as if \f(CW\*(C`tempfile\*(C'\fR +was called without options, but with the additional behaviour +that the temporary file is removed by the object destructor +if UNLINK is set to true (the default). +.Sp +Supported arguments are the same as for \f(CW\*(C`tempfile\*(C'\fR: UNLINK +(defaulting to true), DIR, EXLOCK, PERMS and SUFFIX. +Additionally, the filename +template is specified using the TEMPLATE option. The OPEN option +is not supported (the file is always opened). +.Sp +.Vb 3 +\& $tmp = File::Temp\->new( TEMPLATE => \*(AqtempXXXXX\*(Aq, +\& DIR => \*(Aqmydir\*(Aq, +\& SUFFIX => \*(Aq.dat\*(Aq); +.Ve +.Sp +Arguments are case insensitive. +.Sp +Can call \fBcroak()\fR if an error occurs. +.Sp +Available since 0.14. +.Sp +TEMPLATE available since 0.23 +.IP \fBnewdir\fR 4 +.IX Item "newdir" +Create a temporary directory using an object oriented interface. +.Sp +.Vb 1 +\& $dir = File::Temp\->newdir(); +.Ve +.Sp +By default the directory is deleted when the object goes out of scope. +.Sp +Supports the same options as the \f(CW\*(C`tempdir\*(C'\fR function. Note that directories +created with this method default to CLEANUP => 1. +.Sp +.Vb 1 +\& $dir = File::Temp\->newdir( $template, %options ); +.Ve +.Sp +A template may be specified either with a leading template or +with a TEMPLATE argument. +.Sp +Available since 0.19. +.Sp +TEMPLATE available since 0.23. +.IP \fBfilename\fR 4 +.IX Item "filename" +Return the name of the temporary file associated with this object +(if the object was created using the "new" constructor). +.Sp +.Vb 1 +\& $filename = $tmp\->filename; +.Ve +.Sp +This method is called automatically when the object is used as +a string. +.Sp +Current API available since 0.14 +.IP \fBdirname\fR 4 +.IX Item "dirname" +Return the name of the temporary directory associated with this +object (if the object was created using the "newdir" constructor). +.Sp +.Vb 1 +\& $dirname = $tmpdir\->dirname; +.Ve +.Sp +This method is called automatically when the object is used in string context. +.IP \fBunlink_on_destroy\fR 4 +.IX Item "unlink_on_destroy" +Control whether the file is unlinked when the object goes out of scope. +The file is removed if this value is true and \f(CW$KEEP_ALL\fR is not. +.Sp +.Vb 1 +\& $fh\->unlink_on_destroy( 1 ); +.Ve +.Sp +Default is for the file to be removed. +.Sp +Current API available since 0.15 +.IP \fBDESTROY\fR 4 +.IX Item "DESTROY" +When the object goes out of scope, the destructor is called. This +destructor will attempt to unlink the file (using unlink1) +if the constructor was called with UNLINK set to 1 (the default state +if UNLINK is not specified). +.Sp +No error is given if the unlink fails. +.Sp +If the object has been passed to a child process during a fork, the +file will be deleted when the object goes out of scope in the parent. +.Sp +For a temporary directory object the directory will be removed unless +the CLEANUP argument was used in the constructor (and set to false) or +\&\f(CW\*(C`unlink_on_destroy\*(C'\fR was modified after creation. Note that if a temp +directory is your current directory, it cannot be removed \- a warning +will be given in this case. \f(CWchdir()\fR out of the directory before +letting the object go out of scope. +.Sp +If the global variable \f(CW$KEEP_ALL\fR is true, the file or directory +will not be removed. +.SH FUNCTIONS +.IX Header "FUNCTIONS" +This section describes the recommended interface for generating +temporary files and directories. +.IP \fBtempfile\fR 4 +.IX Item "tempfile" +This is the basic function to generate temporary files. +The behaviour of the file can be changed using various options: +.Sp +.Vb 2 +\& $fh = tempfile(); +\& ($fh, $filename) = tempfile(); +.Ve +.Sp +Create a temporary file in the directory specified for temporary +files, as specified by the \fBtmpdir()\fR function in File::Spec. +.Sp +.Vb 1 +\& ($fh, $filename) = tempfile($template); +.Ve +.Sp +Create a temporary file in the current directory using the supplied +template. Trailing `X' characters are replaced with random letters to +generate the filename. At least four `X' characters must be present +at the end of the template. +.Sp +.Vb 1 +\& ($fh, $filename) = tempfile($template, SUFFIX => $suffix) +.Ve +.Sp +Same as previously, except that a suffix is added to the template +after the `X' translation. Useful for ensuring that a temporary +filename has a particular extension when needed by other applications. +But see the WARNING at the end. +.Sp +.Vb 1 +\& ($fh, $filename) = tempfile($template, DIR => $dir); +.Ve +.Sp +Translates the template as before except that a directory name +is specified. +.Sp +.Vb 1 +\& ($fh, $filename) = tempfile($template, TMPDIR => 1); +.Ve +.Sp +Equivalent to specifying a DIR of "File::Spec\->tmpdir", writing the file +into the same temporary directory as would be used if no template was +specified at all. +.Sp +.Vb 1 +\& ($fh, $filename) = tempfile($template, UNLINK => 1); +.Ve +.Sp +Return the filename and filehandle as before except that the file is +automatically removed when the program exits (dependent on +\&\f(CW$KEEP_ALL\fR). Default is for the file to be removed if a file handle is +requested and to be kept if the filename is requested. In a scalar +context (where no filename is returned) the file is always deleted +either (depending on the operating system) on exit or when it is +closed (unless \f(CW$KEEP_ALL\fR is true when the temp file is created). +.Sp +Use the object-oriented interface if fine-grained control of when +a file is removed is required. +.Sp +If the template is not specified, a template is always +automatically generated. This temporary file is placed in \fBtmpdir()\fR +(File::Spec) unless a directory is specified explicitly with the +DIR option. +.Sp +.Vb 1 +\& $fh = tempfile( DIR => $dir ); +.Ve +.Sp +If called in scalar context, only the filehandle is returned and the +file will automatically be deleted when closed on operating systems +that support this (see the description of \fBtmpfile()\fR elsewhere in this +document). This is the preferred mode of operation, as if you only +have a filehandle, you can never create a race condition by fumbling +with the filename. On systems that can not unlink an open file or can +not mark a file as temporary when it is opened (for example, Windows +NT uses the \f(CW\*(C`O_TEMPORARY\*(C'\fR flag) the file is marked for deletion when +the program ends (equivalent to setting UNLINK to 1). The \f(CW\*(C`UNLINK\*(C'\fR +flag is ignored if present. +.Sp +.Vb 1 +\& (undef, $filename) = tempfile($template, OPEN => 0); +.Ve +.Sp +This will return the filename based on the template but +will not open this file. Cannot be used in conjunction with +UNLINK set to true. Default is to always open the file +to protect from possible race conditions. A warning is issued +if warnings are turned on. Consider using the \fBtmpnam()\fR +and \fBmktemp()\fR functions described elsewhere in this document +if opening the file is not required. +.Sp +To open the temporary filehandle with O_EXLOCK (open with exclusive +file lock) use \f(CW\*(C`EXLOCK=>1\*(C'\fR. This is supported only by some +operating systems (most notably BSD derived systems). By default +EXLOCK will be false. Former \f(CW\*(C`File::Temp\*(C'\fR versions set EXLOCK to +true, so to be sure to get an unlocked filehandle also with older +versions, explicitly set \f(CW\*(C`EXLOCK=>0\*(C'\fR. +.Sp +.Vb 1 +\& ($fh, $filename) = tempfile($template, EXLOCK => 1); +.Ve +.Sp +By default, the temp file is created with 0600 file permissions. +Use \f(CW\*(C`PERMS\*(C'\fR to change this: +.Sp +.Vb 1 +\& ($fh, $filename) = tempfile($template, PERMS => 0666); +.Ve +.Sp +Options can be combined as required. +.Sp +Will \fBcroak()\fR if there is an error. +.Sp +Available since 0.05. +.Sp +UNLINK flag available since 0.10. +.Sp +TMPDIR flag available since 0.19. +.Sp +EXLOCK flag available since 0.19. +.Sp +PERMS flag available since 0.2310. +.IP \fBtempdir\fR 4 +.IX Item "tempdir" +This is the recommended interface for creation of temporary +directories. By default the directory will not be removed on exit +(that is, it won't be temporary; this behaviour can not be changed +because of issues with backwards compatibility). To enable removal +either use the CLEANUP option which will trigger removal on program +exit, or consider using the "newdir" method in the object interface which +will allow the directory to be cleaned up when the object goes out of +scope. +.Sp +The behaviour of the function depends on the arguments: +.Sp +.Vb 1 +\& $tempdir = tempdir(); +.Ve +.Sp +Create a directory in \fBtmpdir()\fR (see File::Spec). +.Sp +.Vb 1 +\& $tempdir = tempdir( $template ); +.Ve +.Sp +Create a directory from the supplied template. This template is +similar to that described for \fBtempfile()\fR. `X' characters at the end +of the template are replaced with random letters to construct the +directory name. At least four `X' characters must be in the template. +.Sp +.Vb 1 +\& $tempdir = tempdir ( DIR => $dir ); +.Ve +.Sp +Specifies the directory to use for the temporary directory. +The temporary directory name is derived from an internal template. +.Sp +.Vb 1 +\& $tempdir = tempdir ( $template, DIR => $dir ); +.Ve +.Sp +Prepend the supplied directory name to the template. The template +should not include parent directory specifications itself. Any parent +directory specifications are removed from the template before +prepending the supplied directory. +.Sp +.Vb 1 +\& $tempdir = tempdir ( $template, TMPDIR => 1 ); +.Ve +.Sp +Using the supplied template, create the temporary directory in +a standard location for temporary files. Equivalent to doing +.Sp +.Vb 1 +\& $tempdir = tempdir ( $template, DIR => File::Spec\->tmpdir); +.Ve +.Sp +but shorter. Parent directory specifications are stripped from the +template itself. The \f(CW\*(C`TMPDIR\*(C'\fR option is ignored if \f(CW\*(C`DIR\*(C'\fR is set +explicitly. Additionally, \f(CW\*(C`TMPDIR\*(C'\fR is implied if neither a template +nor a directory are supplied. +.Sp +.Vb 1 +\& $tempdir = tempdir( $template, CLEANUP => 1); +.Ve +.Sp +Create a temporary directory using the supplied template, but +attempt to remove it (and all files inside it) when the program +exits. Note that an attempt will be made to remove all files from +the directory even if they were not created by this module (otherwise +why ask to clean it up?). The directory removal is made with +the \fBrmtree()\fR function from the File::Path module. +Of course, if the template is not specified, the temporary directory +will be created in \fBtmpdir()\fR and will also be removed at program exit. +.Sp +Will \fBcroak()\fR if there is an error. +.Sp +Current API available since 0.05. +.SH "MKTEMP FUNCTIONS" +.IX Header "MKTEMP FUNCTIONS" +The following functions are Perl implementations of the +\&\fBmktemp()\fR family of temp file generation system calls. +.IP \fBmkstemp\fR 4 +.IX Item "mkstemp" +Given a template, returns a filehandle to the temporary file and the name +of the file. +.Sp +.Vb 1 +\& ($fh, $name) = mkstemp( $template ); +.Ve +.Sp +In scalar context, just the filehandle is returned. +.Sp +The template may be any filename with some number of X's appended +to it, for example \fI/tmp/temp.XXXX\fR. The trailing X's are replaced +with unique alphanumeric combinations. +.Sp +Will \fBcroak()\fR if there is an error. +.Sp +Current API available since 0.05. +.IP \fBmkstemps\fR 4 +.IX Item "mkstemps" +Similar to \fBmkstemp()\fR, except that an extra argument can be supplied +with a suffix to be appended to the template. +.Sp +.Vb 1 +\& ($fh, $name) = mkstemps( $template, $suffix ); +.Ve +.Sp +For example a template of \f(CW\*(C`testXXXXXX\*(C'\fR and suffix of \f(CW\*(C`.dat\*(C'\fR +would generate a file similar to \fItesthGji_w.dat\fR. +.Sp +Returns just the filehandle alone when called in scalar context. +.Sp +Will \fBcroak()\fR if there is an error. +.Sp +Current API available since 0.05. +.IP \fBmkdtemp\fR 4 +.IX Item "mkdtemp" +Create a directory from a template. The template must end in +X's that are replaced by the routine. +.Sp +.Vb 1 +\& $tmpdir_name = mkdtemp($template); +.Ve +.Sp +Returns the name of the temporary directory created. +.Sp +Directory must be removed by the caller. +.Sp +Will \fBcroak()\fR if there is an error. +.Sp +Current API available since 0.05. +.IP \fBmktemp\fR 4 +.IX Item "mktemp" +Returns a valid temporary filename but does not guarantee +that the file will not be opened by someone else. +.Sp +.Vb 1 +\& $unopened_file = mktemp($template); +.Ve +.Sp +Template is the same as that required by \fBmkstemp()\fR. +.Sp +Will \fBcroak()\fR if there is an error. +.Sp +Current API available since 0.05. +.SH "POSIX FUNCTIONS" +.IX Header "POSIX FUNCTIONS" +This section describes the re-implementation of the \fBtmpnam()\fR +and \fBtmpfile()\fR functions described in POSIX +using the \fBmkstemp()\fR from this module. +.PP +Unlike the POSIX implementations, the directory used +for the temporary file is not specified in a system include +file (\f(CW\*(C`P_tmpdir\*(C'\fR) but simply depends on the choice of \fBtmpdir()\fR +returned by File::Spec. On some implementations this +location can be set using the \f(CW\*(C`TMPDIR\*(C'\fR environment variable, which +may not be secure. +If this is a problem, simply use \fBmkstemp()\fR and specify a template. +.IP \fBtmpnam\fR 4 +.IX Item "tmpnam" +When called in scalar context, returns the full name (including path) +of a temporary file (uses \fBmktemp()\fR). The only check is that the file does +not already exist, but there is no guarantee that that condition will +continue to apply. +.Sp +.Vb 1 +\& $file = tmpnam(); +.Ve +.Sp +When called in list context, a filehandle to the open file and +a filename are returned. This is achieved by calling \fBmkstemp()\fR +after constructing a suitable template. +.Sp +.Vb 1 +\& ($fh, $file) = tmpnam(); +.Ve +.Sp +If possible, this form should be used to prevent possible +race conditions. +.Sp +See "tmpdir" in File::Spec for information on the choice of temporary +directory for a particular operating system. +.Sp +Will \fBcroak()\fR if there is an error. +.Sp +Current API available since 0.05. +.IP \fBtmpfile\fR 4 +.IX Item "tmpfile" +Returns the filehandle of a temporary file. +.Sp +.Vb 1 +\& $fh = tmpfile(); +.Ve +.Sp +The file is removed when the filehandle is closed or when the program +exits. No access to the filename is provided. +.Sp +If the temporary file can not be created undef is returned. +Currently this command will probably not work when the temporary +directory is on an NFS file system. +.Sp +Will \fBcroak()\fR if there is an error. +.Sp +Available since 0.05. +.Sp +Returning undef if unable to create file added in 0.12. +.SH "ADDITIONAL FUNCTIONS" +.IX Header "ADDITIONAL FUNCTIONS" +These functions are provided for backwards compatibility +with common tempfile generation C library functions. +.PP +They are not exported and must be addressed using the full package +name. +.IP \fBtempnam\fR 4 +.IX Item "tempnam" +Return the name of a temporary file in the specified directory +using a prefix. The file is guaranteed not to exist at the time +the function was called, but such guarantees are good for one +clock tick only. Always use the proper form of \f(CW\*(C`sysopen\*(C'\fR +with \f(CW\*(C`O_CREAT | O_EXCL\*(C'\fR if you must open such a filename. +.Sp +.Vb 1 +\& $filename = File::Temp::tempnam( $dir, $prefix ); +.Ve +.Sp +Equivalent to running \fBmktemp()\fR with \f(CW$dir\fR/$prefixXXXXXXXX +(using unix file convention as an example) +.Sp +Because this function uses \fBmktemp()\fR, it can suffer from race conditions. +.Sp +Will \fBcroak()\fR if there is an error. +.Sp +Current API available since 0.05. +.SH "UTILITY FUNCTIONS" +.IX Header "UTILITY FUNCTIONS" +Useful functions for dealing with the filehandle and filename. +.IP \fBunlink0\fR 4 +.IX Item "unlink0" +Given an open filehandle and the associated filename, make a safe +unlink. This is achieved by first checking that the filename and +filehandle initially point to the same file and that the number of +links to the file is 1 (all fields returned by \fBstat()\fR are compared). +Then the filename is unlinked and the filehandle checked once again to +verify that the number of links on that file is now 0. This is the +closest you can come to making sure that the filename unlinked was the +same as the file whose descriptor you hold. +.Sp +.Vb 2 +\& unlink0($fh, $path) +\& or die "Error unlinking file $path safely"; +.Ve +.Sp +Returns false on error but \fBcroaks()\fR if there is a security +anomaly. The filehandle is not closed since on some occasions this is +not required. +.Sp +On some platforms, for example Windows NT, it is not possible to +unlink an open file (the file must be closed first). On those +platforms, the actual unlinking is deferred until the program ends and +good status is returned. A check is still performed to make sure that +the filehandle and filename are pointing to the same thing (but not at +the time the end block is executed since the deferred removal may not +have access to the filehandle). +.Sp +Additionally, on Windows NT not all the fields returned by \fBstat()\fR can +be compared. For example, the \f(CW\*(C`dev\*(C'\fR and \f(CW\*(C`rdev\*(C'\fR fields seem to be +different. Also, it seems that the size of the file returned by \fBstat()\fR +does not always agree, with \f(CWstat(FH)\fR being more accurate than +\&\f(CWstat(filename)\fR, presumably because of caching issues even when +using autoflush (this is usually overcome by waiting a while after +writing to the tempfile before attempting to \f(CW\*(C`unlink0\*(C'\fR it). +.Sp +Finally, on NFS file systems the link count of the file handle does +not always go to zero immediately after unlinking. Currently, this +command is expected to fail on NFS disks. +.Sp +This function is disabled if the global variable \f(CW$KEEP_ALL\fR is true +and an unlink on open file is supported. If the unlink is to be deferred +to the END block, the file is still registered for removal. +.Sp +This function should not be called if you are using the object oriented +interface since the it will interfere with the object destructor deleting +the file. +.Sp +Available Since 0.05. +.Sp +If can not unlink open file, defer removal until later available since 0.06. +.IP \fBcmpstat\fR 4 +.IX Item "cmpstat" +Compare \f(CW\*(C`stat\*(C'\fR of filehandle with \f(CW\*(C`stat\*(C'\fR of provided filename. This +can be used to check that the filename and filehandle initially point +to the same file and that the number of links to the file is 1 (all +fields returned by \fBstat()\fR are compared). +.Sp +.Vb 2 +\& cmpstat($fh, $path) +\& or die "Error comparing handle with file"; +.Ve +.Sp +Returns false if the stat information differs or if the link count is +greater than 1. Calls croak if there is a security anomaly. +.Sp +On certain platforms, for example Windows, not all the fields returned by \fBstat()\fR +can be compared. For example, the \f(CW\*(C`dev\*(C'\fR and \f(CW\*(C`rdev\*(C'\fR fields seem to be +different in Windows. Also, it seems that the size of the file +returned by \fBstat()\fR does not always agree, with \f(CWstat(FH)\fR being more +accurate than \f(CWstat(filename)\fR, presumably because of caching issues +even when using autoflush (this is usually overcome by waiting a while +after writing to the tempfile before attempting to \f(CW\*(C`unlink0\*(C'\fR it). +.Sp +Not exported by default. +.Sp +Current API available since 0.14. +.IP \fBunlink1\fR 4 +.IX Item "unlink1" +Similar to \f(CW\*(C`unlink0\*(C'\fR except after file comparison using cmpstat, the +filehandle is closed prior to attempting to unlink the file. This +allows the file to be removed without using an END block, but does +mean that the post-unlink comparison of the filehandle state provided +by \f(CW\*(C`unlink0\*(C'\fR is not available. +.Sp +.Vb 2 +\& unlink1($fh, $path) +\& or die "Error closing and unlinking file"; +.Ve +.Sp +Usually called from the object destructor when using the OO interface. +.Sp +Not exported by default. +.Sp +This function is disabled if the global variable \f(CW$KEEP_ALL\fR is true. +.Sp +Can call \fBcroak()\fR if there is a security anomaly during the \fBstat()\fR +comparison. +.Sp +Current API available since 0.14. +.IP \fBcleanup\fR 4 +.IX Item "cleanup" +Calling this function will cause any temp files or temp directories +that are registered for removal to be removed. This happens automatically +when the process exits but can be triggered manually if the caller is sure +that none of the temp files are required. This method can be registered as +an Apache callback. +.Sp +Note that if a temp directory is your current directory, it cannot be +removed. \f(CWchdir()\fR out of the directory first before calling +\&\f(CWcleanup()\fR. (For the cleanup at program exit when the CLEANUP flag +is set, this happens automatically.) +.Sp +On OSes where temp files are automatically removed when the temp file +is closed, calling this function will have no effect other than to remove +temporary directories (which may include temporary files). +.Sp +.Vb 1 +\& File::Temp::cleanup(); +.Ve +.Sp +Not exported by default. +.Sp +Current API available since 0.15. +.SH "PACKAGE VARIABLES" +.IX Header "PACKAGE VARIABLES" +These functions control the global state of the package. +.IP \fBsafe_level\fR 4 +.IX Item "safe_level" +Controls the lengths to which the module will go to check the safety of the +temporary file or directory before proceeding. +Options are: +.RS 4 +.IP STANDARD 8 +.IX Item "STANDARD" +Do the basic security measures to ensure the directory exists and is +writable, that temporary files are opened only if they do not already +exist, and that possible race conditions are avoided. Finally the +unlink0 function is used to remove files safely. +.IP MEDIUM 8 +.IX Item "MEDIUM" +In addition to the STANDARD security, the output directory is checked +to make sure that it is owned either by root or the user running the +program. If the directory is writable by group or by other, it is then +checked to make sure that the sticky bit is set. +.Sp +Will not work on platforms that do not support the \f(CW\*(C`\-k\*(C'\fR test +for sticky bit. +.IP HIGH 8 +.IX Item "HIGH" +In addition to the MEDIUM security checks, also check for the +possibility of ``\fBchown()\fR giveaway'' using the POSIX +\&\fBsysconf()\fR function. If this is a possibility, each directory in the +path is checked in turn for safeness, recursively walking back to the +root directory. +.Sp +For platforms that do not support the POSIX +\&\f(CW\*(C`_PC_CHOWN_RESTRICTED\*(C'\fR symbol (for example, Windows NT) it is +assumed that ``\fBchown()\fR giveaway'' is possible and the recursive test +is performed. +.RE +.RS 4 +.Sp +The level can be changed as follows: +.Sp +.Vb 1 +\& File::Temp\->safe_level( File::Temp::HIGH ); +.Ve +.Sp +The level constants are not exported by the module. +.Sp +Currently, you must be running at least perl v5.6.0 in order to +run with MEDIUM or HIGH security. This is simply because the +safety tests use functions from Fcntl that are not +available in older versions of perl. The problem is that the version +number for Fcntl is the same in perl 5.6.0 and in 5.005_03 even though +they are different versions. +.Sp +On systems that do not support the HIGH or MEDIUM safety levels +(for example Win NT or OS/2) any attempt to change the level will +be ignored. The decision to ignore rather than raise an exception +allows portable programs to be written with high security in mind +for the systems that can support this without those programs failing +on systems where the extra tests are irrelevant. +.Sp +If you really need to see whether the change has been accepted +simply examine the return value of \f(CW\*(C`safe_level\*(C'\fR. +.Sp +.Vb 3 +\& $newlevel = File::Temp\->safe_level( File::Temp::HIGH ); +\& die "Could not change to high security" +\& if $newlevel != File::Temp::HIGH; +.Ve +.Sp +Available since 0.05. +.RE +.IP TopSystemUID 4 +.IX Item "TopSystemUID" +This is the highest UID on the current system that refers to a root +UID. This is used to make sure that the temporary directory is +owned by a system UID (\f(CW\*(C`root\*(C'\fR, \f(CW\*(C`bin\*(C'\fR, \f(CW\*(C`sys\*(C'\fR etc) rather than +simply by root. +.Sp +This is required since on many unix systems \f(CW\*(C`/tmp\*(C'\fR is not owned +by root. +.Sp +Default is to assume that any UID less than or equal to 10 is a root +UID. +.Sp +.Vb 2 +\& File::Temp\->top_system_uid(10); +\& my $topid = File::Temp\->top_system_uid; +.Ve +.Sp +This value can be adjusted to reduce security checking if required. +The value is only relevant when \f(CW\*(C`safe_level\*(C'\fR is set to MEDIUM or higher. +.Sp +Available since 0.05. +.ie n .IP \fR\fB$KEEP_ALL\fR\fB\fR 4 +.el .IP \fR\f(CB$KEEP_ALL\fR\fB\fR 4 +.IX Item "$KEEP_ALL" +Controls whether temporary files and directories should be retained +regardless of any instructions in the program to remove them +automatically. This is useful for debugging but should not be used in +production code. +.Sp +.Vb 1 +\& $File::Temp::KEEP_ALL = 1; +.Ve +.Sp +Default is for files to be removed as requested by the caller. +.Sp +In some cases, files will only be retained if this variable is true +when the file is created. This means that you can not create a temporary +file, set this variable and expect the temp file to still be around +when the program exits. +.ie n .IP \fR\fB$DEBUG\fR\fB\fR 4 +.el .IP \fR\f(CB$DEBUG\fR\fB\fR 4 +.IX Item "$DEBUG" +Controls whether debugging messages should be enabled. +.Sp +.Vb 1 +\& $File::Temp::DEBUG = 1; +.Ve +.Sp +Default is for debugging mode to be disabled. +.Sp +Available since 0.15. +.SH WARNING +.IX Header "WARNING" +For maximum security, endeavour always to avoid ever looking at, +touching, or even imputing the existence of the filename. You do not +know that that filename is connected to the same file as the handle +you have, and attempts to check this can only trigger more race +conditions. It's far more secure to use the filehandle alone and +dispense with the filename altogether. +.PP +If you need to pass the handle to something that expects a filename +then on a unix system you can use \f(CW\*(C`"/dev/fd/" . fileno($fh)\*(C'\fR for +arbitrary programs. Perl code that uses the 2\-argument version of +\&\f(CW\*(C`open\*(C'\fR can be passed \f(CW\*(C`"+<=&" . fileno($fh)\*(C'\fR. Otherwise you +will need to pass the filename. You will have to clear the +close-on-exec bit on that file descriptor before passing it to another +process. +.PP +.Vb 3 +\& use Fcntl qw/F_SETFD F_GETFD/; +\& fcntl($tmpfh, F_SETFD, 0) +\& or die "Can\*(Aqt clear close\-on\-exec flag on temp fh: $!\en"; +.Ve +.SS "Temporary files and NFS" +.IX Subsection "Temporary files and NFS" +Some problems are associated with using temporary files that reside +on NFS file systems and it is recommended that a local filesystem +is used whenever possible. Some of the security tests will most probably +fail when the temp file is not local. Additionally, be aware that +the performance of I/O operations over NFS will not be as good as for +a local disk. +.SS Forking +.IX Subsection "Forking" +In some cases files created by File::Temp are removed from within an +END block. Since END blocks are triggered when a child process exits +(unless \f(CWPOSIX::_exit()\fR is used by the child) File::Temp takes care +to only remove those temp files created by a particular process ID. This +means that a child will not attempt to remove temp files created by the +parent process. +.PP +If you are forking many processes in parallel that are all creating +temporary files, you may need to reset the random number seed using +srand(EXPR) in each child else all the children will attempt to walk +through the same set of random file names and may well cause +themselves to give up if they exceed the number of retry attempts. +.SS "Directory removal" +.IX Subsection "Directory removal" +Note that if you have chdir'ed into the temporary directory and it is +subsequently cleaned up (either in the END block or as part of object +destruction), then you will get a warning from \fBFile::Path::rmtree()\fR. +.SS "Taint mode" +.IX Subsection "Taint mode" +If you need to run code under taint mode, updating to the latest +File::Spec is highly recommended. On Windows, if the directory +given by File::Spec::tmpdir isn't writable, File::Temp will attempt +to fallback to the user's local application data directory or croak +with an error. +.SS BINMODE +.IX Subsection "BINMODE" +The file returned by File::Temp will have been opened in binary mode +if such a mode is available. If that is not correct, use the \f(CWbinmode()\fR +function to change the mode of the filehandle. +.PP +Note that you can modify the encoding of a file opened by File::Temp +also by using \f(CWbinmode()\fR. +.SH HISTORY +.IX Header "HISTORY" +Originally began life in May 1999 as an XS interface to the system +\&\fBmkstemp()\fR function. In March 2000, the OpenBSD \fBmkstemp()\fR code was +translated to Perl for total control of the code's +security checking, to ensure the presence of the function regardless of +operating system and to help with portability. The module was shipped +as a standard part of perl from v5.6.1. +.PP +Thanks to Tom Christiansen for suggesting that this module +should be written and providing ideas for code improvements and +security enhancements. +.SH "SEE ALSO" +.IX Header "SEE ALSO" +"tmpnam" in POSIX, "tmpfile" in POSIX, File::Spec, File::Path +.PP +See IO::File and File::MkTemp, Apache::TempFile for +different implementations of temporary file handling. +.PP +See File::Tempdir for an alternative object-oriented wrapper for +the \f(CW\*(C`tempdir\*(C'\fR function. +.SH SUPPORT +.IX Header "SUPPORT" +Bugs may be submitted through the RT bug tracker <https://rt.cpan.org/Public/Dist/Display.html?Name=File-Temp> +(or bug\-File\-Temp@rt.cpan.org <mailto:bug-File-Temp@rt.cpan.org>). +.PP +There is also a mailing list available for users of this distribution, at +<http://lists.perl.org/list/cpan\-workers.html>. +.PP +There is also an irc channel available for users of this distribution, at +\&\f(CW\*(C`#toolchain\*(C'\fR on \f(CW\*(C`irc.perl.org\*(C'\fR <irc://irc.perl.org/#toolchain>. +.SH AUTHOR +.IX Header "AUTHOR" +Tim Jenness <tjenness@cpan.org> +.SH CONTRIBUTORS +.IX Header "CONTRIBUTORS" +.IP \(bu 4 +Tim Jenness <t.jenness@jach.hawaii.edu> +.IP \(bu 4 +Karen Etheridge <ether@cpan.org> +.IP \(bu 4 +David Golden <dagolden@cpan.org> +.IP \(bu 4 +Slaven Rezic <srezic@cpan.org> +.IP \(bu 4 +mohawk2 <mohawk2@users.noreply.github.com> +.IP \(bu 4 +Roy Ivy III <rivy.dev@gmail.com> +.IP \(bu 4 +Peter Rabbitson <ribasushi@cpan.org> +.IP \(bu 4 +Olivier Mengué <dolmen@cpan.org> +.IP \(bu 4 +Peter John Acklam <pjacklam@online.no> +.IP \(bu 4 +Tim Gim Yee <tim.gim.yee@gmail.com> +.IP \(bu 4 +Nicolas R <atoomic@cpan.org> +.IP \(bu 4 +Brian Mowrey <brian@drlabs.org> +.IP \(bu 4 +Dagfinn Ilmari MannsÄker <ilmari@ilmari.org> +.IP \(bu 4 +David Steinbrunner <dsteinbrunner@pobox.com> +.IP \(bu 4 +Ed Avis <eda@linux01.wcl.local> +.IP \(bu 4 +Guillem Jover <guillem@hadrons.org> +.IP \(bu 4 +James E. Keenan <jkeen@verizon.net> +.IP \(bu 4 +Kevin Ryde <user42@zip.com.au> +.IP \(bu 4 +Ben Tilly <btilly@gmail.com> +.SH "COPYRIGHT AND LICENSE" +.IX Header "COPYRIGHT AND LICENSE" +This software is copyright (c) 2020 by Tim Jenness and the UK Particle Physics and Astronomy Research Council. +.PP +This is free software; you can redistribute it and/or modify it under +the same terms as the Perl 5 programming language system itself. |