| # A Linux-only demo, using set_source() instead of hard-coding the exact layouts |
| # |
| import sys |
| |
| if not sys.platform.startswith('linux'): |
| raise Exception("Linux-only demo") |
| |
| # run readdir2_build first, then make sure the shared object is on sys.path |
| from _readdir2_cffi import ffi, lib |
| |
| |
| def walk(basefd, path): |
| print '{', path |
| dirfd = lib.openat(basefd, path, 0) |
| if dirfd < 0: |
| # error in openat() |
| return |
| dir = lib.fdopendir(dirfd) |
| dirent = ffi.new("struct dirent *") |
| result = ffi.new("struct dirent **") |
| while True: |
| if lib.readdir_r(dir, dirent, result): |
| # error in readdir_r() |
| break |
| if result[0] == ffi.NULL: |
| break |
| name = ffi.string(dirent.d_name) |
| print '%3d %s' % (dirent.d_type, name) |
| if dirent.d_type == lib.DT_DIR and name != '.' and name != '..': |
| walk(dirfd, name) |
| lib.closedir(dir) |
| print '}' |
| |
| |
| walk(-1, "/tmp") |