diff options
Diffstat (limited to 'urpm')
-rw-r--r-- | urpm/lock.pm | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/urpm/lock.pm b/urpm/lock.pm index 00baec12..687437d3 100644 --- a/urpm/lock.pm +++ b/urpm/lock.pm @@ -50,6 +50,18 @@ sub new { $lock; } +sub get_lock_pid { + my ($fh) = @_; + my ($dev,$ino,undef) = stat($fh); + my $major = int($dev/256); + my $minor = $dev % 256; + my $fileid = sprintf("%02x:%02x:%d",$major,$minor,$ino); + open(LOCKS, "/proc/locks") || return; + my @locks = <LOCKS>; + close(LOCKS); + foreach (@locks) { /FLOCK.*WRITE\s*(\d+)\s*$fileid\s/ && return $1 }; +} + sub _lock { my ($lock, $b_exclusive, $b_wait) = @_; $b_exclusive ||= ''; @@ -63,7 +75,15 @@ sub _lock { $lock->{info}(N("%s database is locked. Waiting...", $lock->{db_name})); flock($lock->{fh}, $mode) or $lock->{fatal}(N("aborting")); } else { - $lock->{fatal}(N("%s database is locked (another program is already using it)", $lock->{db_name})); + my $pid = get_lock_pid($lock->{fh}); + if($pid) { + my $name = urpm::util::cat_("/proc/$pid/cmdline"); + $name =~ tr/\0/ /; + $name =~ s/ *$//; + $lock->{fatal}(N("%s database is locked, process %d is already using it", $lock->{db_name}, $pid).($name?" ($name)":"")); + } else { + $lock->{fatal}(N("%s database is locked (another program is already using it)", $lock->{db_name})); + } } } $lock->{locked} = 1; |