summaryrefslogtreecommitdiffstats
path: root/otherlibs/unix/unix.ml
diff options
context:
space:
mode:
Diffstat (limited to 'otherlibs/unix/unix.ml')
-rw-r--r--otherlibs/unix/unix.ml46
1 files changed, 38 insertions, 8 deletions
diff --git a/otherlibs/unix/unix.ml b/otherlibs/unix/unix.ml
index 033e4ea32..394daaac5 100644
--- a/otherlibs/unix/unix.ml
+++ b/otherlibs/unix/unix.ml
@@ -158,8 +158,18 @@ type file_perm = int
external openfile : string -> open_flag list -> file_perm -> file_descr
= "unix_open"
external close : file_descr -> unit = "unix_close"
-external read : file_descr -> string -> int -> int -> int = "unix_read"
-external write : file_descr -> string -> int -> int -> int = "unix_write"
+external unsafe_read : file_descr -> string -> int -> int -> int = "unix_read"
+external unsafe_write : file_descr -> string -> int -> int -> int = "unix_write"
+
+let read fd buf ofs len =
+ if len < 0 or ofs + len >= String.length buf
+ then invalid_arg "Unix.read"
+ else unsafe_read fd buf ofs len
+let write fd buf ofs len =
+ if len < 0 or ofs + len >= String.length buf
+ then invalid_arg "Unix.write"
+ else unsafe_write fd buf ofs len
+
external in_channel_of_descr : file_descr -> in_channel = "open_descriptor"
external out_channel_of_descr : file_descr -> out_channel = "open_descriptor"
external descr_of_in_channel : in_channel -> file_descr = "channel_descriptor"
@@ -349,17 +359,37 @@ external listen : file_descr -> int -> unit = "unix_listen"
external shutdown : file_descr -> shutdown_command -> unit = "unix_shutdown"
external getsockname : file_descr -> sockaddr = "unix_getsockname"
external getpeername : file_descr -> sockaddr = "unix_getpeername"
-external recv : file_descr -> string -> int -> int -> msg_flag list -> int
+
+external unsafe_recv :
+ file_descr -> string -> int -> int -> msg_flag list -> int
= "unix_recv"
-external recvfrom :
- file_descr -> string -> int -> int -> msg_flag list -> int * sockaddr
+external unsafe_recvfrom :
+ file_descr -> string -> int -> int -> msg_flag list -> int * sockaddr
= "unix_recvfrom"
-external send : file_descr -> string -> int -> int -> msg_flag list -> int
+external unsafe_send :
+ file_descr -> string -> int -> int -> msg_flag list -> int
= "unix_send"
-external sendto :
- file_descr -> string -> int -> int -> msg_flag list -> sockaddr -> int
+external unsafe_sendto :
+ file_descr -> string -> int -> int -> msg_flag list -> sockaddr -> int
= "unix_sendto" "unix_sendto_native"
+let recv fd buf ofs len flags =
+ if len < 0 or ofs + len >= String.length buf
+ then invalid_arg "Unix.recv"
+ else unsafe_recv fd buf ofs len flags
+let recvfrom fd buf ofs len flags =
+ if len < 0 or ofs + len >= String.length buf
+ then invalid_arg "Unix.recvfrom"
+ else unsafe_recvfrom fd buf ofs len flags
+let send fd buf ofs len flags =
+ if len < 0 or ofs + len >= String.length buf
+ then invalid_arg "Unix.send"
+ else unsafe_send fd buf ofs len flags
+let sendto fd buf ofs len flags addr =
+ if len < 0 or ofs + len >= String.length buf
+ then invalid_arg "Unix.sendto"
+ else unsafe_sendto fd buf ofs len flags addr
+
type host_entry =
{ h_name : string;
h_aliases : string array;