diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2020-07-08 21:01:09 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2020-07-08 21:01:09 -0700 |
commit | 0976864358ad2fa493a1085b4f882a55da4328e8 (patch) | |
tree | fae9f7b4615b7192744125cd09df6196e0baa976 /sysif.c | |
parent | b32fd0b6f998ce4322ddf35399047f938c22717c (diff) | |
download | txr-0976864358ad2fa493a1085b4f882a55da4328e8.tar.gz txr-0976864358ad2fa493a1085b4f882a55da4328e8.tar.bz2 txr-0976864358ad2fa493a1085b4f882a55da4328e8.zip |
readdir: skip . and .. entries
* sysif.c (readdir_wrap): If d_name is "." or ".." loop around
and get another directory entry.
* txr.1: Documented.
Diffstat (limited to 'sysif.c')
-rw-r--r-- | sysif.c | 33 |
1 files changed, 19 insertions, 14 deletions
@@ -2267,23 +2267,28 @@ static val readdir_wrap(val dirobj, val dirent_in) struct dir *d = coerce(struct dir *, cobj_handle(self, dirobj, dir_s)); struct dirent *dent = readdir(d->dir); - if (dent == 0) { - return nil; - } else { - args_decl(args, ARGS_MIN); - val dirent = default_arg(dirent_in, make_struct(dirent_st, nil, args)); - slotset(dirent, name_s, - if3(d->path, - path_cat(d->path, string_utf8(dent->d_name)), - string_utf8(dent->d_name))); - slotset(dirent, ino_s, num(dent->d_ino)); + for (;;) { + if (dent == 0) { + return nil; + } else if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, "..")) { + dent = readdir(d->dir); + continue; + } else { + args_decl(args, ARGS_MIN); + val dirent = default_arg(dirent_in, make_struct(dirent_st, nil, args)); + slotset(dirent, name_s, + if3(d->path, + path_cat(d->path, string_utf8(dent->d_name)), + string_utf8(dent->d_name))); + slotset(dirent, ino_s, num(dent->d_ino)); #ifdef _DIRENT_HAVE_D_TYPE - slotset(dirent, type_s, num(dent->d_type)); + slotset(dirent, type_s, num(dent->d_type)); #else - if (dirent_in == dirent) - slotset(dirent, type_s, nil); + if (dirent_in == dirent) + slotset(dirent, type_s, nil); #endif - return dirent; + return dirent; + } } } |