From 51482d335f34090b81eb58647e1c8700415c96db Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Sun, 18 Jan 2009 23:42:53 +0000 Subject: Bug #255101 - Fix 'Permission denied' error handling in NewsManager.getUnreadItems(). If there's no permission to lock the unread file, skip the lock and try to read the file anyway. (trunk r12521) svn path=/main/branches/2.1.6/; revision=12533 --- pym/portage/locks.py | 27 ++++++++++++++++++--------- pym/portage/news.py | 2 +- 2 files changed, 19 insertions(+), 10 deletions(-) (limited to 'pym') diff --git a/pym/portage/locks.py b/pym/portage/locks.py index f557d8096..be7cdf07d 100644 --- a/pym/portage/locks.py +++ b/pym/portage/locks.py @@ -9,7 +9,7 @@ __all__ = ["lockdir", "unlockdir", "lockfile", "unlockfile", \ import errno, os, stat, time, types from portage.exception import DirectoryNotFound, FileNotFound, \ - InvalidData, TryAgain + InvalidData, TryAgain, OperationNotPermitted, PermissionDenied from portage.data import portage_gid from portage.output import EOutput from portage.util import writemsg @@ -55,22 +55,31 @@ def lockfile(mypath, wantnewlockfile=0, unlinkfile=0, if type(mypath) == types.StringType: if not os.path.exists(os.path.dirname(mypath)): raise DirectoryNotFound(os.path.dirname(mypath)) - if not os.path.exists(lockfilename): - old_mask=os.umask(000) - myfd = os.open(lockfilename, os.O_CREAT|os.O_RDWR,0660) + old_mask = os.umask(000) + try: + try: + myfd = os.open(lockfilename, os.O_CREAT|os.O_RDWR, 0660) + except OSError, e: + func_call = "open('%s')" % lockfilename + if e.errno == OperationNotPermitted.errno: + raise OperationNotPermitted(func_call) + elif e.errno == PermissionDenied.errno: + raise PermissionDenied(func_call) + else: + raise try: if os.stat(lockfilename).st_gid != portage_gid: - os.chown(lockfilename,os.getuid(),portage_gid) + os.chown(lockfilename, os.getuid(), portage_gid) except OSError, e: - if e[0] == 2: # No such file or directory + if e.errno == errno.ENOENT: # No such file or directory return lockfile(mypath, wantnewlockfile=wantnewlockfile, unlinkfile=unlinkfile, waiting_msg=waiting_msg, flags=flags) else: - writemsg("Cannot chown a lockfile. This could cause inconvenience later.\n"); + writemsg("Cannot chown a lockfile. This could " + \ + "cause inconvenience later.\n") + finally: os.umask(old_mask) - else: - myfd = os.open(lockfilename, os.O_CREAT|os.O_RDWR,0660) elif type(mypath) == types.IntType: myfd = mypath diff --git a/pym/portage/news.py b/pym/portage/news.py index 90dd3a065..b20fd422e 100644 --- a/pym/portage/news.py +++ b/pym/portage/news.py @@ -157,7 +157,7 @@ class NewsManager(object): try: unread_lock = lockfile(unread_filename, wantnewlockfile=1) except (InvalidLocation, OperationNotPermitted, PermissionDenied): - return 0 + pass try: try: return len(grabfile(unread_filename)) -- cgit v1.2.3-1-g7c22