Import Upstream version 20180207
[hcoop/debian/mlton.git] / basis-library / net / inet-sock.sml
CommitLineData
7f918cf1
CE
1(* Copyright (C) 2002-2008 Henry Cejtin, Matthew Fluet, Suresh
2 * Jagannathan, and Stephen Weeks.
3 *
4 * MLton is released under a BSD-style license.
5 * See the file MLton-LICENSE for details.
6 *)
7
8structure INetSock:> INET_SOCK =
9 struct
10 structure Prim = PrimitiveFFI.Socket.INetSock
11
12 datatype inet = INET (* a phantom type*)
13 type 'sock_type sock = (inet, 'sock_type) Socket.sock
14 type 'mode stream_sock = 'mode Socket.stream sock
15 type dgram_sock = Socket.dgram sock
16 type sock_addr = inet Socket.sock_addr
17
18 val inetAF = Net.AddrFamily.fromRep PrimitiveFFI.Socket.AF.INET
19
20 fun toAddr (in_addr, port) =
21 let
22 val port = Word16.fromInt port
23 handle Overflow => PosixError.raiseSys PosixError.inval
24 val port = Net.Word16.hton port
25 val (sa, salen, finish) = Socket.newSockAddr ()
26 val _ = Prim.toAddr (NetHostDB.inAddrToWord8Vector in_addr,
27 port, sa, salen)
28
29 in
30 finish ()
31 end
32
33 fun any port = toAddr (NetHostDB.any (), port)
34
35 fun fromAddr sa =
36 let
37 val () = Prim.fromAddr (Socket.unpackSockAddr sa)
38 val port = Prim.getPort ()
39 val port = Net.Word16.ntoh port
40 val port = Word16.toInt port
41 val (ia, finish) = NetHostDB.newInAddr ()
42 val _ = Prim.getInAddr (NetHostDB.preInAddrToWord8Array ia)
43 in
44 (finish (), port)
45 end
46
47 structure UDP =
48 struct
49 fun socket' prot = GenericSock.socket' (inetAF, Socket.SOCK.dgram, prot)
50 fun socket () = socket' 0
51 end
52
53 structure TCP =
54 struct
55 structure Prim = Prim.Ctl
56
57 fun socket' prot = GenericSock.socket' (inetAF, Socket.SOCK.stream, prot)
58 fun socket () = socket' 0
59
60 fun getNODELAY sock =
61 Socket.CtlExtra.getSockOptBool
62 (Prim.IPPROTO_TCP, Prim.TCP_NODELAY) sock
63
64 fun setNODELAY (sock, optval) =
65 Socket.CtlExtra.setSockOptBool
66 (Prim.IPPROTO_TCP, Prim.TCP_NODELAY) (sock,optval)
67 end
68 end