aboutsummaryrefslogtreecommitdiff
path: root/core/ls.c
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2023-01-15 01:13:51 +0100
committerNathan Reiner <nathan@nathanreiner.xyz>2023-01-15 01:13:51 +0100
commit3f79b7bd553a52fca7a098f5195b406ff9970491 (patch)
tree99d0399141e7894219fe7a0deed1ccadb226b9c9 /core/ls.c
parent919450dc7d965c4067287e1ece3ceafdde8ff5a9 (diff)
add list and static library builder
Diffstat (limited to 'core/ls.c')
-rw-r--r--core/ls.c78
1 files changed, 78 insertions, 0 deletions
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;
+}