utils / file revision
summary |
shortlog |
changelog |
tags | edit |
manifest |
changeset |
file |
revisions |
annotate |
diff |
raw
perl/mktemp
| author | f99aq8ove <f99aq8ove@gmail.com> |
| Sun Aug 03 20:24:34 2008 +0900 (11 months ago) | |
| changeset 3 | 09177d8ec349 |
| parent 2 | 15e6eec9b4a0 |
| 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 }
