sig
  type banner = {
    user_name : string;
    class_name : string;
    job_name : string;
  }
  type file_type =
      Text of int * int
    | Bin
    | PS
    | DVI
    | Troff of string * string * string * string
    | Ditroff
    | CIF
    | Plot
    | Pr of string * int
    | Fortran
    | Raster
  type file = {
    name : string;
    size : int;
    nbcopies : int;
    storage : string;
    of_type : Lpd.file_type;
  }
  type job = {
    number : int;
    user : string;
    host : string;
    mailto : string;
    banner : Lpd.banner option;
    files : Lpd.file list;
    addr : Unix.sockaddr;
  }
  type jobref = User of string | Num of int
  type queue_actions = {
    print : unit -> unit;
    on_reception : Lpd.job -> unit;
    send_queue : Lpd.jobref list -> Socket.out_channel -> unit;
    send_queue_long : Lpd.jobref list -> Socket.out_channel -> unit;
    remove : string -> Unix.sockaddr -> Lpd.jobref list -> unit;
  }
  module type CONFIG =
    sig
      val queues : (string * Lpd.queue_actions) list
      val authorized_host : Unix.sockaddr -> bool
      val log : string -> unit
      val temp_dir : string
    end
  module Make :
    functor (C : CONFIG->
      sig
        val socket : ?port:int -> unit -> Unix.file_descr
        val accept :
          ?thread:((unit -> unit) -> unit) ->
          Unix.file_descr ->
          (Unix.sockaddr -> Socket.in_channel -> Socket.out_channel -> unit) ->
          'a
        val daemon :
          Unix.sockaddr -> Socket.in_channel -> Socket.out_channel -> unit
      end
  val string_of_current_time : unit -> string
  val header_of_job : string -> string
  val string_of_job : int -> Lpd.job -> string
  val long_string_of_job : int -> Lpd.job -> string
  val any_host : Unix.sockaddr -> bool
  val these_hosts : ?file:string -> string list -> Unix.sockaddr -> bool
end