code wiki / (root) / nx_texr_descriptor_capture_gate_t279.nx

nx_texr_descriptor_capture_gate_t279.nx source

↩ module page · 36 lines · 1822 B

1import "nx_tool_run.nx" 2func dg_len(s:*u8)->i64{var n:i64=0;while s[n]!=0 as u8{n=n+1};return n} 3func dg_equal(a:*u8,an:i64,b:*u8,bn:i64)->i64{ 4 if an!=bn{return 0};var i:i64=0;while i<an{if a[i]!=b[i]{return 0};i=i+1};return 1 5} 6func main(argc:i64,argv:*i64)->i64{ 7 if argc!=5{return 2} 8 let t:*u8=argv[4] as *u8;var timeout:i64=0;var ti:i64=0 9 while t[ti]!=0 as u8{let d:i64=(t[ti] as i64)-48;if d<0||d>9{return 2};if timeout>(9223372036854775807-d)/10{return 2};timeout=timeout*10+d;ti=ti+1} 10 if timeout<=0{return 2} 11 let size:*i64=sys_mmap_try(__size_of(i64)) as *i64 12 let capture:*NxBufOwned=sys_mmap_try(__size_of(NxBufOwned)) as *NxBufOwned 13 let args:*i64=sys_mmap_try(4*__size_of(i64)) as *i64 14 if (size as i64)<=0||(capture as i64)<=0||(args as i64)<=0{return 3} 15 capture.buf=0 as *u8;capture.len=0;capture.cap=0 16 let expected:*u8=sys_map_file(argv[3] as *u8,size) 17 if (expected as i64)<=0{return 4} 18 args[0]=argv[1];args[1]="inspect" as *u8 as i64;args[2]=argv[2];args[3]=0 19 let rc:i64=tr_run_capture_owned(argv[1] as *u8,args,capture,timeout,0,0 as *u8) 20 var ok:i64=0 21 if rc==0{ok=dg_equal(capture.buf,capture.len,expected,size[0])} 22 var negative:i64=0 23 if capture.len>0{ 24 let prior:u8=capture.buf[0];capture.buf[0]=((prior as i64)+1) as u8 25 negative=(dg_equal(capture.buf,capture.len,expected,size[0])==0) as i64 26 capture.buf[0]=prior 27 } 28 let released:i64=nx_bo_release(capture) 29 let unmapped:i64=sys_munmap_direct(expected,size[0]) 30 sys_munmap_direct(size as *u8,__size_of(i64)) 31 sys_munmap_direct(capture as *u8,__size_of(NxBufOwned)) 32 sys_munmap_direct(args as *u8,4*__size_of(i64)) 33 if ok!=1||negative!=1||released!=0||unmapped!=0{return 5} 34 let message:*u8="DESCRIPTOR-CAPTURE exact-complete-stdout=PASS changed-byte-negative=PASS owned-release=PASS\n" 35 sys_write(1,message,dg_len(message));return 0 36}