Fix issue 1382: chown .sconsign.dblite back to original user/group when done, when...
authorgaryo <garyo@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Tue, 12 May 2009 02:01:33 +0000 (02:01 +0000)
committergaryo <garyo@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Tue, 12 May 2009 02:01:33 +0000 (02:01 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@4189 fdb21ef1-2011-0410-befe-b5e4ea1792b1

src/engine/SCons/dblite.py

index 6d4cfd5841895c52b63973505426325016afe515..e9932193838e136d602145ae0f007a5d9ef16c85 100644 (file)
@@ -45,6 +45,7 @@ class dblite:
   _open = __builtin__.open
   _cPickle_dump = cPickle.dump
   _os_chmod = os.chmod
+  _os_chown = os.chown
   _os_rename = os.rename
   _os_unlink = os.unlink
   _shutil_copyfile = shutil.copyfile
@@ -65,6 +66,20 @@ class dblite:
     self._mode = mode
     self._dict = {}
     self._needs_sync = 00000
+    if os.geteuid()==0 or os.getuid()==0:
+      # running as root; chown back to current owner/group when done
+      try:
+        statinfo = os.stat(self._file_name)
+        self._chown_to = statinfo.st_uid
+        self._chgrp_to = statinfo.st_gid
+      except OSError, e:
+        # db file doesn't exist yet.
+        # Check os.environ for SUDO_UID, use if set
+        self._chown_to = int(os.environ.get('SUDO_UID', -1))
+        self._chgrp_to = int(os.environ.get('SUDO_GID', -1))
+    else:
+      self._chown_to = -1        # don't chown
+      self._chgrp_to = -1        # don't chgrp
     if (self._flag == "n"):
       self._open(self._file_name, "wb", self._mode)
     else:
@@ -103,6 +118,11 @@ class dblite:
     except OSError: pass
     self._os_unlink(self._file_name)
     self._os_rename(self._tmp_name, self._file_name)
+    if self._chown_to > 0:      # don't chown to root or -1
+      try:
+        self._os_chown(self._file_name, self._chown_to, self._chgrp_to)
+      except OSError:
+        pass
     self._needs_sync = 00000
     if (keep_all_files):
       self._shutil_copyfile(