blob: 98422f3d0a6a5e67d2f356224d0119d6cc97086b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
-- |
-- Module: CGroup.Types
-- Copyright: (c) 2014 Tomislav Viljetić
-- License: BSD3
-- Maintainer: Tomislav Viljetić <tomislav@viljetic.de>
--
module CGroup.Types
(
-- * CGroup
CGroup
, cgroup
, cgroupPath
-- * Other types
, ProcessID
) where
import Data.Monoid
import qualified System.FilePath as FP
-- | A 'CGroup' is defined by two 'FilePath's, a mount point and a cgroup
-- name. The mount point specifies where the cgroup hierarchy is mounted.
-- The cgroup name is a directory, relative to the mount point.
data CGroup = CGroup { mountPoint, cgroupName :: FilePath }
deriving Show
-- | Smart constructor. Takes a mount point and a cgroup name.
-- It will return 'Nothing' if the cgroup could point outside the mount point,
-- i.e. if the cgroup name is an absolute path, or contains @".."@.
cgroup :: FilePath -> FilePath -> Maybe CGroup
cgroup mp0 cgn0
| ".." `elem` parts = Nothing
| FP.isAbsolute cgn = Nothing
| otherwise = Just CGroup { mountPoint = mp, cgroupName = cgn }
where
mp = normaliseMountPoint mp0
cgn = normaliseCGroupName cgn0
parts = FP.splitDirectories cgn
normaliseMountPoint = FP.addTrailingPathSeparator . FP.normalise
normaliseCGroupName = FP.dropTrailingPathSeparator . FP.normalise
-- | Path of a cgroup's tasks file.
cgroupPath :: CGroup -> FilePath
cgroupPath CGroup { mountPoint = mp, cgroupName = cgn } =
mp <> cgn
type ProcessID = Int
|