code wiki / _hdl_build / nx_prlimit_probe.nx
nx_prlimit_probe.nx source
↩ module page · 34 lines · 1799 B
1// nx_prlimit_probe.nx -- diagnostic: what does nx_prlimit(0, RLIMIT_AS, ...) actually return?
2import "nx_syscalls.nx"
3func pp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
4func pn(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m; sys_write(1,"-\x00" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1}; while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
5func main() -> i64 {
6 // 1. READ current RLIMIT_AS (new=0, old=&buf)
7 let cur: *u8 = sys_mmap(16)
8 let rc_read: i64 = nx_prlimit(0, RLIMIT_AS, 0 as *u8, cur)
9 let curp: *i64 = cur as *i64
10 pp("read RLIMIT_AS rc=\x00" as *u8); pn(rc_read); pp(" cur=\x00" as *u8); pn(curp[0]); pp(" max=\x00" as *u8); pn(curp[1]); pp("\n\x00" as *u8)
11
12 // 2. SET RLIMIT_AS to 256MB, read back old
13 let nl: *u8 = sys_mmap(16)
14 let ol: *u8 = sys_mmap(16)
15 let nlp: *i64 = nl as *i64
16 nlp[0] = 0x10000000
17 nlp[1] = 0x10000000
18 let rc_set: i64 = nx_prlimit(0, RLIMIT_AS, nl, ol)
19 pp("set 256MB rc=\x00" as *u8); pn(rc_set); pp("\n\x00" as *u8)
20
21 // 3. READ BACK the now-enforced limit
22 let cur2: *u8 = sys_mmap(16)
23 let rc_read2: i64 = nx_prlimit(0, RLIMIT_AS, 0 as *u8, cur2)
24 let cur2p: *i64 = cur2 as *i64
25 pp("readback rc=\x00" as *u8); pn(rc_read2); pp(" cur=\x00" as *u8); pn(cur2p[0]); pp("\n\x00" as *u8)
26
27 // 4. try RLIMIT_CPU set/read too (alt resource if AS is touchy)
28 let cl: *u8 = sys_mmap(16)
29 let clp: *i64 = cl as *i64
30 let rc_cpu: i64 = nx_prlimit(0, RLIMIT_CPU, 0 as *u8, cl)
31 pp("read RLIMIT_CPU rc=\x00" as *u8); pn(rc_cpu); pp(" cur=\x00" as *u8); pn(clp[0]); pp("\n\x00" as *u8)
32 sys_exit(0)
33 return 0
34}