From 4512b33fa96bd7c877bb08b6644ddd62245cebd0 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Tue, 4 Jul 2023 13:17:03 +0100 Subject: [PATCH] Move SUBSYSTEM and DEVPATH to record fields These attributes seem to always be present so don't label them. --- README.md | 9 ++++----- src/syndev.nim | 42 +++++++++++++++++++++++++++--------------- syndev.nimble | 2 +- uevent.prs | 2 +- 4 files changed, 33 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 1f4db68..bcc1a34 100644 --- a/README.md +++ b/README.md @@ -28,9 +28,8 @@ Example Syndicate server configuration: Example message stream: ``` - - - - - + +,uevent "hidraw" "/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.2/0003:248A:5B2F.0011/hidraw/hidraw2" add {DEVNAME: "hidraw2", MAJOR: 247, MINOR: 2} 3980> + + ``` diff --git a/src/syndev.nim b/src/syndev.nim index 4ed6faa..77e71f5 100644 --- a/src/syndev.nim +++ b/src/syndev.nim @@ -41,7 +41,7 @@ proc openUeventSocket: AsyncSocket = proc main(facet: Facet; ds: Ref; sock: AsyncSocket) = var buf = newString(1 shl 14) - msg = initRecord("uevent", 0.toPreserve, "".toSymbol, initDictionary()) + msg = initRecord("uevent", "".toPreserve, "".toPreserve, "".toSymbol, initDictionary(), 0.toPreserve) key, val: string proc recvUevent {.gcsafe.} = let fut = recvInto(sock, buf[0].addr, buf.len) @@ -55,22 +55,34 @@ proc main(facet: Facet; ds: Ref; sock: AsyncSocket) = inc i, skipWhile(buf, {'\0'}, i) inc i, parseUntil(buf, key, {'=', '@'}, i) if i < n: - if buf[i] == '@': - if msg.record[2].dict.len > 0: - cannonicalize(msg.record[1]) + let sep = buf[i] + inc i, parseUntil(buf, val, '\0', i+1)+1 + case sep + of '@': + if msg.record[3].dict.len > 0: + cannonicalize(msg.record[3]) message(turn, ds, msg) - msg.record[2].dict.setLen(0) - inc i, parseUntil(buf, val, '\0', i+1)+1 - elif key == "SEQNUM": - var seqnum: int - inc i, parseInt(buf, seqnum, i+1)+1 - msg.record[0].int = seqnum.BiggestInt - else: - inc i, parseUntil(buf, val, '\0', i+1)+1 - if key == "ACTION": - msg.record[1].symbol = Symbol val + msg.record[3].dict.setLen(0) + of '=': + if key == "SUBSYSTEM": + msg.record[0].string = val + elif key == "DEVPATH": + msg.record[1].string = val + elif key == "ACTION": + msg.record[2].symbol = Symbol val + elif key == "SEQNUM": + discard parseBiggestInt(val, msg.record[4].int) else: - add(msg.record[2].dict, (key.toSymbol, val.toPreserve,)) + # TODO: check if val can be an integer + var num: BiggestInt + if parseBiggestInt(val, num) == val.len: + add(msg.record[3].dict, (key.toSymbol, num.toPreserve,)) + else: + add(msg.record[3].dict, (key.toSymbol, val.toPreserve,)) + val.setLen(0) + else: + stderr.writeLine "uevent parser synchronization lost" + break recvUevent() recvUevent() diff --git a/syndev.nimble b/syndev.nimble index 3447004..5d43f3d 100644 --- a/syndev.nimble +++ b/syndev.nimble @@ -1,6 +1,6 @@ # Package -version = "20230702" +version = "20230704" author = "Emery Hemingway" description = "Syndicated actor for publishing Linux device events" license = "Unlicense" diff --git a/uevent.prs b/uevent.prs index 6794646..733bf6a 100644 --- a/uevent.prs +++ b/uevent.prs @@ -1,3 +1,3 @@ version 1. -Uevent = . +Uevent = .