code wiki / _hdl_build / nx_lsdir.nx
nx_lsdir.nx source
↩ module page · 33 lines · 1355 B
1// nx_lsdir.nx -- sovereign directory lister (getdents64, no /bin/ls / no shell). argv[1]=dir. Prints "d <name>" for
2// dirs, "f <name>" for files. A reusable Nishi inspection tool (feeds archive-manifest authoring, dir-walk, glob).
3// license_tier: ORIGINAL
4import "nx_sovjson_lib.nx"
5import "nx_syscalls.nx"
6const K_MAGIC_131072: i64 = 131072
7
8func ls_w(s: *u8) -> i64 { return sj_puts(s) }
9
10func main(argc: i64, argv: *i64) -> i64 {
11 if argc < 2 { ls_w("usage: nx_lsdir <dir>\n" as *u8); sys_exit(2); return 2 }
12 let path: *u8 = argv[1] as *u8
13 ls_w("== " as *u8); ls_w(path); ls_w(" ==\n" as *u8)
14 let fd: i64 = sys_openat_rd(path)
15 if fd < 0 { ls_w(" (cannot open -- absent or no permission)\n" as *u8); sys_exit(1); return 1 }
16 let buf: *u8 = sys_mmap(K_MAGIC_131072)
17 var go: i64 = 1
18 while go == 1 {
19 let nr: i64 = sys_getdents64(fd, buf, K_MAGIC_131072)
20 if nr <= 0 { go = 0 } else {
21 var off: i64 = 0
22 while off < nr {
23 let rec: *u8 = (buf as i64 + off) as *u8
24 let ty: i64 = dirent_type(rec)
25 if ty == 4 { ls_w(" d " as *u8) } else { ls_w(" f " as *u8) }
26 ls_w(dirent_name(rec)); ls_w("\n" as *u8)
27 off = off + dirent_reclen(rec)
28 }
29 }
30 }
31 sys_close(fd)
32 sys_exit(0); return 0
33}