[MLton] INetSock problems, hton/ntoh usage
fluet at tti-c.org
Mon Mar 26 08:03:04 PST 2007
Vesa Karvonen wrote:
> As has been reported earlier
> the net code of MLton has been broken for some time. Trying to get my
> smlbot running, I took a look at the code.
> The port number of a socket is a 16-bit integer (the sin_port field of
> struct sockaddr_in). OTOH, the current net code in MLton represents port
> numbers as C_Int.t values which usually aren't 16-bit integers.
That's a very good observation. IIRC, when reworking the Basis Library
implementation to use more C types, I handled the NetServDB structure
before the Socket and INetSock structures.
The s_port field of struct servent is specified as int, so (internally)
a port in the NetServDB structure is represented by C_Int.t
I probably just assumed that ports in other structures would also be
specified as int. However, I do see that the in_port_t type (which is
the type of the sin_port field of struct sockaddr_in) is specified as
being equal to uint16_t.
> inside the Net structure of MLton, the wrong hton/ntoh conversion (namely
> htonl/ntohl) gets chosen. AFAICT, the conversion should be done on the
> lower 16-bits only. Below is patch that should fix the problem. Note
> that I changed names from ntoh -> ntohs and hton -> htons to make it more
> apparent that the functions only work on the lower 16-bits.
I think the better solution would be to use Word16.word for ports in the
INetSock structure (and C-side functions in INetSock.c). It probably
isn't worth creating a whole C_InPort structure, when we know it should
be equivalent to Word16. My general approach has been to follow the C
types as closely as possible, since it makes the C-side code very simple.
The Basis Library doesn't specify the behavior of INetSock.toAddr (ia,
i) when the port i (of ML type int) is too large to be represented by
the C-side representation of a port. I think we currently would raise
the Overflow exception, which seems reasonable.
More information about the MLton