From b8ac9e5279ecbb2829e46b3883b78db2210c7924 Mon Sep 17 00:00:00 2001 From: Daniel Barlow Date: Tue, 23 Apr 2024 23:33:11 +0100 Subject: [PATCH] convert devout from minisock to lualinux --- pkgs/devout/default.nix | 6 ++-- pkgs/devout/devout.fnl | 63 +++++++++++++++++++++++------------------ 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/pkgs/devout/default.nix b/pkgs/devout/default.nix index 04a36b2..522a1ca 100644 --- a/pkgs/devout/default.nix +++ b/pkgs/devout/default.nix @@ -6,7 +6,7 @@ , fennel , stdenv , fennelrepl -, minisock +, lualinux }: stdenv.mkDerivation { name = "devout"; @@ -15,12 +15,12 @@ stdenv.mkDerivation { installPhase = '' mkdir -p $out/bin cp -p ${writeFennel "devout" { - packages = [fennel anoia nellie lua.pkgs.luafilesystem minisock]; + packages = [fennel anoia nellie lua.pkgs.luafilesystem lualinux]; mainFunction = "run"; } ./devout.fnl} $out/bin/devout ''; checkPhase = '' - LUA_CPATH=${minisock}/lib/lua/5.3/?.so\;$LUA_CPATH \ + LUA_CPATH=${lualinux}/lib/lua/5.3/?.so\;$LUA_CPATH \ fennelrepl ./test.fnl ''; doCheck = true; diff --git a/pkgs/devout/devout.fnl b/pkgs/devout/devout.fnl index b9ef9e4..95fe02e 100644 --- a/pkgs/devout/devout.fnl +++ b/pkgs/devout/devout.fnl @@ -1,8 +1,8 @@ -(local sock (require :minisock)) +(local ll (require :lualinux)) (local { : view } (require :fennel)) (fn trace [expr] - (doto expr (print :TRACE (view expr)))) + (do (print :TRACE (view expr)) expr)) (fn parse-uevent [s] (let [at (string.find s "@" 1 true) @@ -50,29 +50,39 @@ :unsubscribe (fn [_ id] (tset subscribers id nil)) })) -;; #define POLLIN 0x0001 -;; #define POLLPRI 0x0002 -;; #define POLLOUT 0x0004 -;; #define POLLERR 0x0008 -;; #define POLLHUP 0x0010 -;; #define POLLNVAL 0x0020 +;; grepped from kernel headers + +(local POLLIN 0x0001) +(local POLLPRI 0x0002) +(local POLLOUT 0x0004) +(local POLLERR 0x0008) +(local POLLHUP 0x0010) +(local POLLNVAL 0x0020) + +(local AF_LOCAL 1) +(local AF_NETLINK 16) +(local SOCK_STREAM 1) +(local SOCK_DGRAM 2) +(local SOCK_RAW 3) +(local NETLINK_KOBJECT_UEVENT 15) (fn unix-socket [name] - (let [addr (.. "\1\0" name "\0\0\0\0\0") - (sock err) (sock.bind addr)] - (assert sock err))) + (let [addr (.. "\1\0" name "\0\0\0\0\0")] + (match (ll.socket AF_LOCAL SOCK_STREAM 0) + fd (match (ll.bind fd addr) + 0 (doto fd (ll.listen 32)) + (nil err) (values nil err)) + (nil err) (values nil err)))) (fn pollfds-for [fds] - (table.concat (icollect [_ v (ipairs fds)] (string.pack "iHH" v 1 0)))) + (icollect [_ v (ipairs fds)] + (bor (lshift v 32) (lshift 1 16)))) (fn unpack-pollfds [pollfds] - (var i 1) - (let [fds {}] - (while (< i (# pollfds)) - (let [(fd _ revents i_) (string.unpack "iHH" pollfds i)] - (if (> revents 0) (tset fds fd revents)) - (set i i_))) - fds)) + (collect [_ v (ipairs pollfds)] + (let [fd (band (rshift v 32) 0xffffffff) + revent (band v 0xffff)] + (values fd revent)))) (fn parse-terms [str] (print :terms str) @@ -80,7 +90,7 @@ (string.match n "(.-)=(.+)"))) (fn handle-client [db client] - (match (trace (sock.read client)) + (match (ll.read client) "" (do (db:unsubscribe client) false) @@ -88,7 +98,7 @@ (db:subscribe client (fn [e] - (sock.write client (view e))) + (ll.write client (view e))) (parse-terms s)) true) (nil err) (do (print err) false))) @@ -101,7 +111,7 @@ (each [fd revent (pairs revents)] (when (not ((. fds fd) fd)) (tset fds fd nil) - (sock.close fd)))) + (ll.close fd)))) :fds #(icollect [fd _ (pairs fds)] fd) :_tbl #(do fds) ;exposed for tests })) @@ -113,15 +123,14 @@ loop (event-loop)] (loop:register s - #(match (sock.accept s) + #(match (ll.accept s) (client addr) (do (loop:register client (partial handle-client db)) true))) (while true - (let [pollfds (pollfds-for (loop:fds)) - (rpollfds numfds) (sock.poll pollfds 1000)] - (when (> numfds 0) - (loop:feed (unpack-pollfds rpollfds))))))) + (let [pollfds (pollfds-for (loop:fds))] + (ll.poll pollfds 5000) + (loop:feed (unpack-pollfds pollfds)))))) { : database : run : event-loop }