diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2021-12-01 22:10:39 +0100 | 
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2021-12-02 21:25:26 +0100 | 
| commit | cac8f382588e33c83f533936ba980ed06d4340aa (patch) | |
| tree | c729ddb5c25b67cf4128c116f7e1978607254055 /src/Main.hs | |
| parent | d722b2045d028e80786109947ceef1aaffa569eb (diff) | |
Network: automatically find broadcast addresses
Diffstat (limited to 'src/Main.hs')
| -rw-r--r-- | src/Main.hs | 44 | 
1 files changed, 33 insertions, 11 deletions
| diff --git a/src/Main.hs b/src/Main.hs index 54c5714..8d6f8de 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -22,6 +22,7 @@ import Data.Typeable  import Network.Socket +import System.Console.GetOpt  import System.Console.Haskeline  import System.Environment @@ -39,6 +40,26 @@ import Storage  import Storage.Merge  import Sync +data Options = Options +    { optServer :: ServerOptions +    } + +defaultOptions :: Options +defaultOptions = Options +    { optServer = defaultServerOptions +    } + +options :: [OptDescr (Options -> Options)] +options = +    [ Option ['p'] ["port"] +        (ReqArg (\p -> so $ \opts -> opts { serverPort = read p }) "PORT") +        "local port to bind" +    , Option ['s'] ["silent"] +        (NoArg (so $ \opts -> opts { serverLocalDiscovery = False })) +        "do not send announce packets for local discovery" +    ] +    where so f opts = opts { optServer = f $ optServer opts } +  main :: IO ()  main = do      st <- liftIO $ openStorage . fromMaybe "./.erebos" =<< lookupEnv "EREBOS_DIR" @@ -88,12 +109,16 @@ main = do                          BC.putStrLn . showRefDigest . refDigest . storedRef . idData =<< interactiveIdentityUpdate idt                      | otherwise -> error "invalid identity" -        [bhost] -> interactiveLoop st (Just bhost) -        []      -> interactiveLoop st Nothing -        _       -> error "Unrecognized options" +        args -> do +            opts <- case getOpt Permute options args of +                (o, [], []) -> return (foldl (flip id) defaultOptions o) +                (_, _, errs) -> ioError (userError (concat errs ++ usageInfo header options)) +                    where header = "Usage: erebos [OPTION...]" +            interactiveLoop st opts -interactiveLoop :: Storage -> Maybe String -> IO () -interactiveLoop st bhost = runInputT defaultSettings $ do + +interactiveLoop :: Storage -> Options -> IO () +interactiveLoop st opts = runInputT defaultSettings $ do      erebosHead <- liftIO $ loadLocalStateHead st      outputStrLn $ T.unpack $ displayIdentity $ headLocalIdentity erebosHead @@ -103,10 +128,7 @@ interactiveLoop st bhost = runInputT defaultSettings $ do      let extPrintLn str = extPrint $ case reverse str of ('\n':_) -> str                                                          _ -> str ++ "\n";      server <- liftIO $ do -        let sopt = defaultServerOptions -                { serverLocalDiscovery = bhost -                } -        startServer sopt erebosHead extPrintLn +        startServer (optServer opts) erebosHead extPrintLn              [ SomeService @AttachService Proxy              , SomeService @SyncService Proxy              , SomeService @ContactService Proxy @@ -312,8 +334,8 @@ cmdDiscoveryInit = void $ do      (hostname, port) <- (words <$> asks ciLine) >>= return . \case          hostname:p:_ -> (hostname, p) -        [hostname] -> (hostname, discoveryPort) -        [] -> ("discovery.erebosprotocol.net", discoveryPort) +        [hostname] -> (hostname, show discoveryPort) +        [] -> ("discovery.erebosprotocol.net", show discoveryPort)      addr:_ <- liftIO $ getAddrInfo (Just $ defaultHints { addrSocketType = Datagram }) (Just hostname) (Just port)      peer <- liftIO $ serverPeer server (addrAddress addr)      sendToPeer self peer $ DiscoverySelf (T.pack "ICE") 0 |