summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Gayot <olivier.gayot@sigexec.com>2020-01-09 12:17:45 +0100
committerOlivier Gayot <olivier.gayot@sigexec.com>2020-01-09 14:38:41 +0100
commitfd543247fd1004043ca748052115d96b22a39067 (patch)
treee6c69e2ff933e4a0a6e5e1b5204b7abcc716e677
parent1973427f962122ab6dc251546f20393a2be33e5b (diff)
Read/write from both stdin/stdout and the sockHEADmaster
Signed-off-by: Olivier Gayot <olivier.gayot@sigexec.com>
-rw-r--r--netcat.ml20
1 files changed, 15 insertions, 5 deletions
diff --git a/netcat.ml b/netcat.ml
index 53c9521..5fcaa28 100644
--- a/netcat.ml
+++ b/netcat.ml
@@ -1,12 +1,22 @@
(** Connect to addr and port and start communicating **)
let nc addr port =
let rec discuss csock =
- let buffer = Bytes.create 5 in
- let n = Unix.recv csock buffer 0 (Bytes.length buffer) [] in
- match n with
- | 0 -> ()
- | _ -> ignore (Unix.write Unix.stdout buffer 0 n); discuss csock
+ let aux input output =
+ let buffer = Bytes.create 256 in
+ let n = Unix.read input buffer 0 (Bytes.length buffer) in
+ match n with
+ | 0 -> ()
+ | _ -> ignore (Unix.write output buffer 0 n); discuss csock
+ in
+
+ match Unix.select [Unix.stdin; csock] [] [] (-1.) with
+ | (fds, _, _) -> (
+ match List.hd fds == Unix.stdin with
+ | true -> aux Unix.stdin csock
+ | false -> aux csock Unix.stdout
+ )
in
+
let sock = Unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 in
Unix.connect sock (Unix.ADDR_INET (Unix.inet_addr_of_string addr, port));
discuss sock