[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