module Network.WoL
( sendWoLMagicPacket
, send
, magicPacket
) where
import Network.MacAddress
import qualified Data.ByteString as BS
import Network.BSD
import Network.Socket hiding (send, sendTo, recv, recvFrom)
import Network.Socket.ByteString 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
sendTo s (magicPacket addr) sockAddr
sClose s
magicPacket :: MacAddress -> BS.ByteString
magicPacket addr =
let prefix = replicate 6 $ fromIntegral 255
addr' = bytes addr
in BS.pack $ prefix ++ concat (replicate 16 addr')
udp :: ProtocolNumber
udp = 17