eServerSocket: fix remote client's address being garbage
authorErik Slagter <erik@openpli.org>
Thu, 17 Dec 2015 19:34:02 +0000 (20:34 +0100)
committerErik Slagter <erik@openpli.org>
Thu, 17 Dec 2015 19:34:02 +0000 (20:34 +0100)
commit41211499b4ccf036859e45654bca428dbb882e9b
treea11d8f162ada0486d9a82dce18dfb4eeebb48606
parentb709634b8884b50b4613f801ea7cfb00822e9c2c
eServerSocket: fix remote client's address being garbage
when we're on a dualstack host.

Two issues fixed:
 - If we're going to request a client's remote address from accept()
   and we supply a sockaddr to store it, the size will incidently
   suffice for an ipv4 address, but an ipv6 address will not fit and
   result in garbage and accept() will not mention it, no error.
   Fix: use a sockaddr_in6 instead (well actually use a union
   that contains all of sockaddr, sockaddr_in and sockaddr_in6, to
   be always safe).
 - inet_ntop() is not socket family agnostic. You cannot supply it
   the generic sa_addr member from sockaddr, the offset is wrong
   for both ipv4 and ipv6. Fix: use specific code for PF_LOCAL,
   PF_INET and PF_INET6 to supply inet_ntop the correct struct
   offset. This also prevents ugly static pointer casts that often
   introduce these sorts of bugs and the compiler not complaining
   about it.

Also added translation from ::ffff:a.b.c.d (ipv4 mapped address
in ipv6 socket address) to a simple  a.b.c.d which I think is more
appropriate for most users.
lib/network/serversocket.cpp