Commit | Line | Data |
---|---|---|
1479465f GJ |
1 | # Copyright © 2011 Raphaël Hertzog <hertzog@debian.org> |
2 | # Copyright © 2012 Guillem Jover <guillem@debian.org> | |
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 <https://www.gnu.org/licenses/>. | |
16 | ||
17 | package Dpkg::File; | |
18 | ||
19 | use strict; | |
20 | use warnings; | |
21 | ||
22 | our $VERSION = '0.01'; | |
23 | our @EXPORT = qw( | |
24 | file_lock | |
25 | file_slurp | |
26 | ); | |
27 | ||
28 | use Exporter qw(import); | |
29 | use Fcntl qw(:flock); | |
30 | ||
31 | use Dpkg::Gettext; | |
32 | use Dpkg::ErrorHandling; | |
33 | ||
34 | sub file_lock($$) { | |
35 | my ($fh, $filename) = @_; | |
36 | ||
37 | # A strict dependency on libfile-fcntllock-perl being it an XS module, | |
38 | # and dpkg-dev indirectly making use of it, makes building new perl | |
39 | # package which bump the perl ABI impossible as these packages cannot | |
40 | # be installed alongside. | |
41 | eval q{ | |
42 | pop @INC if $INC[-1] eq '.'; | |
43 | use File::FcntlLock; | |
44 | }; | |
45 | if ($@) { | |
46 | # On Linux systems the flock() locks get converted to file-range | |
47 | # locks on NFS mounts. | |
48 | if ($^O ne 'linux') { | |
49 | warning(g_('File::FcntlLock not available; using flock which is not NFS-safe')); | |
50 | } | |
51 | flock($fh, LOCK_EX) | |
52 | or syserr(g_('failed to get a write lock on %s'), $filename); | |
53 | } else { | |
54 | eval q{ | |
55 | my $fs = File::FcntlLock->new(l_type => F_WRLCK); | |
56 | $fs->lock($fh, F_SETLKW) | |
57 | or syserr(g_('failed to get a write lock on %s'), $filename); | |
58 | } | |
59 | } | |
60 | } | |
61 | ||
62 | sub file_slurp { | |
63 | my $fh = shift; | |
64 | ||
65 | local $/; | |
66 | my $data = <$fh>; | |
67 | return $data; | |
68 | } | |
69 | ||
70 | 1; |