[MLton] bug in MLton and bug in basis
Florian Weimer
fw@deneb.enyo.de
Thu, 18 Aug 2005 16:51:27 +0200
* Wesley W. Terpstra:
>> Is this some ML-specific feature? Usually, successful calls do not
>> set the errno variable.
>
> Maybe you misunderstood me..?
>
> int status, n;
> n = sizeof(status);
> getsockopt(socket, SOL_SOCKET, SO_ERROR, (char*)&status,
> (socklen_t*)&n);
>
> The result stored in 'status' is the value of 'errno' after the last
> call on the provided socket. For example, if you just saw a socket
> become writeable (after non-blocking connect), then 'status' will
> contain what 'errno' would have been if you had run a blocking
> connect.
Ah, okay.
Solaris returns the error code in errno, not in the passed integer, so
you need something like this:
int
half_duplex_handler::get_error()
{
int error = 0;
socklen_t len = sizeof(error);
errno = 0;
if (getsockopt(fd(), SOL_SOCKET, SO_ERROR, &error, &len) >= 0) {
// Non-Solaris case: error is overwritten with the error code,
// Nothing to do.
} else {
// Solaris case: errno has the error code.
error = errno;
}
return error;
}