summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2008-03-27 04:50:32 +0000
committerZac Medico <zmedico@gentoo.org>2008-03-27 04:50:32 +0000
commit5479e45d9e21df170affa3545aafa4d1261be9bb (patch)
treecdf8ee2f906f365486fc55f1e2c0f167cf67ca09
parentc36283f8b19447154f00d0f2248aa73f3241ef47 (diff)
downloadportage-5479e45d9e21df170affa3545aafa4d1261be9bb.tar.gz
portage-5479e45d9e21df170affa3545aafa4d1261be9bb.tar.bz2
portage-5479e45d9e21df170affa3545aafa4d1261be9bb.zip
Bug #212882
- For compatibility with ENOENT exceptions raised from fstat calls with CIFS, wrap fstat calls with an appropriate exception handler. (trunk r9474) - Fix lockfile() to handle errno.EACCES raised from the fcntl call since the spec says that it's equivalent to EAGAIN and it appears that CIFS returns EACCES in this case. (trunk r9458) svn path=/main/branches/2.1.2/; revision=9518
-rw-r--r--pym/portage_locks.py22
1 files changed, 19 insertions, 3 deletions
diff --git a/pym/portage_locks.py b/pym/portage_locks.py
index 9b17c60e3..340096a7c 100644
--- a/pym/portage_locks.py
+++ b/pym/portage_locks.py
@@ -79,7 +79,7 @@ def lockfile(mypath, wantnewlockfile=0, unlinkfile=0, waiting_msg=None):
except IOError, e:
if "errno" not in dir(e):
raise
- if e.errno == errno.EAGAIN:
+ if e.errno in (errno.EACCES, errno.EAGAIN):
# resource temp unavailable; eg, someone beat us to the lock.
if waiting_msg is None:
if isinstance(mypath, int):
@@ -111,7 +111,7 @@ def lockfile(mypath, wantnewlockfile=0, unlinkfile=0, waiting_msg=None):
if type(lockfilename) == types.StringType and \
- myfd != HARDLINK_FD and os.fstat(myfd).st_nlink == 0:
+ myfd != HARDLINK_FD and _fstat_nlink(myfd) == 0:
# The file was deleted on us... Keep trying to make one...
os.close(myfd)
portage_util.writemsg("lockfile recurse\n",1)
@@ -122,6 +122,22 @@ def lockfile(mypath, wantnewlockfile=0, unlinkfile=0, waiting_msg=None):
portage_util.writemsg(str((lockfilename,myfd,unlinkfile))+"\n",1)
return (lockfilename,myfd,unlinkfile,locking_method)
+def _fstat_nlink(fd):
+ """
+ @param fd: an open file descriptor
+ @type fd: Integer
+ @rtype: Integer
+ @return: the current number of hardlinks to the file
+ """
+ try:
+ return os.fstat(fd).st_nlink
+ except EnvironmentError, e:
+ if e.errno == errno.ENOENT:
+ # Some filesystems such as CIFS return
+ # ENOENT which means st_nlink == 0.
+ return 0
+ raise
+
def unlockfile(mytuple):
import fcntl
@@ -167,7 +183,7 @@ def unlockfile(mytuple):
# We won the lock, so there isn't competition for it.
# We can safely delete the file.
portage_util.writemsg("Got the lockfile...\n",1)
- if os.fstat(myfd).st_nlink == 1:
+ if _fstat_nlink(myfd) == 1:
os.unlink(lockfilename)
portage_util.writemsg("Unlinked lockfile...\n",1)
locking_method(myfd,fcntl.LOCK_UN)