diff options
author | Roman Smrž <roman.smrz@seznam.cz> | 2025-06-02 19:50:40 +0200 |
---|---|---|
committer | Roman Smrž <roman.smrz@seznam.cz> | 2025-06-04 21:44:21 +0200 |
commit | 255e8baa916f9103dc703447474ca38ba118abe8 (patch) | |
tree | 3cd01833b36a6df6309bcfefee117b91d0992cc7 /src/Network/Ip.hs | |
parent | 23a5528e2b5a6008b3572a172e5f1671a13d28b8 (diff) |
Diffstat (limited to 'src/Network/Ip.hs')
-rw-r--r-- | src/Network/Ip.hs | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/Network/Ip.hs b/src/Network/Ip.hs index a4fdf50..3750793 100644 --- a/src/Network/Ip.hs +++ b/src/Network/Ip.hs @@ -19,6 +19,7 @@ module Network.Ip ( addNetworkNamespace, setNetworkNamespace, textNetnsName, + runInNetworkNamespace, callOn, Link(..), @@ -33,6 +34,7 @@ module Network.Ip ( addRoute, ) where +import Control.Concurrent import Control.Concurrent.STM import Control.Exception import Control.Monad @@ -142,12 +144,20 @@ foreign import ccall unsafe "sched.h setns" c_setns :: CInt -> CInt -> IO CInt c_CLONE_NEWNET :: CInt c_CLONE_NEWNET = 0x40000000 +runInNetworkNamespace :: NetworkNamespace -> IO a -> IO a +runInNetworkNamespace netns act = do + mvar <- newEmptyMVar + void $ forkOS $ do + setNetworkNamespace netns + putMVar mvar =<< act + takeMVar mvar + + textNetnsName :: NetworkNamespace -> Text textNetnsName = netnsName callOn :: HasNetns a => a -> Text -> IO () -callOn n cmd = callCommand $ T.unpack $ "ip netns exec \"" <> ns <> "\" " <> cmd - where ns = textNetnsName $ getNetns n +callOn n cmd = runInNetworkNamespace (getNetns n) $ callCommand $ T.unpack cmd data Link a = Link |