File Coverage

blib/lib/File/Util/Tempdir.pm
Criterion Covered Total %
statement 28 35 80.0
branch 16 26 61.5
condition 7 9 77.7
subroutine 5 5 100.0
pod 2 2 100.0
total 58 77 75.3


line stmt bran cond sub pod time code
1             package File::Util::Tempdir;
2              
3             our $DATE = '2018-09-22'; # DATE
4             our $VERSION = '0.034'; # VERSION
5              
6 1     1   91276 use strict;
  1         12  
  1         29  
7 1     1   4 use warnings;
  1         3  
  1         28  
8              
9 1     1   4 use Exporter qw(import);
  1         3  
  1         391  
10             our @EXPORT_OK = qw(get_tempdir get_user_tempdir);
11              
12             sub get_tempdir {
13 6 50   6 1 1253 if ($^O eq 'MSWin32') {
14 0         0 for (qw/TMP TEMP TMPDIR TEMPDIR/) {
15 0 0       0 return $ENV{$_} if defined $ENV{$_};
16             }
17 0         0 for ("C:\\TMP", "C:\\TEMP") {
18 0 0       0 return $_ if -d;
19             }
20             } else {
21 6         13 for (qw/TMPDIR TEMPDIR TMP TEMP/) {
22 12 100       38 return $ENV{$_} if defined $ENV{$_};
23             }
24 2         5 for ("/tmp", "/var/tmp") {
25 2 50       93 return $_ if -d;
26             }
27             }
28 0         0 die "Can't find any temporary directory";
29             }
30              
31             sub get_user_tempdir {
32 9 50   9 1 6944 if ($^O eq 'MSWin32') {
33 0         0 return get_tempdir();
34             } else {
35             my $dir = $ENV{XDG_RUNTIME_DIR} ?
36 9 100       29 $ENV{XDG_RUNTIME_DIR} : get_tempdir();
37 9         113 my @st = stat($dir);
38 9 50       33 die "Can't stat tempdir '$dir': $!" unless @st;
39 9 100 100     89 return $dir if $st[4] == $> && !($st[2] & 022);
40 7         16 my $i = 0;
41 7         12 while (1) {
42 11 100       73 my $subdir = "$dir/$>" . ($i ? ".$i" : "");
43 11         176 my @stsub = stat($subdir);
44 11         27 my $is_dir = -d _;
45 11 100 66     61 if (!@stsub) {
    50 66        
46 7 50       404 mkdir $subdir, 0700 or die "Can't mkdir '$subdir': $!";
47 7         108 return $subdir;
48             } elsif ($is_dir && $stsub[4] == $> && !($stsub[2] & 022)) {
49 0         0 return $subdir;
50             } else {
51 4         13 $i++;
52             }
53             }
54             }
55             }
56              
57             1;
58             # ABSTRACT: Cross-platform way to get system-wide & user private temporary directory
59              
60             __END__