Author: Armin Rigo <ar...@tunes.org> Branch: py3.5-scandir Changeset: r86705:e69a949f6bcb Date: 2016-08-29 17:17 +0200 http://bitbucket.org/pypy/pypy/changeset/e69a949f6bcb/
Log: inode() diff --git a/pypy/module/posix/interp_scandir.py b/pypy/module/posix/interp_scandir.py --- a/pypy/module/posix/interp_scandir.py +++ b/pypy/module/posix/interp_scandir.py @@ -94,9 +94,10 @@ break # known_type = rposix_scandir.get_known_type(entry) + inode = rposix_scandir.get_inode(entry) finally: self._in_next = False - direntry = W_DirEntry(self, name, known_type) + direntry = W_DirEntry(self, name, known_type, inode) return space.wrap(direntry) @@ -122,10 +123,11 @@ class W_DirEntry(W_Root): w_path = None - def __init__(self, scandir_iterator, name, known_type): + def __init__(self, scandir_iterator, name, known_type, inode): self.space = scandir_iterator.space self.scandir_iterator = scandir_iterator self.name = name # always bytes on Posix + self.inode = inode self.flags = known_type assert known_type == (known_type & 255) # @@ -281,6 +283,9 @@ st = self.get_stat_or_lstat(follow_symlinks) return build_stat_result(self.space, st) + def descr_inode(self, space): + return space.wrap(self.inode) + W_DirEntry.typedef = TypeDef( 'posix.DirEntry', @@ -294,5 +299,6 @@ is_file = interp2app(W_DirEntry.descr_is_file), is_symlink = interp2app(W_DirEntry.descr_is_symlink), stat = interp2app(W_DirEntry.descr_stat), + inode = interp2app(W_DirEntry.descr_inode), ) W_DirEntry.typedef.acceptable_as_base_class = False diff --git a/pypy/module/posix/test/test_scandir.py b/pypy/module/posix/test/test_scandir.py --- a/pypy/module/posix/test/test_scandir.py +++ b/pypy/module/posix/test/test_scandir.py @@ -157,3 +157,10 @@ def test_fdopendir_unsupported(self): posix = self.posix raises(TypeError, posix.scandir, 1234) + + def test_inode(self): + posix = self.posix + d = next(posix.scandir(self.dir1)) + assert d.name == 'file1' + ino = d.inode() + assert ino == d.stat().st_ino diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py --- a/rpython/rlib/rposix.py +++ b/rpython/rlib/rposix.py @@ -623,7 +623,8 @@ class CConfig: _compilation_info_ = eci DIRENT = rffi_platform.Struct('struct dirent', - [('d_name', lltype.FixedSizeArray(rffi.CHAR, 1))] + [('d_name', lltype.FixedSizeArray(rffi.CHAR, 1)), + ('d_ino', lltype.Signed)] + [('d_type', rffi.INT)] if HAVE_D_TYPE else []) if HAVE_D_TYPE: DT_UNKNOWN = rffi_platform.ConstantInteger('DT_UNKNOWN') diff --git a/rpython/rlib/rposix_scandir.py b/rpython/rlib/rposix_scandir.py --- a/rpython/rlib/rposix_scandir.py +++ b/rpython/rlib/rposix_scandir.py @@ -50,3 +50,6 @@ if rposix.HAVE_D_TYPE: return rffi.getintfield(direntp, 'c_d_type') return DT_UNKNOWN + +def get_inode(direntp): + return rffi.getintfield(direntp, 'c_d_ino') _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit