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}