packages feed

sshtun-1.0.0: src/Sshtun/Common.hs

-- Copyright: 2012 Dino Morelli
-- License: BSD3 (see LICENSE)
-- Author: Dino Morelli <dino@ui3.info>

module Sshtun.Common
   where

import Control.Concurrent
import Control.Concurrent.STM
import System.Process


data TunnelState
   = Running ProcessHandle
   | Stopped

data DesiredState = Run | Stop

type Shared = (TunnelState, DesiredState)


sleep :: Int -> IO ()
sleep = threadDelay . (*) 1000000


run :: TVar Shared -> IO ()
run shared = do
   atomically $ do
      (tst, _) <- readTVar shared
      writeTVar shared (tst, Run)


stop :: TVar Shared -> IO ()
stop shared = do
   tst <- atomically $ do
      (tst, _) <- readTVar shared
      writeTVar shared (Stopped, Stop)
      return tst
   stopPh tst


stopPh :: TunnelState -> IO ()
stopPh (Running ph) = terminateProcess ph
stopPh Stopped      = return ()