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}