[Haskell] Should inet_ntoa Be Pure?
Glynn Clements
glynn at gclements.plus.com
Sat May 7 15:34:54 EDT 2005
Axel Simon wrote:
> > > Does anyone know why these are in the IO monad? Aren't they pure functions
> > > converting between dotted-decimal strings and a 32-bit network byte ordered
> > > binary value?
>
> I guess the answer is no for both: The first one can fail
That doesn't mean that it should be in the IO monad; using Maybe would
suffice.
> and the second one overwrites a fixed string buffer (yuck!). From
> the man page:
>
> The return value from inet_ntoa() points to a buffer which
> is overwritten on each call. This buffer is implemented as
> thread-specific data in multithreaded applications.
>
> Hence ntoa needs to be an IO action so that the value is read
> immediately before the next ntoa call is executed.
That shouldn't be an issue so long as the buffer contents are
converted to a Haskell String before the function is called again
within the same thread.
However, I wouldn't rely upon all implementations of inet_ntoa() being
thread-safe.
> What you could do is to apply unsafePerformIO to
[snip]
Or you could just re-implement the functions in Haskell.
Apart from the re-entrancy issues with inet_ntoa(), many
implementations of inet_addr() have misfeatures, e.g. allowing octets
to be expressed in octal or hex, or allowing numbers outside of the
0-255 range (in which case, the top bits overflow into the next
octet).
--
Glynn Clements <glynn at gclements.plus.com>
More information about the Haskell
mailing list