diff options
author | Zac Medico <zmedico@gentoo.org> | 2008-03-27 04:50:32 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2008-03-27 04:50:32 +0000 |
commit | 5479e45d9e21df170affa3545aafa4d1261be9bb (patch) | |
tree | cdf8ee2f906f365486fc55f1e2c0f167cf67ca09 /pym | |
parent | c36283f8b19447154f00d0f2248aa73f3241ef47 (diff) | |
download | portage-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
Diffstat (limited to 'pym')
-rw-r--r-- | pym/portage_locks.py | 22 |
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) |