nx_fio_write_gate.nx source
↩ module page · 48 lines · 3232 B
1// Real-kernel controls for the shared write/sync/close boundary.
2// argv[1] is an exclusive private fixture pathname; successful fixtures remain evidence.
3import "nx_fio.nx"
4import "nx_gate_verdict.nx"
5func fw_same(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 };return b[i]==(0 as u8) }
6func main(argc: i64,argv: *i64) -> i64 {
7 if argc!=2 { return 2 }
8 let ctr: *i64=gv_ctr()
9 let result: *NxFileWriteResult=sys_mmap(__size_of(NxFileWriteResult)) as *NxFileWriteResult
10 let fds: *i64=sys_mmap(16) as *i64
11 let got: *u8=sys_mmap(16)
12 if (result as i64)<0 || (fds as i64)<0 || (got as i64)<0 { return 3 }
13 let payload: *u8="proof"
14 let fd: i64=sys_openat_exclusive(argv[1] as *u8,384)
15 gv_check("exclusive-fixture-created",fd>=0,ctr)
16 if fd<0 { return 3 }
17 let rc: i64=fio_write_sync_fd(fd,payload,5,result)
18 gv_check("regular-file-write-sync-close",rc==0 && result.written==5 && result.close_code==0 && fw_same(result.stage,"complete")==1,ctr)
19 gv_check("successful-helper-consumed-descriptor",sys_close(fd)==(0-9),ctr)
20 let rd: i64=sys_openat_rd(argv[1] as *u8)
21 if rd<0 { return 3 }
22 let count: i64=sys_read(rd,got,16)
23 gv_check("retained-payload-exact",count==5 && got[0]==(112 as u8) && got[1]==(114 as u8) && got[2]==(111 as u8) && got[3]==(111 as u8) && got[4]==(102 as u8),ctr)
24 let bad: i64=fio_write_sync_fd(rd,payload,5,result)
25 gv_check("read-only-write-failure-preserved",bad==(0-9) && fw_same(result.stage,"write")==1 && result.written==0 && result.close_code==0,ctr)
26 gv_check("failed-write-consumed-descriptor",sys_close(rd)==(0-9),ctr)
27 let pipe_rc: i64=sys_pipe2(fds,0)
28 gv_check("pipe-created",pipe_rc==0,ctr)
29 if pipe_rc!=0 { return 3 }
30 let reader: i64=fds[0]&0xffffffff
31 let writer: i64=(fds[0]>>32)&0xffffffff
32 let sync_rc: i64=fio_write_sync_fd(writer,payload,5,result)
33 gv_check("actual-pipe-fsync-failure-preserved",sync_rc==FIO_EINVAL && fw_same(result.stage,"fsync")==1 && result.written==5 && result.close_code==0,ctr)
34 gv_check("fsync-failure-consumed-descriptor",sys_close(writer)==(0-9),ctr)
35 let received: i64=sys_read(reader,got,16)
36 gv_check("failed-sync-still-reports-written-bytes",received==5,ctr)
37 sys_close(reader)
38 let inputfd:i64=sys_openat_rd(argv[1] as *u8)
39 let inputrc:i64=fio_write_sync_fd(inputfd,payload,0-1,result)
40 gv_check("invalid-length-closes-valid-descriptor",inputrc==FIO_EINVAL && result.written==0 && result.close_code==0 && fw_same(result.stage,"input")==1 && sys_close(inputfd)==(0-9),ctr)
41 let nullfd:i64=sys_openat_rd(argv[1] as *u8)
42 let nullrc:i64=fio_write_sync_fd(nullfd,0 as *u8,1,result)
43 gv_check("null-positive-body-closes-valid-descriptor",nullrc==FIO_EINVAL && result.close_code==0 && fw_same(result.stage,"input")==1 && sys_close(nullfd)==(0-9),ctr)
44 let invalid: i64=fio_write_sync_fd(0-1,payload,5,result)
45 gv_check("primary-and-close-errors-both-retained",invalid==(0-9) && result.code==(0-9) && result.close_code==(0-9) && fw_same(result.stage,"write")==1,ctr)
46 sys_munmap(result as *u8,__size_of(NxFileWriteResult));sys_munmap(fds as *u8,16);sys_munmap(got,16)
47 return gv_verdict("nx_fio_write_gate",ctr,"real file/read-only/pipe controls; isolated close failure after successful fsync not simulated")
48}