code wiki / (root) / nx_state_spool.nx

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}