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 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
30 : PRINTMSG ( n -- ; print RECV-BUFFER message )
31 ( n is message length when >0 but we only use text up to first NUL )
33 IF DROP RECV-BUFFER DUP STRLEN TELL NL EMIT
34 ELSE S" ** Error: " TELL . NL EMIT
39 ( 0-1 .family ) AF_NETLINK W,
41 ( 4-7 .pid ) SYS_GETPID D,
42 ( 8-11 .groups ) -1 D,
43 12 CONSTANT NL_SOCKADDR_SIZE
44 VARIABLE NL-SOCKET -1 ,
46 AF_NETLINK SOCK_DGRAM|SOCK_CLOEXEC NETLINK_KOBJECT_UEVENT
47 SYS_SOCKET DUP 0< DIE" Failed to create socket" NL-SOCKET !
49 NL-SOCKET @ NL-SOCKADDR NL_SOCKADDR_SIZE
50 SYS_BIND DIE" Failed to bind"
54 NL-SOCKET @ RECV-BUFFER NL_MAX_PAYLOAD MSG_WAITALL 0 0
59 log" Waiting for uevents..."
62 # Won't come here, but so what?