sig
  type error = Magic | Connect
  exception Error of (JoinHelper.error * string)
  type fork_args =
      No_argument
    | Same_arguments of string array
    | Argument_generator of (int -> string array)
  val filter_clients : string array -> string array
  val do_forks : string -> JoinHelper.fork_args -> int -> int list
  type configuration = {
    mutable host : string;
    mutable port : int;
    mutable clients : int;
    mutable forked_program : string;
    mutable fork_args : JoinHelper.fork_args;
    mutable magic_id : string;
    mutable magic_value : string;
  }
  val default_configuration : unit -> JoinHelper.configuration
  val make_commandline :
    JoinHelper.configuration -> (Arg.key * Arg.spec * Arg.doc) list
  type 'a lookup_function = Join.Ns.t -> string -> 'a
  val lookup_once : 'JoinHelper.lookup_function
  val lookup_times : int -> float -> 'JoinHelper.lookup_function
  type at_fail_chan = unit Join.chan
  val do_at_fail : (unit -> unit) -> JoinHelper.at_fail_chan
  val do_nothing_at_fail : JoinHelper.at_fail_chan
  val exit_at_fail_with_code : int -> JoinHelper.at_fail_chan
  val exit_at_fail : JoinHelper.at_fail_chan
  val check_magic : Join.Ns.t -> JoinHelper.configuration -> unit
  val connect : JoinHelper.configuration -> Join.Site.t * Join.Ns.t
  val init_client :
    ?at_fail:JoinHelper.at_fail_chan ->
    JoinHelper.configuration -> Join.Ns.t * int list
  val init_client_with_lookup :
    ?at_fail:JoinHelper.at_fail_chan ->
    ?lookup:'JoinHelper.lookup_function ->
    JoinHelper.configuration -> string -> Join.Ns.t * int list * 'a
  val listen : JoinHelper.configuration -> unit
  val init_server : JoinHelper.configuration -> Join.Ns.t * int list
  val init_server_with_register :
    JoinHelper.configuration -> string -> '-> Join.Ns.t * int list
  val wait_forever : unit -> 'a
end