Skip to content
This repository has been archived by the owner on May 22, 2018. It is now read-only.

Commit

Permalink
Add some optional parameters to Stunnel.disconnect to cope with the s…
Browse files Browse the repository at this point in the history
…tunnel zombie process issue and for future benefits.

Signed-off-by: Zheng Li <dev@zheng.li>
  • Loading branch information
zli committed Apr 20, 2010
1 parent c123f14 commit 40ff8b3
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 6 deletions.
27 changes: 22 additions & 5 deletions stunnel/stunnel.ml
Expand Up @@ -130,12 +130,29 @@ let config_file verify_cert extended_diagnosis host port =

let ignore_exn f x = try f x with _ -> ()

let disconnect x =
let rec disconnect ?(wait = true) ?(force = false) x =
List.iter (ignore_exn Unix.close) [ x.fd ];
match x.pid with
| FEFork pid -> ignore(Forkhelpers.waitpid pid)
| StdFork pid -> ignore(Unix.waitpid [] pid)
| Nopid -> ()
let waiter, pid = match x.pid with
| FEFork pid ->
(fun () ->
(if wait then Forkhelpers.waitpid
else Forkhelpers.waitpid_nohang) pid),
Forkhelpers.getpid pid
| StdFork pid ->
(fun () ->
(if wait then Unix.waitpid []
else Unix.waitpid [Unix.WNOHANG]) pid),
pid in
let res =
try waiter ()
with Unix.Unix_error (Unix.ECHILD, _, _) -> pid, Unix.WEXITED 0 in
match res with
| 0, _ when force ->
(try Unix.kill pid Sys.sigkill
with Unix.Unix_error (Unix.ESRCH, _, _) ->());
disconnect ~wait:wait ~force:force x
| _ -> ()


(* With some probability, stunnel fails during its startup code before it reads
the config data from us. Therefore we get a SIGPIPE writing the config data.
Expand Down
2 changes: 1 addition & 1 deletion stunnel/stunnel.mli
Expand Up @@ -53,7 +53,7 @@ val connect :
string -> int -> t

(** Disconnects from stunnel and cleans up *)
val disconnect : t -> unit
val disconnect : ?wait:bool -> ?force:bool -> t -> unit

val diagnose_failure : t -> unit

Expand Down

0 comments on commit 40ff8b3

Please sign in to comment.