nx_state_spool.nx source
↩ module page · 62 lines · 2575 B
1// nx_state_spool.nx -- CLI of the store-and-forward state spool (CR-R1a; NAS=hub, laptop=worker:
2// sync to the NAS whenever reachable, go local when it isn't, drain on reconnect).
3// usage:
4// nx_state_spool spool <spoolfile> <line> append one state line locally (flock'd)
5// nx_state_spool drain <spoolfile> <transport_elf> deliver each line via transport (argv[1]=
6// line, exit 0=delivered); failures KEPT
7// lock = <spoolfile>.lock, tmp = <spoolfile>.tmp (atomic rewrite). Exit 0 on success (kept>0 is
8// NOT an error -- offline is a normal state); 2 = usage; 3 = spool/lock failure.
9// license_tier: ORIGINAL expect_exit: 0
10import "nx_syscalls.nx"
11import "nx_state_spool_core.nx"
12const K_MAGIC_1024: i64 = 1024
13
14func sp_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
15
16func sp_putn(v: i64) -> i64 {
17 let b: *u8 = sys_mmap(32)
18 let e: i64 = ccz_cat_num(b, 0, v)
19 sys_write(1, b, e)
20 return 0
21}
22
23func sp_streq(a: *u8, b: *u8) -> i64 {
24 var i: i64 = 0
25 while a[i] != (0 as u8) { if a[i] != b[i] { return 0 } i = i + 1 }
26 if b[i] != (0 as u8) { return 0 }
27 return 1
28}
29
30func main(argc: i64, argv: *i64) -> i64 {
31 if argc < 4 { sp_puts("usage: nx_state_spool spool <file> <line> | drain <file> <transport_elf>\n" as *u8); return 2 }
32 let sub: *u8 = argv[1] as *u8
33 let spool: *u8 = argv[2] as *u8
34 let lock: *u8 = sys_mmap(K_MAGIC_1024)
35 var o: i64 = 0
36 o = ccz_cat_str(lock, o, spool)
37 o = ccz_cat_str(lock, o, ".lock" as *u8)
38 if sp_streq(sub, "spool" as *u8) == 1 {
39 let r: i64 = ssp_spool(spool, lock, argv[3] as *u8)
40 if r < 0 { sp_puts("SSP spool-failed\n" as *u8); return 3 }
41 sp_puts("SSP spooled\n" as *u8)
42 return 0
43 }
44 if sp_streq(sub, "drain" as *u8) == 1 {
45 let tmp: *u8 = sys_mmap(K_MAGIC_1024)
46 var t: i64 = 0
47 t = ccz_cat_str(tmp, t, spool)
48 t = ccz_cat_str(tmp, t, ".tmp" as *u8)
49 let sent: *i64 = sys_mmap(16) as *i64
50 let kept: *i64 = sys_mmap(16) as *i64
51 let r: i64 = ssp_drain(spool, lock, tmp, argv[3] as *u8, sent, kept)
52 if r < 0 { sp_puts("SSP drain-failed (lock/tmp)\n" as *u8); return 3 }
53 sp_puts("SSP drain sent=" as *u8)
54 sp_putn(sent[0])
55 sp_puts(" kept=" as *u8)
56 sp_putn(kept[0])
57 sp_puts("\n" as *u8)
58 return 0
59 }
60 sp_puts("usage: nx_state_spool spool <file> <line> | drain <file> <transport_elf>\n" as *u8)
61 return 2
62}