open Sys;;
open Unix;;
open Inet;;

(** Fonction de recopie *)
let netcat machine port =
  let socket = open_connection machine port in
  ignore (signal sigpipe Signal_ignore);
  let buffer_size = 1024 in
  let buffer = String.create buffer_size in
  let descriptors = ref [socket;stdinin
  let rec multiplex () =
    let read,_,_ = select !descriptors [] [] (-1.) in
    List.iter copy read;
  and copy fd =
    begin
      if fd = socket then
        begin
          match read socket buffer 0 buffer_size with
            0 -> close socket
          | nb -> ignore (write stdout buffer 0 nb); multiplex ()
        end
      else
        begin
          match read stdin buffer 0 buffer_size with
            0 ->  descriptors := [socket]; multiplex ()
          | nb -> ignore (write socket buffer 0 nb); multiplex()
        end
    end in
  try  multiplex ()  with _ -> raise (Failure "netcat IO error");;

(** Récupération des arguments *)
let main () =
  if Array.length Sys.argv <> 3 then
    begin
      prerr_endline ("Usage: "^Sys.argv.(0)^" machine port");
      exit 1
    end
  else
    try
      let address = inet_addr_of_name Sys.argv.(1) in
      let port = port_of_string  Sys.argv.(2) in
      netcat address port
    with Failure message ->
        prerr_endline message;
        exit 2;;

main ();;