summaryrefslogtreecommitdiffstats
path: root/sysif.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2020-07-08 21:01:09 -0700
committerKaz Kylheku <kaz@kylheku.com>2020-07-08 21:01:09 -0700
commit0976864358ad2fa493a1085b4f882a55da4328e8 (patch)
treefae9f7b4615b7192744125cd09df6196e0baa976 /sysif.c
parentb32fd0b6f998ce4322ddf35399047f938c22717c (diff)
downloadtxr-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.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/sysif.c b/sysif.c
index 12509c85..4d1a8b6d 100644
--- a/sysif.c
+++ b/sysif.c
@@ -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;
+ }
}
}