1#!perl -w
2# Test O_EXLOCK
3
4use Test::More;
5use strict;
6use Fcntl;
7
8BEGIN {
9# see if we have O_EXLOCK
10  eval { &Fcntl::O_EXLOCK; };
11  if ($@) {
12    plan skip_all => 'Do not seem to have O_EXLOCK';
13  } else {
14    plan tests => 4;
15    use_ok( "File::Temp" );
16  }
17}
18
19# Need Symbol package for lexical filehandle on older perls
20require Symbol if $] < 5.006;
21
22# Get a tempfile with O_EXLOCK
23my $fh = File::Temp->new(EXLOCK => 1);
24ok( -e "$fh", "temp file is present" );
25
26# try to open it with a lock
27my $flags = O_CREAT | O_RDWR | O_EXLOCK;
28
29my $timeout = 5;
30my $status;
31eval {
32   local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
33   alarm $timeout;
34   my $newfh;
35   $newfh = &Symbol::gensym if $] < 5.006;
36   $status = sysopen($newfh, "$fh", $flags, 0600);
37   alarm 0;
38};
39if ($@) {
40   die unless $@ eq "alarm\n";   # propagate unexpected errors
41   # timed out
42}
43ok( !$status, "File $fh is locked" );
44
45# Now get a tempfile with locking disabled
46$fh = File::Temp->new( EXLOCK => 0 );
47
48eval {
49   local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
50   alarm $timeout;
51   my $newfh;
52   $newfh = &Symbol::gensym if $] < 5.006;
53   $status = sysopen($newfh, "$fh", $flags, 0600);
54   alarm 0;
55};
56if ($@) {
57   die unless $@ eq "alarm\n";   # propagate unexpected errors
58   # timed out
59}
60ok( $status, "File $fh is not locked");
61