Bug #255101 - Fix 'Permission denied' error handling in
authorZac Medico <zmedico@gentoo.org>
Fri, 16 Jan 2009 06:39:46 +0000 (06:39 -0000)
committerZac Medico <zmedico@gentoo.org>
Fri, 16 Jan 2009 06:39:46 +0000 (06:39 -0000)
NewsManager.getUnreadItems(). If there's no permission to lock the unread
file, skip the lock and try to read the file anyway.

svn path=/main/trunk/; revision=12521

pym/portage/locks.py
pym/portage/news.py

index f557d8096cd6cf10e930e7686eda1b4b81d30539..be7cdf07d2075c4857a04b20afc5ca9264e48395 100644 (file)
@@ -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
index 90dd3a065796eb1af512d6b17a873e3fab86b9c0..b20fd422e1917ea709eefb04880cd6c1e82da8b7 100644 (file)
@@ -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))