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}