1 #!/home/ralph/src/devuan/rrqforth/rrqforth
3 # Register a netlink socket and listen to events
7 # For deugging purposes, use log" blaha"
8 : log" " TELL NL EMIT ;
10 : VARIABLE ( "word" -- ; create a variable )
11 INPUT @ READ-WORD CREATE DROP
14 : CONSTANT ( v "word" -- ; create a cell constant )
15 INPUT @ READ-WORD CREATE TFA>CFA doVALUE SWAP ! ,
18 : DIE" ( n " quoted" -- ; If v then print message and exit )
19 " ROT IF TELL NL EMIT 1 EXIT THEN 2DROP
22 HEX 100 DECIMAL CONSTANT MSG_WAITALL
23 HEX 80002 DECIMAL CONSTANT SOCK_DGRAM|SOCK_CLOEXEC
24 15 CONSTANT NETLINK_KOBJECT_UEVENT
25 16 CONSTANT AF_NETLINK
26 8192 CONSTANT NL_MAX_PAYLOAD
28 VARIABLE RECV-BUFFER NL_MAX_PAYLOAD ALLOT
31 ( 0-1 .family ) AF_NETLINK W,
33 ( 4-7 .pid ) SYS_GETPID D,
34 ( 8-11 .groups ) -1 D,
35 12 CONSTANT NL_SOCKADDR_SIZE
36 VARIABLE NL-SOCKET -1 ,
38 AF_NETLINK SOCK_DGRAM|SOCK_CLOEXEC NETLINK_KOBJECT_UEVENT
39 SYS_SOCKET DUP 0< DIE" Failed to create socket" NL-SOCKET !
41 NL-SOCKET @ NL-SOCKADDR NL_SOCKADDR_SIZE
42 SYS_BIND DIE" Failed to bind"
46 NL-SOCKET @ RECV-BUFFER NL_MAX_PAYLOAD MSG_WAITALL 0 0
48 IF DROP RECV-BUFFER DUP STRLEN TELL NL EMIT
49 ELSE S" ** Error: " TELL . NL EMIT
54 log" Waiting for uevents..."
57 # Won't come here, but so what?