code wiki / _hdl_build / nx_odt_gate.nx

nx_odt_gate.nx source

↩ module page · 74 lines · 6140 B

1// nx_odt_gate.nx -- proves sovereign OpenDocument (.odt) interop by driving the REAL /tmp/nx_odt.sov.elf: 2// ROUND-TRIP : write 3 paragraphs -> read back faithfully, incl XML special chars '&' and '<' 3// ODF SHAPE : valid ZIP (PK\x03\x04); the FIRST package entry is `mimetype` and it is STORED (method 0) -- 4// the ODF magic requirement; content.xml + META-INF/manifest.xml present 5// GREEN iff 8/8. Requires /tmp/nx_odt.sov.elf. Durable knowledge/status/odt_gate.log. license_tier: ORIGINAL 6import "nx_syscalls.nx" 7 8func d_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 9func d_num(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" 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 } 10func d_w(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 } 11func d_wn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; 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(fd,bb,k); return 0 } 12func d_strlen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n } 13func d_read(path: *u8, buf: *u8, cap: i64) -> i64 { 14 let fd: i64=sys_openat_rd(path); if fd<0 { return 0 } 15 var total: i64=0; var nrd: i64=sys_read(fd, buf, cap) 16 while nrd>0 { total=total+nrd; if total>=cap { nrd=0 } else { nrd=sys_read(fd, ((buf as i64)+total) as *u8, cap-total) } } 17 sys_close(fd); return total 18} 19func d_contains(hay: *u8, n: i64, needle: *u8) -> i64 { 20 let nl: i64=d_strlen(needle); if nl==0 { return 0 } 21 var i: i64=0 22 while i+nl<=n { var j: i64=0; var hit: i64=1; while j<nl { if hay[i+j]!=needle[j] { hit=0; j=nl } else { j=j+1 } } if hit==1 { return 1 } i=i+1 } 23 return 0 24} 25func d_run(elf: *u8, args: *i64, nargs: i64, out_path: *u8) -> i64 { 26 let pid: i64=sys_fork() 27 if pid==0 { 28 let o: i64=sys_openat_wr(out_path, 0x1a4); if o>=0 { sys_dup3(o,1,0) } 29 let argv: *i64=sys_mmap(8*16) as *i64 30 argv[0]=elf as i64 31 var i: i64=0; while i<nargs { argv[1+i]=args[i]; i=i+1 } argv[1+nargs]=0 32 let envp: *i64=sys_mmap(16) as *i64; envp[0]="PATH=/usr/bin:/bin" as *u8 as i64; envp[1]=0 33 sys_execve(elf, argv, envp); sys_exit(127) 34 } 35 let st: *i64=sys_mmap(16) as *i64; sys_wait4(pid, st, 0); return (st[0]>>8)&0xff 36} 37 38func main() -> i64 { 39 d_puts("=== ODT (OpenDocument) GATE: sovereign round-trip + ODF mimetype-first-stored ===\n" as *u8) 40 let ODT: *u8="/tmp/nx_odt.sov.elf" as *u8 41 let docp: *u8="/tmp/odt_gate.odt" as *u8 42 let outp: *u8="/tmp/odt_gate_read.txt" as *u8 43 let obuf: *u8=sys_mmap(262144) 44 let a: *i64=sys_mmap(8*8) as *i64 45 46 a[0]="write" as *u8 as i64; a[1]=docp as i64 47 a[2]="Article One of the will." as *u8 as i64 48 a[3]="To Smith & Sons, the law firm." as *u8 as i64 49 a[4]="If estate < 50000 then skip probate." as *u8 as i64 50 d_run(ODT, a, 5, outp) 51 52 var pass: i64=0; let rows: i64=8 53 a[0]="read" as *u8 as i64; a[1]=docp as i64 54 d_run(ODT, a, 2, outp); var rn: i64=d_read(outp, obuf, 262144) 55 d_puts(" R1 round-trip ('Article One of the will.')? " as *u8); if d_contains(obuf,rn,"Article One of the will." as *u8)==1 { pass=pass+1; d_puts("YES PASS\n" as *u8) } else { d_puts("NO FAIL\n" as *u8) } 56 d_puts(" R2 '&' survived ('Smith & Sons')? " as *u8); if d_contains(obuf,rn,"Smith & Sons" as *u8)==1 { pass=pass+1; d_puts("YES PASS\n" as *u8) } else { d_puts("NO FAIL\n" as *u8) } 57 d_puts(" R3 '<' survived ('estate < 50000')? " as *u8); if d_contains(obuf,rn,"estate < 50000" as *u8)==1 { pass=pass+1; d_puts("YES PASS\n" as *u8) } else { d_puts("NO FAIL\n" as *u8) } 58 59 var fn: i64=d_read(docp, obuf, 262144) 60 d_puts(" R4 valid ZIP: begins PK\\x03\\x04? " as *u8); if fn>=4 { if obuf[0]==(0x50 as u8) { if obuf[1]==(0x4b as u8) { if obuf[2]==(3 as u8) { if obuf[3]==(4 as u8) { pass=pass+1; d_puts("YES PASS\n" as *u8) } else { d_puts("NO FAIL\n" as *u8) } } else { d_puts("NO FAIL\n" as *u8) } } else { d_puts("NO FAIL\n" as *u8) } } else { d_puts("NO FAIL\n" as *u8) } } else { d_puts("NO FAIL\n" as *u8) } 61 // first entry filename at offset 30 must be "mimetype" 62 var mt: i64=0 63 if fn>=38 { if obuf[30]==(109 as u8) { if obuf[31]==(105 as u8) { if obuf[32]==(109 as u8) { if obuf[33]==(101 as u8) { if obuf[34]==(116 as u8) { if obuf[35]==(121 as u8) { if obuf[36]==(112 as u8) { if obuf[37]==(101 as u8) { mt=1 } } } } } } } } } 64 d_puts(" R5 first entry is 'mimetype'? " as *u8); if mt==1 { pass=pass+1; d_puts("YES PASS\n" as *u8) } else { d_puts("NO FAIL\n" as *u8) } 65 d_puts(" R6 mimetype is STORED (method 0 at offset 8)? " as *u8); if fn>=10 { if obuf[8]==(0 as u8) { if obuf[9]==(0 as u8) { pass=pass+1; d_puts("YES PASS\n" as *u8) } else { d_puts("NO FAIL\n" as *u8) } } else { d_puts("NO FAIL\n" as *u8) } } else { d_puts("NO FAIL\n" as *u8) } 66 d_puts(" R7 content.xml present? " as *u8); if d_contains(obuf,fn,"content.xml" as *u8)==1 { pass=pass+1; d_puts("YES PASS\n" as *u8) } else { d_puts("NO FAIL\n" as *u8) } 67 d_puts(" R8 META-INF/manifest.xml present? " as *u8); if d_contains(obuf,fn,"META-INF/manifest.xml" as *u8)==1 { pass=pass+1; d_puts("YES PASS\n" as *u8) } else { d_puts("NO FAIL\n" as *u8) } 68 69 d_puts("----\nODT rows=" as *u8); d_num(rows); d_puts(" pass=" as *u8); d_num(pass); d_puts("\n" as *u8) 70 let lg: i64=sys_openat_append("knowledge/status/odt_gate.log" as *u8, 0x1a4) 71 if lg>=0 { d_w(lg, "ODT rows=" as *u8); d_wn(lg, rows); d_w(lg, " pass=" as *u8); d_wn(lg, pass); if pass==rows { d_w(lg, " verdict=GREEN\n" as *u8) } else { d_w(lg, " verdict=RED\n" as *u8) } sys_close(lg) } 72 if pass==rows { d_puts("ODT GREEN (sovereign read/write of a valid, LibreOffice-openable .odt)\n" as *u8); sys_exit(0); return 0 } 73 d_puts("ODT RED\n" as *u8); sys_exit(1); return 1 74}