code wiki / (root) / nx_fs.nx

nx_fs.nx source

↩ module page · 69 lines · 4329 B

1// nx_fs.nx -- SOVEREIGN file-ops multitool: the bottom-rung NISHI replacement for the GNU coreutils 2// (cp/mv/rm/ls/cat/mkdir) so EVERY layer is nishi -- we stop leaning on non-nishi tooling. Own syscalls only 3// (sys_openat/read/write/renameat/unlink/mkdir + getdents64; no busybox, no coreutils). As we do work we reach 4// for THIS, and the ecosystem gains the capability (s-class exceed from the bottom up). 5// usage: nx_fs cp <src> <dst> | mv <src> <dst> | rm <path> | mkdir <path> | ls <dir> | cat <path> 6// exit 0 ok, non-zero on failure 7// license_tier: ORIGINAL 8import "nx_syscalls.nx" 9const K_MAGIC_65536: i64 = 65536 10 11func fs_w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 12func fs_streq(a: *u8, b: *u8) -> i64 { var i: i64=0; while a[i]!=(0 as u8){ if a[i]!=b[i]{return 0} i=i+1 } if b[i]!=(0 as u8){return 0} return 1 } 13 14// stream copy src -> dst (handles large files + cross-filesystem). 0 ok / 1 no-src / 2 no-dst 15func fs_cp(src: *u8, dst: *u8) -> i64 { 16 let fin: i64 = sys_openat_rd(src); if fin < 0 { return 1 } 17 let out: i64 = sys_openat_wr(dst, 0x1a4); if out < 0 { sys_close(fin); return 2 } 18 let buf: *u8 = sys_mmap(K_MAGIC_65536); var go: i64 = 1 19 while go == 1 { let r: i64 = sys_read(fin, buf, K_MAGIC_65536); if r <= 0 { go = 0 } else { sys_write(out, buf, r) } } 20 sys_close(fin); sys_close(out); return 0 21} 22func fs_rm(path: *u8) -> i64 { return __syscall(263, 0-100, path, 0, 0, 0, 0) } // unlinkat(AT_FDCWD, path, 0) 23// rename (atomic, same-fs); on failure fall back to copy+unlink (cross-fs) 24func fs_mv(src: *u8, dst: *u8) -> i64 { 25 let r: i64 = sys_renameat(src, dst); if r == 0 { return 0 } 26 let c: i64 = fs_cp(src, dst); if c != 0 { return c } 27 fs_rm(src); return 0 28} 29func fs_mkdir(path: *u8) -> i64 { return sys_mkdir(path, 0x1ff) } 30func fs_cat(path: *u8) -> i64 { 31 let fin: i64 = sys_openat_rd(path); if fin < 0 { return 1 } 32 let buf: *u8 = sys_mmap(K_MAGIC_65536); var go: i64 = 1 33 while go == 1 { let r: i64 = sys_read(fin, buf, K_MAGIC_65536); if r <= 0 { go = 0 } else { sys_write(1, buf, r) } } 34 sys_close(fin); return 0 35} 36func fs_ls(dir: *u8) -> i64 { 37 let dfd: i64 = __syscall(257, 0-100, dir, 0x10000, 0, 0, 0); if dfd < 0 { return 1 } 38 let buf: *u8 = sys_mmap(K_MAGIC_65536); let nm: *u8 = sys_mmap(512); var go: i64 = 1 39 while go == 1 { 40 let nread: i64 = __syscall(217, dfd, buf, K_MAGIC_65536, 0, 0, 0) 41 if nread <= 0 { go = 0 } else { 42 var pos: i64 = 0 43 while pos < nread { 44 let reclen: i64 = (buf[pos+16] as i64) | ((buf[pos+17] as i64) << 8) 45 let dtype: i64 = buf[pos+18] as i64 46 var nl: i64 = 0; while buf[pos+19+nl] != (0 as u8) { nm[nl]=buf[pos+19+nl]; nl=nl+1 } nm[nl]=0 as u8 47 var skip: i64 = 0 48 if nl==0 { skip=1 } 49 if nl==1 { if nm[0]==(0x2e as u8) { skip=1 } } 50 if nl==2 { if nm[0]==(0x2e as u8) { if nm[1]==(0x2e as u8) { skip=1 } } } 51 if skip==0 { if dtype==4 { fs_w("d " as *u8) } else { fs_w("- " as *u8) } fs_w(nm); fs_w("\n" as *u8) } 52 if reclen <= 0 { pos = nread } else { pos = pos + reclen } 53 } 54 } 55 } 56 sys_close(dfd); return 0 57} 58 59func main(argc: i64, argv: *i64) -> i64 { 60 if argc < 3 { fs_w("usage: nx_fs cp|mv <src> <dst> | rm|mkdir|cat <path> | ls <dir>\n" as *u8); return 2 } 61 let op: *u8 = argv[1] as *u8 62 if fs_streq(op, "cp" as *u8)==1 { if argc<4 {return 2} let r: i64=fs_cp(argv[2] as *u8, argv[3] as *u8); if r==0 {fs_w("OK cp\n" as *u8)} else {fs_w("FAIL cp\n" as *u8)} return r } 63 if fs_streq(op, "mv" as *u8)==1 { if argc<4 {return 2} let r: i64=fs_mv(argv[2] as *u8, argv[3] as *u8); if r==0 {fs_w("OK mv\n" as *u8)} else {fs_w("FAIL mv\n" as *u8)} return r } 64 if fs_streq(op, "rm" as *u8)==1 { let r: i64=fs_rm(argv[2] as *u8); if r==0 {fs_w("OK rm\n" as *u8)} else {fs_w("FAIL rm\n" as *u8)} return r } 65 if fs_streq(op, "mkdir" as *u8)==1 { let r: i64=fs_mkdir(argv[2] as *u8); if r==0 {fs_w("OK mkdir\n" as *u8)} else {fs_w("FAIL mkdir\n" as *u8)} return r } 66 if fs_streq(op, "ls" as *u8)==1 { return fs_ls(argv[2] as *u8) } 67 if fs_streq(op, "cat" as *u8)==1 { return fs_cat(argv[2] as *u8) } 68 fs_w("unknown op\n" as *u8); return 2 69}