module Network.WoL
( sendWoLMagicPacket
, send
, magicPacket
) where
import Network.MacAddress
import Data.Char
import Network.BSD
import Network.Socket hiding (send)
sendWoLMagicPacket :: String -> String -> Int -> IO ()
sendWoLMagicPacket host addr port = do
he <- getHostByName host
let ha = hostAddress he
ma = parse addr
send ha ma (fromIntegral port)
send :: HostAddress -> MacAddress -> PortNumber -> IO ()
send host addr port = do
s <- socket AF_INET Datagram udp
setSocketOption s Broadcast 1
let sockAddr = SockAddrInet port host
Network.Socket.sendTo s (magicPacket addr) sockAddr
sClose s
magicPacket :: MacAddress -> String
magicPacket addr =
let prefix = replicate 6 '\255'
addr' = map (chr . fromIntegral) (bytes addr)
in prefix ++ concat (replicate 16 addr')
udp :: ProtocolNumber
udp = 17