nx_fs_create_boundary_gate_t247.nx source
↩ module page · 24 lines · 1677 B
1import "nx_fs_create_lib.nx"
2func main(argc:i64,argv:*i64)->i64{
3 if argc!=3{return 2}
4 let path:*u8=argv[1] as *u8;let collision:*u8=argv[2] as *u8
5 let body:*u8="retained";let changed:*u8="modified"
6 let a:i64=fxc_create(path,body,8);if a!=8&&a!=FXC_EXISTS{return 3}
7 if fxc_create(path,changed,8)!=FXC_EXISTS{return 4}
8 let ln:*i64=sys_mmap_try(8) as *i64;let read:*u8=sys_map_file(path,ln);if (read as i64)==0{return 5}
9 var good:i64=1;var i:i64=0;if ln[0]!=8{good=0}else{while i<8{if read[i]!=body[i]{good=0};i=i+1}}
10 sys_munmap_direct(read,ln[0]);if good!=1{return 6}
11 // Reproduce this process's temporary filename to distinguish scratch from destination existence.
12 let pn:i64=vw_slen(collision);let pid:i64=osp_selfpid();var digits:i64=1;var q:i64=pid;while q>=10{digits=digits+1;q=q/10}
13 let size:i64=pn+4+digits+1;let tmp:*u8=sys_mmap_try(size);i=0;while i<pn{tmp[i]=collision[i];i=i+1}
14 let suffix:*u8=".nxc";var j:i64=0;while j<4{tmp[i]=suffix[j];i=i+1;j=j+1};i=nxi_buf(tmp,i,pid);tmp[i]=0 as u8
15 let fd:i64=__syscall(SYS_OPENAT,AT_FDCWD,tmp,FXC_OPEN_EXCLUSIVE,MODE_0644,0,0);if fd<0{return 7};sys_close(fd)
16 let refused:i64=fxc_create(collision,body,8)
17 let still:i64=sys_openat_rd(tmp);if still>=0{sys_close(still)}
18 let absent:i64=sys_openat_rd(collision);if absent>=0{sys_close(absent)}
19 sys_unlinkat(tmp);sys_munmap_direct(tmp,size);sys_munmap_direct(ln as *u8,8)
20 if refused!=-16||still<0||absent>=0{return 8}
21 if fxc_create(0 as *u8,body,8)!=FXC_IO{return 9}
22 if fxc_create(path,body,-1)!=FXC_IO{return 10}
23 fsx_puts("CREATE-BOUNDARY PASS exact-existing-preserved scratch-busy-distinct scratch-preserved destination-absent invalid-boundaries\n");return 0
24}