From 3f79b7bd553a52fca7a098f5195b406ff9970491 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Sun, 15 Jan 2023 01:13:51 +0100 Subject: add list and static library builder --- core/ls.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 core/ls.c (limited to 'core/ls.c') diff --git a/core/ls.c b/core/ls.c new file mode 100644 index 0000000..6a25a3f --- /dev/null +++ b/core/ls.c @@ -0,0 +1,78 @@ +#include "../lib/sys/sizes.h" +#include "../lib/sys/getdents.h" +#include "../lib/io/io.h" +#include "../lib/list/list.h" +#include "../lib/arg/arg.h" + +#define BUF_SIZE sizeof(struct dirent) * 32 + +enum { + FILTER_NONE = 0, + FILTER_HIDDEN = 1, +} filter = FILTER_HIDDEN; + +list_t *dirs; + + +void set_filter_none() +{ + filter = FILTER_NONE; +} + + +void add_dir(const char *path) +{ + list_append(dirs, (void*)path); +} + + +u8 filter_entry(struct dirent *d) +{ + switch (filter) { + case FILTER_HIDDEN: + return d->d_name[0] != '.'; + case FILTER_NONE: + return 1; + } +} + + +int main(int argc, const char *argv[]) +{ + int fd; + char d_type; + char buf[BUF_SIZE]; + long nread; + struct dirent *d; + dirs = new_list(); + + arg_register_flag("-a", &set_filter_none); + arg_register_default(&add_dir); + arg_parse_arg(argc, argv); + + if (dirs->size == 0) { + list_append(dirs, "."); + } + + for (list_node_t *node = dirs->first; node; node = node->next) { + fd = open(node->value, OPEN_READ_ONLY | OPEN_DIRECTORY, 0); + + while (1) { + nread = getdents(fd, buf, BUF_SIZE); + + if (nread == 0) + break; + + for (u64 bpos = 0; bpos < nread;) { + d = (struct dirent*) (buf + bpos); + if (filter_entry(d)) + wstdf("%s\n", d->d_name); + bpos += d->d_reclen; + } + } + + close(fd); + } + + return 0; +} -- cgit v1.2.3-70-g09d2