Commit | Line | Data |
---|---|---|
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 | ||
8 | structure 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 |