No matter how I modify this following code it does not work with Solaris. Solaris always returns "non-recoverable name resolution failure":
int error; char port_buf[NI_MAXSERV]; size_socket addrLen = sizeof(vio->remote); if (getpeername(vio->sd, (struct sockaddr *) (&vio->remote), &addrLen) != 0) { DBUG_PRINT("exit", ("getpeername gave error: %d", socket_errno)); DBUG_RETURN(1); } if ((error= getnameinfo((struct sockaddr *)(&vio->remote), sizeof(struct sockaddr_storage), buf, buflen, port_buf, NI_MAXSERV, NI_NUMERICHOST|NI_NUMERICSERV))) { WATCHPOINT_STRING(gai_strerror(error)); DBUG_PRINT("exit", ("getnameinfo gave error: %s", gai_strerror(error))); DBUG_RETURN(1); }
Linux, FreeBSD, OSX, AIX, Windows.... all are fine. Except Solaris. For DNS resolution nsswitch.conf lists files, then DNS.
I am completely capable of FUBAR code myself. So some part of me really does believe this is my mistake. When I google for "non-recoverable name resolution failure" and Solaris I get plenty of hits though, so I am skeptical.
Very few open source projects have good IPv6 support at this time, so it is not like I can just poke around and other groups code and see how they are doing it (though I am tempted to fire off some patches...).
(...and yes this is MySQL, and if I have to all platforms but Solaris get IPv6 support, I have a very low tolerance for work arounds on broken operating systems).