use Digest::MD5 ();
use File::Path qw(mkpath rmtree);
use File::Basename;
-use Fcntl ':flock';
+use IPC::SysV qw(IPC_PRIVATE S_IRUSR S_IWUSR IPC_CREAT IPC_EXCL SEM_UNDO);
+use IPC::Semaphore;
Getopt::Long::Configure("no_ignore_case");
$dir = "$cachedir/$repoid/";
$baseurl .= '/' unless $baseurl =~ /\/$/;
mkpath("${dir}repodata");
- system($INC[0].'/download', "${dir}repodata", "${baseurl}repodata/repomd.xml");
+ my $sem;
+ my $key = IPC::SysV::ftok($dir, '1');
+ if ($sem = IPC::Semaphore->new($key, 1, S_IRUSR | S_IWUSR | IPC_CREAT | IPC_EXCL)) {
+ $sem->setval(0, 1);
+ } else {
+ $sem = IPC::Semaphore->new($key, 1, S_IRUSR | S_IWUSR | IPC_CREAT);
+ }
+
+ $sem->op(0, -1, SEM_UNDO);
+ if (!-f "${dir}repodata/repomd.xml") {
+ system($INC[0].'/download', "${dir}repodata", "${baseurl}repodata/repomd.xml");
+ }
+ $sem->op(0, 1, SEM_UNDO);
+ $sem->remove();
} else {
$dir = $url;
}
utf8::downgrade($u);
}
my $cached;
+ my $sem;
+ my $key = IPC::SysV::ftok("${dir}repodata/", '1');
+ if ($sem = IPC::Semaphore->new($key, 1, S_IRUSR | S_IWUSR | IPC_CREAT | IPC_EXCL)) {
+ $sem->setval(0, 1);
+ } else {
+ $sem = IPC::Semaphore->new($key, 1, S_IRUSR | S_IWUSR | IPC_CREAT);
+ }
+ $sem->op(0, -1, SEM_UNDO);
if (-e $u) {
$cached = 1;
$cached = 0 if exists($f->{'size'}) && $f->{'size'} != (-s _);
die("inconsistent repodata in $url\n");
}
}
+ $sem->op(0, 1, SEM_UNDO);
+ $sem->remove();
my $fh;
open($fh, '<', $u) or die "Error opening $u: $!\n";