package posix-signal

  1. Overview
  2. Docs

Source file posix_signal.ml

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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
open Ctypes
open Posix_signal_types
include Posix_signal_stubs.Def (Posix_signal_generated_stubs)

type sigset = Types.sigset_t ptr

type signal =
  [ `Sigabrt
  | `Sigalrm
  | `Sigbus
  | `Sigchld
  | `Sigcont
  | `Sigfpe
  | `Sighup
  | `Sigill
  | `Sigint
  | `Sigkill
  | `Sigpipe
  | `Sigquit
  | `Sigsegv
  | `Sigstop
  | `Sigterm
  | `Sigtstp
  | `Sigttin
  | `Sigttou
  | `Sigusr1
  | `Sigusr2
  | `Sigtrap
  | `Sigurg
  | `Sigxcpu
  | `Sigxfsz ]

let int_of_signal = function
  | `Sigabrt -> sigabrt
  | `Sigalrm -> sigalrm
  | `Sigbus -> sigbus
  | `Sigchld -> sigchld
  | `Sigcont -> sigcont
  | `Sigfpe -> sigfpe
  | `Sighup -> sighup
  | `Sigill -> sigill
  | `Sigint -> sigint
  | `Sigkill -> sigkill
  | `Sigpipe -> sigpipe
  | `Sigquit -> sigquit
  | `Sigsegv -> sigsegv
  | `Sigstop -> sigstop
  | `Sigterm -> sigterm
  | `Sigtstp -> sigtstp
  | `Sigttin -> sigttin
  | `Sigttou -> sigttou
  | `Sigusr1 -> sigusr1
  | `Sigusr2 -> sigusr2
  | `Sigtrap -> sigtrap
  | `Sigurg -> sigurg
  | `Sigxcpu -> sigxcpu
  | `Sigxfsz -> sigxfsz

type action = [ `Sig_block | `Sig_setmask | `Sig_unblock ]

let int_of_action = function
  | `Sig_block -> sig_block
  | `Sig_setmask -> sig_setmask
  | `Sig_unblock -> sig_unblock

let sigemptyset () =
  Errno_unix.with_unix_exn (fun () ->
      Errno_unix.raise_on_errno (fun () ->
          let p = allocate_n Types.sigset_t ~count:1 in
          match sigemptyset p with x when x < 0 -> None | _ -> Some p))

let sigaddset sigset signal =
  Errno_unix.with_unix_exn (fun () ->
      Errno_unix.raise_on_errno (fun () ->
          let signal = int_of_signal signal in
          match sigaddset sigset signal with
            | x when x < 0 -> None
            | _ -> Some ()))

let sigismember sigset signal =
  Errno_unix.with_unix_exn (fun () ->
      Errno_unix.raise_on_errno (fun () ->
          let signal = int_of_signal signal in
          match sigismember sigset signal with
            | x when x < 0 -> None
            | 1 -> Some true
            | _ -> Some false))

let pthread_sigmask action sigset =
  Errno_unix.with_unix_exn (fun () ->
      Errno_unix.raise_on_errno (fun () ->
          let action = int_of_action action in
          let sigset =
            match sigset with
              | Some p -> p
              | None -> from_voidp Types.sigset_t null
          in
          let old_sigset = allocate_n Types.sigset_t ~count:1 in
          match pthread_sigmask action sigset old_sigset with
            | x when x < 0 -> None
            | _ -> Some old_sigset))

let sigprocmask action sigset =
  Errno_unix.with_unix_exn (fun () ->
      Errno_unix.raise_on_errno (fun () ->
          let action = int_of_action action in
          let sigset =
            match sigset with
              | Some p -> p
              | None -> from_voidp Types.sigset_t null
          in
          let old_sigset = allocate_n Types.sigset_t ~count:1 in
          match sigprocmask action sigset old_sigset with
            | x when x < 0 -> None
            | _ -> Some old_sigset))
OCaml

Innovation. Community. Security.