code wiki / (root) / nx_printers_page.nx

nx_printers_page.nx source

↩ module page · 72 lines · 3046 B

1// nx_printers_page.nx -- LIVE: query the real Brother and write the /printers status page to disk. 2// Reuses transport (read-only Get-Printer-Attributes) + the pure HTML renderer. Writes a local file only 3// (web_assets/printers.html) -- publishing is a separate operator-gated push. never-brick. license_tier: ORIGINAL 4 5import "nx_syscalls.nx" 6import "nx_ipp_codec.nx" 7import "nx_ipp_transport.nx" 8import "nx_printers_render.nx" 9import "nx_toner_ledger.nx" 10import "nx_toner_store.nx" 11const K_MAGIC_131072: i64 = 131072 12const K_MAGIC_65536: i64 = 65536 13 14func p(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 15func pn(v: i64) -> i64 { 16 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 } 17 var m: i64 = v 18 let t: *u8 = sys_mmap(24); var k: i64 = 0 19 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 20 let b: *u8 = sys_mmap(24); var i: i64 = 0 21 while i < k { b[i] = t[k - 1 - i]; i = i + 1 } 22 sys_write(1, b, k); return 0 23} 24func write_all(fd: i64, buf: *u8, len: i64) -> i64 { 25 var sent: i64 = 0 26 while sent < len { 27 let w: i64 = sys_write(fd, ((buf as i64) + sent) as *u8, len - sent) 28 if w <= 0 { return 0 - 1 } 29 sent = sent + w 30 } 31 return 0 32} 33 34func main() -> i64 { 35 let a: i64 = 192 36 let b: i64 = 168 37 let c: i64 = 8 38 let d: i64 = 127 39 let resp: *u8 = sys_mmap(K_MAGIC_131072) 40 let body: *u8 = sys_mmap(K_MAGIC_131072) 41 let out2: *i64 = sys_mmap(16) as *i64 42 var path: *u8 = "/ipp/print" 43 var v: i64 = nx_ipt_query_printer(a, b, c, d, 631, path, resp, K_MAGIC_131072, body, K_MAGIC_131072, 6, out2) 44 var ok: i64 = 0 45 if v == NX_IPT_OK { if out2[0] == 200 { ok = 1 } } 46 if ok == 0 { 47 path = "/ipp/port1" 48 v = nx_ipt_query_printer(a, b, c, d, 631, path, resp, K_MAGIC_131072, body, K_MAGIC_131072, 6, out2) 49 } 50 if v != NX_IPT_OK { p("query failed: "); p(nx_ipt_verdict_name(v)); p("\n"); sys_exit(1); return 1 } 51 52 // real toner from the persistent ledger (measured by coverage; printer's gauge ignored) 53 let y: *i64 = sys_mmap(8) as *i64 54 let cons: *i64 = sys_mmap(8) as *i64 55 var t_bp: i64 = 0 - 1 56 var t_pages: i64 = 0 57 if nx_tstore_load("knowledge/fetched/toner_ledger.bin\x00" as *u8, y, cons) == 1 { 58 t_bp = nx_ledger_remaining_bp(y[0], cons[0]) 59 t_pages = nx_ledger_remaining_pages(y[0], cons[0]) 60 } 61 let html: *u8 = sys_mmap(K_MAGIC_65536) 62 let sc: *i64 = sys_mmap(128) as *i64 63 let hlen: i64 = nx_printers_render(html, body, out2[1], sc, t_bp, t_pages) 64 65 var fd: i64 = sys_openat_wr("web_assets/printers.html\x00" as *u8, 0x1a4) 66 if fd < 0 { fd = sys_openat_wr("knowledge/fetched/printers.html\x00" as *u8, 0x1a4) } 67 if fd < 0 { p("write failed\n"); sys_exit(1); return 1 } 68 if write_all(fd, html, hlen) != 0 { p("write incomplete\n"); sys_close(fd); sys_exit(1); return 1 } 69 sys_close(fd) 70 p("WROTE printers.html ("); pn(hlen); p(" bytes) from live Brother audit\n") 71 sys_exit(0); return 0 72}