Author: Ronan Lamy <ronan.l...@gmail.com>
Branch: rposix-for-3
Changeset: r83550:464d641a9035
Date: 2016-04-06 20:32 +0100
http://bitbucket.org/pypy/pypy/changeset/464d641a9035/

Log:    Add wrapper for fstatat()

diff --git a/rpython/rlib/rposix_stat.py b/rpython/rlib/rposix_stat.py
--- a/rpython/rlib/rposix_stat.py
+++ b/rpython/rlib/rposix_stat.py
@@ -23,6 +23,7 @@
 from rpython.rlib.rarithmetic import intmask
 from rpython.rlib.rposix import (
     replace_os_function, handle_posix_error, _as_bytes0)
+from rpython.rlib import rposix
 
 _WIN32 = sys.platform.startswith('win')
 _LINUX = sys.platform.startswith('linux')
@@ -504,6 +505,23 @@
         path = traits.as_str0(path)
         return win32_xstat(traits, path, traverse=False)
 
+if rposix.HAVE_FSTATAT:
+    from rpython.rlib.rposix import AT_FDCWD, AT_SYMLINK_NOFOLLOW
+    c_fstatat = rffi.llexternal('fstatat',
+        [rffi.INT, rffi.CCHARP, STAT_STRUCT, rffi.INT], rffi.INT,
+        compilation_info=compilation_info,
+        save_err=rffi.RFFI_SAVE_ERRNO, macro=True)
+
+    def fstatat(pathname, dir_fd=AT_FDCWD, follow_symlinks=True):
+        if follow_symlinks:
+            flags = 0
+        else:
+            flags = AT_SYMLINK_NOFOLLOW
+        with lltype.scoped_alloc(STAT_STRUCT.TO) as stresult:
+            error = c_fstatat(dir_fd, pathname, stresult, flags)
+            handle_posix_error('fstatat', error)
+            return build_stat_result(stresult)
+
 @replace_os_function('fstatvfs')
 def fstatvfs(fd):
     with lltype.scoped_alloc(STATVFS_STRUCT.TO) as stresult:
diff --git a/rpython/rlib/test/test_rposix_stat.py 
b/rpython/rlib/test/test_rposix_stat.py
--- a/rpython/rlib/test/test_rposix_stat.py
+++ b/rpython/rlib/test/test_rposix_stat.py
@@ -56,3 +56,13 @@
         except OSError, e:
             py.test.skip("the underlying os.fstatvfs() failed: %s" % e)
         rposix_stat.fstatvfs(0)
+
+@py.test.mark.skipif("not hasattr(rposix_stat, 'fstatat')")
+def test_fstatat(tmpdir):
+    tmpdir.join('file').write('text')
+    dirfd = os.open(str(tmpdir), os.O_RDONLY)
+    try:
+        result = rposix_stat.fstatat('file', dir_fd=dirfd, 
follow_symlinks=False)
+    finally:
+        os.close(dirfd)
+    assert result.st_atime == tmpdir.join('file').atime()
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to