[pypy-commit] pypy follow_symlinks: Add support for dir_fd and follow_symlinks in posix.stat()

rlamy pypy.commits at gmail.com
Thu Apr 7 11:52:41 EDT 2016


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: follow_symlinks
Changeset: r83574:ff055a66c820
Date: 2016-04-07 16:51 +0100
http://bitbucket.org/pypy/pypy/changeset/ff055a66c820/

Log:	Add support for dir_fd and follow_symlinks in posix.stat()

diff --git a/pypy/module/posix/interp_posix.py b/pypy/module/posix/interp_posix.py
--- a/pypy/module/posix/interp_posix.py
+++ b/pypy/module/posix/interp_posix.py
@@ -354,7 +354,7 @@
     else:
         return build_stat_result(space, st)
 
- at unwrap_spec(dir_fd=DirFD(available=False), follow_symlinks=kwonly(bool))
+ at unwrap_spec(dir_fd=DirFD(rposix.HAVE_FSTATAT), follow_symlinks=kwonly(bool))
 def stat(space, w_path, dir_fd=DEFAULT_DIR_FD, follow_symlinks=True):
     """stat(path, *, dir_fd=None, follow_symlinks=True) -> stat result
 
@@ -371,14 +371,29 @@
   link points to.
 It is an error to use dir_fd or follow_symlinks when specifying path as
   an open file descriptor."""
-    try:
-        st = dispatch_filename(rposix_stat.stat, 0,
-                               allow_fd_fn=rposix_stat.fstat)(space, w_path)
-    except OSError, e:
-        raise wrap_oserror2(space, e, w_path)
-    else:
+    if follow_symlinks and dir_fd == DEFAULT_DIR_FD:
+        try:
+            st = dispatch_filename(rposix_stat.stat, 0,
+                                allow_fd_fn=rposix_stat.fstat)(space, w_path)
+        except OSError as e:
+            raise wrap_oserror2(space, e, w_path)
+        else:
+            return build_stat_result(space, st)
+
+    if not follow_symlinks and dir_fd == DEFAULT_DIR_FD:
+        return lstat(space, w_path)
+
+    if rposix.HAVE_FSTATAT:
+        try:
+            path = space.fsencode_w(w_path)
+            st = rposix_stat.fstatat(path, dir_fd, follow_symlinks)
+        except OSError as e:
+            raise wrap_oserror2(space, e, w_path)
         return build_stat_result(space, st)
 
+    raise oefmt(space.w_NotImplementedError,
+        "stat: unsupported argument combination")
+
 @unwrap_spec(dir_fd=DirFD(available=False))
 def lstat(space, w_path, dir_fd=DEFAULT_DIR_FD):
     """lstat(path, *, dir_fd=None) -> stat result


More information about the pypy-commit mailing list