-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathmain.ml
78 lines (63 loc) · 1.91 KB
/
main.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
module C = Cmdliner
let timeout = 2000
let run = ref true
let buf = Bytes.make 20 '@'
let create_socket path =
let sock = Unix.(socket PF_UNIX SOCK_STREAM 0) in
let addr = Unix.ADDR_UNIX path in
Unix.bind sock addr ; Unix.listen sock 10 ; sock
let accept epoll sock =
let fd, _ = Unix.accept sock in
Polly.add epoll fd Polly.Events.(inp)
let ( +++ ) = Polly.Events.( lor )
let ready = Polly.Events.(inp +++ hup)
let other = Polly.Events.(lnot ready)
let process sock epoll fd events count =
if fd = sock && Polly.Events.(test events inp) then (
accept epoll sock ; count
) else (
( if Polly.Events.(test events ready) then
match Unix.read fd buf 0 20 with
| 0 ->
Unix.close fd
| n ->
Unix.write Unix.stdout buf 0 n |> ignore
) ;
if Polly.Events.(test events other) then Unix.close fd ;
count + 1
)
let polly path =
let epoll = Polly.create () in
let sock = create_socket path in
let clean () = try Unix.unlink path with _ -> () in
at_exit clean ;
Polly.add epoll sock Polly.Events.(inp) ;
while !run do
match Polly.wait_fold epoll 10 timeout 0 (process sock) with
| _ ->
()
| exception Unix.Unix_error (Unix.EINTR, _, _) ->
()
done
module Command = struct
let help =
[
`S "BUGS"; `P "Check bug reports at https://github.com/lindig/polly/issues"
]
let path =
C.Arg.(
value
& pos 0 string "polly.sock"
& info [] ~docv:"FILE" ~doc:"Socket to read from"
)
let polly =
let doc = "Read from multiple connections, write to stdout" in
let info = C.Cmd.info "polly" ~doc ~man:help in
C.(Cmd.v info Term.(const polly $ path))
end
let main () =
let signal _ = exit 1 in
Sys.set_signal Sys.sigterm (Sys.Signal_handle signal) ;
Sys.set_signal Sys.sigint (Sys.Signal_handle signal) ;
C.Cmd.eval Command.polly
let () = if !Sys.interactive then () else main () |> exit