diff options
author | Kevin Cheng <kevcheng@google.com> | 2019-04-18 11:31:16 -0700 |
---|---|---|
committer | Kevin Cheng <kevcheng@google.com> | 2019-05-02 13:59:40 -0700 |
commit | 757c264bc10ebc71074ee3f5fb66d670667a09bc (patch) | |
tree | 26c7f7b74c752db99d9b0ac1f94fc592aca1e53a /demo/bsdopendirtype.py | |
parent | 99013222844839c42437f16eace25f4e6a8a8b20 (diff) | |
download | cffi-757c264bc10ebc71074ee3f5fb66d670667a09bc.tar.gz |
Add in cffi 1.12.2 (e0c7666)
Since this is a mercurial repo, d/led zip of src:
https://bitbucket.org/cffi/cffi/get/v1.12.2.zip
Also add in misc METADATA/NOTICE/Android.bp/etc files.
Bug: 122778810
Test: None
Change-Id: I36c58ed07a2cdd4d9d11831908175a5c988f33c1
Diffstat (limited to 'demo/bsdopendirtype.py')
-rw-r--r-- | demo/bsdopendirtype.py | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/demo/bsdopendirtype.py b/demo/bsdopendirtype.py new file mode 100644 index 0000000..75a996a --- /dev/null +++ b/demo/bsdopendirtype.py @@ -0,0 +1,48 @@ +from _bsdopendirtype import ffi, lib + + +def _posix_error(): + raise OSError(ffi.errno, os.strerror(ffi.errno)) + +_dtype_to_smode = { + lib.DT_BLK: 0o060000, + lib.DT_CHR: 0o020000, + lib.DT_DIR: 0o040000, + lib.DT_FIFO: 0o010000, + lib.DT_LNK: 0o120000, + lib.DT_REG: 0o100000, + lib.DT_SOCK: 0o140000, +} + +def opendir(dir): + if len(dir) == 0: + dir = b'.' + dirname = dir + if not dirname.endswith(b'/'): + dirname += b'/' + dirp = lib.opendir(dir) + if dirp == ffi.NULL: + raise _posix_error() + try: + while True: + ffi.errno = 0 + dirent = lib.readdir(dirp) + if dirent == ffi.NULL: + if ffi.errno != 0: + raise _posix_error() + return + name = ffi.string(dirent.d_name) + if name == b'.' or name == b'..': + continue + name = dirname + name + try: + smode = _dtype_to_smode[dirent.d_type] + except KeyError: + smode = os.lstat(name).st_mode + yield name, smode + finally: + lib.closedir(dirp) + +if __name__ == '__main__': + for name, smode in opendir(b'/tmp'): + print(hex(smode), name) |