perl/mktemp
author f99aq8ove <f99aq8ove@gmail.com>
Sun Aug 03 20:24:34 2008 +0900 (11 months ago)
changeset 3 09177d8ec349
parent 215e6eec9b4a0
permissions -rwxr-xr-x
if format template is not defined, use normal mode.
        1 #!/usr/bin/env perl
        2 use strict;
        3 use warnings;
        4 use Fcntl;
        5 
        6 # use Data::Dumper;
        7 
        8 my $try_count = 10;
        9 
       10 my %options = (
       11   t => 'using_tempdir',
       12   u => 'unsafe',
       13   d => 'dir',
       14 );
       15 my %mode = (
       16   using_tempdir => 0,
       17   unsafe => 0,
       18   dir => 0,
       19 );
       20 my $template;
       21 
       22 foreach my $arg (@ARGV) {
       23   if ($arg =~ /^-(.*)$/) {
       24     foreach (split //, $1) {
       25       die "unknown option: $_" unless exists $options{$_};
       26       $mode{$options{$_}} = 1;
       27     }
       28   } else {
       29     $template ||= $arg;
       30   }
       31 }
       32 
       33 unless (defined $template) {
       34   $mode{using_tempdir} ||= 1;
       35   $template = 'tmp.XXXXXXXXXX';
       36 }
       37 
       38 # warn Dumper \%mode;
       39 # warn $template;
       40 
       41 my $temp_name;
       42 
       43 while ($try_count) {
       44   $temp_name = $template;
       45   $temp_name =~ s/(X)/&rand_char($1)/eg;
       46   if ($mode{using_tempdir}) {
       47     $temp_name = ($ENV{TMPDIR} || '/tmp') . "/$temp_name";
       48   }
       49   # warn $temp_name;
       50   if ($mode{dir}) {
       51     last if mkdir $temp_name;
       52   } else {
       53     if (sysopen my $fh, $temp_name, O_WRONLY | O_CREAT | O_EXCL) {
       54       close $fh;
       55       last;
       56     }
       57   }
       58   $try_count--;
       59 }
       60 
       61 die "make temp failed: $temp_name" if $try_count == 0;
       62 
       63 if ($mode{unsafe}) {
       64   if ($mode{dir}) {
       65     rmdir $temp_name or die $!;
       66   } else {
       67     unlink $temp_name or die $!;
       68   }
       69 }
       70 
       71 print "$temp_name\n";
       72 
       73 sub rand_char() {
       74   my @chars = ('a'..'z', 'A'..'Z', 0..9);
       75   return $chars[rand(scalar @chars)];
       76 }