3 # Open a raw socket to sniff an interface; output to stdout
5 (signal 2 (fn (x) (exit 0)))
8 (constant 'library "/lib/x86_64-linux-gnu/libc.so.6")
9 (import library "ioctl" "int" "int" "long" "void*" )
10 (import library "perror" "void" "char*" )
11 (import library "fdopen" "void*" "int" "char*" )
12 (import library "setbuf" "void" "void*" "void*" )
13 (import library "ntohs" "int" "int" )
14 (import library "htons" "int" "int" )
15 (import library "inet_addr" "void*" "void*")
16 (import library "socket" "int" "int" "int" "int")
17 (import library "setsockopt" "int" "int" "int" "int" "void*" "int")
18 (import library "perror" "void" "char*")
19 (setf bind-socket (import library "bind" "int" "int" "void*" "int"))
22 (perror (join (map string (args)) " "))
27 (IPPROTO_RAW (htons 0x0800)) ; htons(ETH_P_IP)
28 (IPPROTO_ALL (htons 0x0003)) ; htons(ETH_P_ALL)
33 (SIZEOF_struct_sockaddr 16)
36 (socket AF_INET SOCK_RAW IPPROTO_ALL))
38 (define (bind-to-device FD IFACE)
39 (when (!= (setsockopt FD SOL_SOCKET SO_BINDTODEVICE IFACE (length IFACE)))
40 (die "setsockopt bind to device"))
41 (when (!= (setsockopt FD SOL_SOCKET SO_BROADCAST (pack "lu" 1) 4))
42 (die "setsockopt broadcast"))
49 (setf IFACE (main-args -1) FD (LIBC6:raw-socket) )
54 (when (!= (LIBC6:bind-to-device FD IFACE))
55 (LIBC6:die "bind-to-device"))
62 (define (add-show-table IP SZ)
63 (TBL IP (+ (or (TBL IP) 0) SZ))
64 (let ((NOW (date-value)))
66 (when (> (- NOW SHOW) 5) (setf SHOW NOW))
69 (let ((OUT '()) (x 0))
71 (let ((IP (LN 0)) (N (LN 1)))
72 (TOT IP (+ (or (TOT IP) 0) N))
73 (TOT IP (max 0 (- (or (TOT IP) 0) 10000)))
74 (push (list IP (TOT IP) (TBL IP)) OUT -1)
78 (if (> (x 2)) (or (= (y 2)) (> (x 1) (y 1)))
80 (= (y 2)) (> (x 1) (y 1))))))
83 (when (setf x (pop OUT))
84 (unless (> (x 1)) (setf x nil)))
85 (println (or x "")))))))
90 (LIBC6:setbuf (LIBC6:fdopen 1 "w") 0)
92 (define (ipv4-packet) ; BUFFER
93 (let ((IPV4SRC (unpack "bbbb" (30 BUFFER)))) ; 14+12
94 (add-show-table (join (map string IPV4SRC) ".") (length BUFFER))))
96 (while (> (setf N (read FD BUFFER 2048)) 0)
97 (when (> (length BUFFER) 34)
98 (let ((MACHDR (unpack "bbbbbb bbbbbb bb" BUFFER)))
99 ;(write-line 1 (string MACHDR))
100 (when (= (-2 MACHDR) '(8 0)) (ipv4-packet)))))