File Coverage

blib/lib/Dpkg/Lock.pm
Criterion Covered Total %
statement 18 25 72.0
branch 0 6 0.0
condition n/a
subroutine 6 7 85.7
pod 0 1 0.0
total 24 39 61.5


line stmt bran cond sub pod time code
1             # Copyright © 2011 Raphaël Hertzog
2             # Copyright © 2012 Guillem Jover
3             #
4             # This program is free software; you can redistribute it and/or modify
5             # it under the terms of the GNU General Public License as published by
6             # the Free Software Foundation; either version 2 of the License, or
7             # (at your option) any later version.
8             #
9             # This program is distributed in the hope that it will be useful,
10             # but WITHOUT ANY WARRANTY; without even the implied warranty of
11             # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12             # GNU General Public License for more details.
13             #
14             # You should have received a copy of the GNU General Public License
15             # along with this program. If not, see .
16              
17             package Dpkg::Lock;
18              
19 1     1   69662 use strict;
  1         12  
  1         29  
20 1     1   5 use warnings;
  1         2  
  1         67  
21              
22             our $VERSION = '0.01';
23             our @EXPORT = qw(
24             file_lock
25             );
26              
27 1     1   7 use Exporter qw(import);
  1         2  
  1         38  
28 1     1   6 use Fcntl qw(:flock);
  1         2  
  1         144  
29              
30 1     1   425 use Dpkg::Gettext;
  1         3  
  1         57  
31 1     1   414 use Dpkg::ErrorHandling;
  1         3  
  1         172  
32              
33             sub file_lock($$) {
34 0     0 0   my ($fh, $filename) = @_;
35              
36             # A strict dependency on libfile-fcntllock-perl being it an XS module,
37             # and dpkg-dev indirectly making use of it, makes building new perl
38             # package which bump the perl ABI impossible as these packages cannot
39             # be installed alongside.
40 0           eval q{
41             pop @INC if $INC[-1] eq '.';
42             use File::FcntlLock;
43             };
44 0 0         if ($@) {
45             # On Linux systems the flock() locks get converted to file-range
46             # locks on NFS mounts.
47 0 0         if ($^O ne 'linux') {
48 0           warning(g_('File::FcntlLock not available; using flock which is not NFS-safe'));
49             }
50 0 0         flock($fh, LOCK_EX)
51             or syserr(g_('failed to get a write lock on %s'), $filename);
52             } else {
53 0           eval q{
54             my $fs = File::FcntlLock->new(l_type => F_WRLCK);
55             $fs->lock($fh, F_SETLKW)
56             or syserr(g_('failed to get a write lock on %s'), $filename);
57             }
58             }
59             }
60              
61             1;