diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2023-01-15 01:13:51 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2023-01-15 01:13:51 +0100 |
| commit | 3f79b7bd553a52fca7a098f5195b406ff9970491 (patch) | |
| tree | 99d0399141e7894219fe7a0deed1ccadb226b9c9 /core | |
| parent | 919450dc7d965c4067287e1ece3ceafdde8ff5a9 (diff) | |
add list and static library builder
Diffstat (limited to 'core')
| -rw-r--r-- | core/Makefile | 14 | ||||
| -rwxr-xr-x | core/ls | bin | 0 -> 58216 bytes | |||
| -rw-r--r-- | core/ls.c | 78 |
3 files changed, 92 insertions, 0 deletions
diff --git a/core/Makefile b/core/Makefile new file mode 100644 index 0000000..3382b52 --- /dev/null +++ b/core/Makefile @@ -0,0 +1,14 @@ +SRC=$(wildcard *.c) +OBJ=$(SRC:.c=) + +all: ${OBJ} + +options: + @echo SRC: ${SRC} + @echo OBJ: ${OBJ} + +%: %.c + gcc $< -o $@ ../lib/slib.a -static -nostdlib -fno-stack-protector -Wno-implicit-function-declaration -fno-builtin -g + +clean: + rm ${OBJ} Binary files differdiff --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; +} |