| 1234567891011121314151617181920212223242526272829303132333435 |
- # 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")
|