n-m-0.0.1: Main.hs
-------------------------------------------------------------------------------
-- |
-- Module: Main
-- Copyright: (c) 2008 Marco Túlio Gontijo e Silva <marcot@riseup.net>
-- License: Simple permissive license (see LICENSE)
--
-- Maintainer: Marco Túlio Gontijo e Silva <marcot@riseup.net>
-- Stability: unstable
-- Portability: unportable
--
-- Utility to call iwconfig with open networks.
-------------------------------------------------------------------------------
-- base
import Control.Applicative
import Data.List
import Data.Maybe
import Data.IORef
import GHC.Conc
import System.Environment
import System.Exit
-- mtl
import Control.Monad.Reader
-- process
import System.Cmd
-- HSH
import HSH.Command
-- n-m
import Network.Cell
dhclient :: String -> IORef (Maybe ThreadId) -> IO ()
dhclient interface waitThread
= do
exitCode <- system $ "dhclient " ++ interface
when (exitCode == ExitSuccess)
$ readIORef waitThread >>= killThread . fromJust
main :: IO ()
main
= do
interface <- fromMaybe "wlan0" <$> listToMaybe <$> getArgs
run ("iwlist " ++ interface ++ " scan")
>>= iwconfig interface
. getOpenEssids
. getCells
iwconfig :: String -> [String] -> IO ()
iwconfig _ [] = return ()
iwconfig interface (essid : rest)
= do
iWaitThread <- newIORef Nothing
dhclientThread
<- liftIO
$ system ("iwconfig " ++ interface ++ " essid " ++ essid)
>> forkIO (dhclient interface iWaitThread)
waitThread <- forkIO $ wait interface dhclientThread rest
writeIORef iWaitThread $ Just waitThread
wait :: String -> ThreadId -> [String] -> IO ()
wait interface dhclientThread rest
= do
char <- liftIO getChar
if char == 'n'
then liftIO (killThread dhclientThread) >> iwconfig interface rest
else wait interface dhclientThread rest