Jelajahi Sumber

Merge branch 'fix_atime' into merge

Thomas Waldmann 10 tahun lalu
induk
melakukan
4be5f312d7
1 mengubah file dengan 14 tambahan dan 11 penghapusan
  1. 14 11
      attic/archive.py

+ 14 - 11
attic/archive.py

@@ -483,25 +483,31 @@ class Archive:
 
     @staticmethod
     def _open_rb(path, st):
-        flags_noatime = None
+        flags_normal = os.O_RDONLY | getattr(os, 'O_BINARY', 0)
+        flags_noatime = flags_normal | getattr(os, 'NO_ATIME', 0)
         euid = None
 
         def open_simple(p, s):
-            return open(p, 'rb')
+            fd = os.open(p, flags_normal)
+            return os.fdopen(fd, 'rb')
+
+        def open_noatime(p, s):
+            fd = os.open(p, flags_noatime)
+            return os.fdopen(fd, 'rb')
 
         def open_noatime_if_owner(p, s):
             if euid == 0 or s.st_uid == euid:
                 # we are root or owner of file
-                return os.fdopen(os.open(p, flags_noatime), 'rb')
+                return open_noatime(p, s)
             else:
-                return open(p, 'rb')
+                return open_simple(p, s)
 
-        def open_noatime(p, s):
+        def open_noatime_with_fallback(p, s):
             try:
                 fd = os.open(p, flags_noatime)
             except PermissionError:
                 # Was this EPERM due to the O_NOATIME flag?
-                fo = open(p, 'rb')
+                fd = os.open(p, flags_normal)
                 # Yes, it was -- otherwise the above line would have thrown
                 # another exception.
                 nonlocal euid
@@ -509,14 +515,11 @@ class Archive:
                 # So in future, let's check whether the file is owned by us
                 # before attempting to use O_NOATIME.
                 Archive._open_rb = open_noatime_if_owner
-                return fo
             return os.fdopen(fd, 'rb')
 
-        o_noatime = getattr(os, 'O_NOATIME', None)
-        if o_noatime is not None:
-            flags_noatime = os.O_RDONLY | getattr(os, 'O_BINARY', 0) | o_noatime
+        if flags_noatime != flags_normal:
             # Always use O_NOATIME version.
-            Archive._open_rb = open_noatime
+            Archive._open_rb = open_noatime_with_fallback
         else:
             # Always use non-O_NOATIME version.
             Archive._open_rb = open_simple