code wiki / _hdl_build / nx_fileop_intent_gate_20260910.nx
nx_fileop_intent_gate_20260910.nx source
↩ module page · 31 lines · 4245 B
1import "nx_fileop.nx"
2import "nx_gate_verdict.nx"
3func fg_path(root:*u8,name:*u8)->*u8 { let n:i64=fi_len(root);let m:i64=fi_len(name);let p:*u8=sys_mmap(n+m+2);fi_copy(p,root,n);p[n]=47 as u8;fi_copy(p+n+1,name,m+1);return p }
4func fg_write(path:*u8,text:*u8)->i64 { let fd:i64=sys_openat_exclusive(path,MODE_0600);if fd<0 { return fd };let w:*NxFileWriteResult=sys_mmap(__size_of(NxFileWriteResult)) as *NxFileWriteResult;return fio_write_sync_fd(fd,text,fi_len(text),w) }
5func fg_unchanged(path:*u8,text:*u8)->i64 { let hash:*u8=sys_mmap(32);let scratch:*u8=sys_mmap(64);sha256_digest(text,fi_len(text),hash);return (fio_verify_sha256(path,hash,scratch,64)==0) as i64 }
6func fg_plan_match(path:*u8,av:*i64,hashes:*u8)->i64 { let p:*NxFileInstallPlan=sys_mmap(__size_of(NxFileInstallPlan)) as *NxFileInstallPlan;fi_plan_init(p);let rc:i64=fi_plan_read(path,8192,p);if rc!=0 { return 0 };let same:i64=fo_plan_matches(p,av,hashes,hashes+32,493);fi_plan_close(p);return same }
7func main(argc:i64,argv:*i64)->i64 {
8 var root:*u8=0 as *u8;if argc==2 { root=argv[1] as *u8 };if argc==4 && fo_streq(argv[1] as *u8,"exists")==1 { root=argv[3] as *u8 };if (root as i64)==0 { return 2 };if fi_path_valid(root)==0 || sys_mkdir(root,0x1c0)!=0 { return 2 }
9 let c:*i64=gv_ctr();let av:*i64=sys_mmap(11*8) as *i64;av[0]="nx_fileop" as i64;av[1]="prepare-install-intent" as i64
10 av[2]=fg_path(root,"intent") as i64;av[3]=fg_path(root,"source") as i64;av[4]=fg_path(root,"live") as i64;av[5]=fg_path(root,"candidate") as i64;av[6]=fg_path(root,"backup") as i64
11 av[7]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" as i64;av[8]="bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" as i64;av[9]="493" as i64;av[10]="8192" as i64
12 if fg_write(av[3] as *u8,"SOURCE")!=0 || fg_write(av[4] as *u8,"LIVE")!=0 { return 4 }
13 gv_check("create-real-durable-intent",fo_prepare_intent(11,av)==0,c)
14 let p:*NxFileInstallPlan=sys_mmap(__size_of(NxFileInstallPlan)) as *NxFileInstallPlan;fi_plan_init(p);let hashes:*u8=sys_mmap(64);fo_digest(av[7] as *u8,hashes);fo_digest(av[8] as *u8,hashes+32)
15 gv_check("native-decode-exact-paths-mode-digests",fg_plan_match(av[2] as *u8,av,hashes)==1,c);fi_plan_close(p)
16 gv_check("identical-replay-success",fo_prepare_intent(11,av)==0,c)
17 av[9]="420" as i64;gv_check("conflicting-mode-refused",fo_prepare_intent(11,av)==3,c);av[9]="493" as i64
18 av[7]="cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" as i64;gv_check("conflicting-digest-refused",fo_prepare_intent(11,av)==3,c)
19 av[7]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" as i64
20 gv_check("existing-intent-unchanged-after-conflicts",fg_plan_match(av[2] as *u8,av,hashes)==1,c);fi_plan_close(p)
21 av[2]=fg_path(root,"invalid") as i64;av[7]="bad" as i64;gv_check("invalid-digest-no-output",fo_prepare_intent(11,av)==3 && fio_exists(av[2] as *u8)==0,c);av[7]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" as i64
22 av[9]="512" as i64;gv_check("mode-outside-permission-bits-no-output",fo_prepare_intent(11,av)==3 && fio_exists(av[2] as *u8)==0,c);av[9]="493" as i64
23 av[10]="9223372036854775808" as i64;gv_check("budget-overflow-no-output",fo_prepare_intent(11,av)==3 && fio_exists(av[2] as *u8)==0,c)
24 av[10]="1" as i64;gv_check("insufficient-budget-no-output",fo_prepare_intent(11,av)==3 && fio_exists(av[2] as *u8)==0,c);av[10]="8192" as i64
25 av[2]=fg_path(root,"corrupt") as i64;if fg_write(av[2] as *u8,"CORRUPT")!=0 { return 4 };gv_check("corrupt-existing-intent-preserved",fo_prepare_intent(11,av)==3 && fg_unchanged(av[2] as *u8,"CORRUPT")==1,c)
26 av[2]=av[4];gv_check("intent-cannot-be-live-path",fo_prepare_intent(11,av)==3 && fg_unchanged(av[4] as *u8,"LIVE")==1,c)
27 av[2]=fg_path(root,"alias-absent") as i64;av[5]=av[2];gv_check("intent-cannot-create-candidate-path",fo_prepare_intent(11,av)==3 && fio_exists(av[2] as *u8)==0,c)
28 gv_check("wrong-argc-refused",fo_prepare_intent(10,av)==3,c)
29 gv_check("source-and-live-unchanged",fg_unchanged(av[3] as *u8,"SOURCE")==1 && fg_unchanged(av[4] as *u8,"LIVE")==1 && fio_exists(av[6] as *u8)==0,c)
30 return gv_verdict("FILEOP-INTENT",c,"actual preparation only; no source/live publication; conflicting and malformed records retained")
31}