summaryrefslogtreecommitdiff
path: root/src/Process/Signal.hs
blob: f6619f66194ee98240cc2c01b6b60e44874b6c0e (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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
module Process.Signal (
    Signal(..),
    signalBuiltins,
    signalProcess,
) where

import Control.Monad.IO.Class

import Data.Text (Text)
import Data.Text qualified as T

import Script.Expr

import System.Posix qualified as Posix


newtype Signal = Signal Posix.Signal
    deriving (Eq, Ord)

instance ExprType Signal where
    textExprType _ = "Signal"
    textExprValue (Signal sig)
        | sig == Posix.sigHUP = "SIGHUP"
        | sig == Posix.sigINT = "SIGINT"
        | sig == Posix.sigQUIT = "SIGQUIT"
        | sig == Posix.sigILL = "SIGILL"
        | sig == Posix.sigTRAP = "SIGTRAP"
        | sig == Posix.sigABRT = "SIGABRT"
        | sig == Posix.sigBUS = "SIGBUS"
        | sig == Posix.sigFPE = "SIGFPE"
        | sig == Posix.sigKILL = "SIGKILL"
        | sig == Posix.sigUSR1 = "SIGUSR1"
        | sig == Posix.sigSEGV = "SIGSEGV"
        | sig == Posix.sigUSR2 = "SIGUSR2"
        | sig == Posix.sigPIPE = "SIGPIPE"
        | sig == Posix.sigALRM = "SIGALRM"
        | sig == Posix.sigTERM = "SIGTERM"
        | sig == Posix.sigCHLD = "SIGCHLD"
        | sig == Posix.sigCONT = "SIGCONT"
        | sig == Posix.sigSTOP = "SIGSTOP"
        | sig == Posix.sigTSTP = "SIGTSTP"
        | sig == Posix.sigTTIN = "SIGTTIN"
        | sig == Posix.sigTTOU = "SIGTTOU"
        | sig == Posix.sigURG = "SIGURG"
        | sig == Posix.sigXCPU = "SIGXCPU"
        | sig == Posix.sigXFSZ = "SIGXFSZ"
        | sig == Posix.sigVTALRM = "SIGVTALRM"
        | sig == Posix.sigPROF = "SIGPROF"
        | sig == Posix.sigPOLL = "SIGPOLL"
        | sig == Posix.sigSYS = "SIGSYS"
        | otherwise = "<SIG_" <> T.pack (show sig) <> ">"


signalBuiltins :: [ ( Text, SomeVarValue ) ]
signalBuiltins = map (fmap someConstValue)
    [ ( "SIGHUP", Signal Posix.sigHUP )
    , ( "SIGINT", Signal Posix.sigINT )
    , ( "SIGQUIT", Signal Posix.sigQUIT )
    , ( "SIGILL", Signal Posix.sigILL )
    , ( "SIGTRAP", Signal Posix.sigTRAP )
    , ( "SIGABRT", Signal Posix.sigABRT )
    , ( "SIGBUS", Signal Posix.sigBUS )
    , ( "SIGFPE", Signal Posix.sigFPE )
    , ( "SIGKILL", Signal Posix.sigKILL )
    , ( "SIGUSR1", Signal Posix.sigUSR1 )
    , ( "SIGSEGV", Signal Posix.sigSEGV )
    , ( "SIGUSR2", Signal Posix.sigUSR2 )
    , ( "SIGPIPE", Signal Posix.sigPIPE )
    , ( "SIGALRM", Signal Posix.sigALRM )
    , ( "SIGTERM", Signal Posix.sigTERM )
    , ( "SIGCHLD", Signal Posix.sigCHLD )
    , ( "SIGCONT", Signal Posix.sigCONT )
    , ( "SIGSTOP", Signal Posix.sigSTOP )
    , ( "SIGTSTP", Signal Posix.sigTSTP )
    , ( "SIGTTIN", Signal Posix.sigTTIN )
    , ( "SIGTTOU", Signal Posix.sigTTOU )
    , ( "SIGURG", Signal Posix.sigURG )
    , ( "SIGXCPU", Signal Posix.sigXCPU )
    , ( "SIGXFSZ", Signal Posix.sigXFSZ )
    , ( "SIGVTALRM", Signal Posix.sigVTALRM )
    , ( "SIGPROF", Signal Posix.sigPROF )
    , ( "SIGPOLL", Signal Posix.sigPOLL )
    , ( "SIGSYS", Signal Posix.sigSYS )
    ]


signalProcess :: MonadIO m => Signal -> Posix.ProcessID -> m ()
signalProcess (Signal sig) pid = liftIO $ Posix.signalProcess sig pid