summaryrefslogtreecommitdiff
path: root/src/user/dirinfo/dirinfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/user/dirinfo/dirinfo.c')
-rw-r--r--src/user/dirinfo/dirinfo.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/user/dirinfo/dirinfo.c b/src/user/dirinfo/dirinfo.c
new file mode 100644
index 0000000..7484eb8
--- /dev/null
+++ b/src/user/dirinfo/dirinfo.c
@@ -0,0 +1,49 @@
+#include <pland/syscall.h>
+#include <knob/format.h>
+#include <knob/file.h>
+#include <knob/user.h>
+
+#define MAX_DIR_ENTRIES 20
+
+void main(const char *arg) {
+ uint8_t dn;
+ const char *path = remove_prefix(arg, &dn);
+
+ tell_user_sz("Directory info for ");
+ tell_user_sz(*arg ? arg : "drive root");
+ tell_user_sz("\n");
+
+ _dir_info_entry infos[MAX_DIR_ENTRIES];
+ uint8_t count = _enumerate_dir(dn, path, infos, MAX_DIR_ENTRIES);
+ tell_user_sz(
+ count == MAX_DIR_ENTRIES
+ ? "Truncated to 20 entries.\n\n"
+ : "\n"
+ );
+
+ uint32_t total_size = 0;
+
+ if (!count)
+ tell_user_sz("(none)\n");
+
+ for (uint8_t i = 0; i < count; ++i) {
+ tell_user_sz(infos[i].name);
+ tell_user_sz(": ");
+ if (infos[i].is_dir)
+ tell_user_sz("dir");
+ else {
+ char nbuf[11];
+ itosz(infos[i].size, nbuf);
+ tell_user_sz(nbuf);
+ tell_user_sz(" bytes");
+ total_size += infos[i].size;
+ }
+ tell_user_sz("\n");
+ }
+
+ tell_user_sz("\nTotal size without subdirectories: ");
+ char nbuf[11];
+ itosz(total_size, nbuf);
+ tell_user_sz(nbuf);
+ tell_user_sz(" bytes\n");
+} \ No newline at end of file