summaryrefslogtreecommitdiff
path: root/demo
diff options
context:
space:
mode:
authorArmin Rigo <arigo@tunes.org>2015-04-29 20:14:31 +0200
committerArmin Rigo <arigo@tunes.org>2015-04-29 20:14:31 +0200
commit6a05b1a52bd325efb9ff14e57a20e19165b8f28c (patch)
tree8be45ccba033b4e38e366aceea59c250624a1938 /demo
parent67bac06df2a11a5ccdb1e25b718d16ded9f994f3 (diff)
downloadcffi-6a05b1a52bd325efb9ff14e57a20e19165b8f28c.tar.gz
A demo using ffi.include() --- which doesn't work right now
Diffstat (limited to 'demo')
-rw-r--r--demo/recopendirtype.py50
-rw-r--r--demo/recopendirtype_build.py19
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()