diff options
author | Armin Rigo <arigo@tunes.org> | 2015-04-29 20:14:31 +0200 |
---|---|---|
committer | Armin Rigo <arigo@tunes.org> | 2015-04-29 20:14:31 +0200 |
commit | 6a05b1a52bd325efb9ff14e57a20e19165b8f28c (patch) | |
tree | 8be45ccba033b4e38e366aceea59c250624a1938 | |
parent | 67bac06df2a11a5ccdb1e25b718d16ded9f994f3 (diff) | |
download | cffi-6a05b1a52bd325efb9ff14e57a20e19165b8f28c.tar.gz |
A demo using ffi.include() --- which doesn't work right now
-rw-r--r-- | demo/recopendirtype.py | 50 | ||||
-rw-r--r-- | demo/recopendirtype_build.py | 19 |
2 files changed, 69 insertions, 0 deletions
diff --git a/demo/recopendirtype.py b/demo/recopendirtype.py new file mode 100644 index 0000000..40b8193 --- /dev/null +++ b/demo/recopendirtype.py @@ -0,0 +1,50 @@ +from _recopendirtype 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 = '.' + dirname = dir + if not dirname.endswith('/'): + dirname += '/' + dirp = lib.opendir(dir) + if dirp == ffi.NULL: + raise _posix_error() + dirent = ffi.new("struct dirent *") + result = ffi.new("struct dirent **") + try: + while True: + ffi.errno = 0 + err = lib.readdir_r(dirp, dirent, result) + if err: # really got an error + raise OSError(err, os.strerror(err)) + if result[0] == ffi.NULL: + return # + name = ffi.string(dirent.d_name) + if name == '.' or name == '..': + 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('/tmp'): + print hex(smode), name diff --git a/demo/recopendirtype_build.py b/demo/recopendirtype_build.py new file mode 100644 index 0000000..fa62a05 --- /dev/null +++ b/demo/recopendirtype_build.py @@ -0,0 +1,19 @@ +from cffi import FFI +import bsdopendirtype_build + +ffi = FFI() + +# ========== This is a demo of ffi.include() ========== +ffi.include(bsdopendirtype_build.ffi) + +ffi.cdef(""" + int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result); +""") + +ffi.set_source("_recopendirtype", """ + #include <sys/types.h> + #include <dirent.h> +""") + +if __name__ == '__main__': + ffi.compile() |