| |
 | Posted by Jakob Ovrum in reply to MWumpusZ | Permalink Reply |
|
Jakob Ovrum 
Posted in reply to MWumpusZ
| On Friday, 7 October 2016 at 08:38:24 UTC, MWumpusZ wrote:
> We are currently using phobos from http://downloads.dlang.org/releases/2016/dmd.2.071.0.linux.zip
>
> Phobos' InternetAddress contained therein uses gethostbyname and not gethostbyname_r; std.socket imports core.sys.posix.netdb, which only makes gethostbyname available.
>
> gethostbyname_r would be made available by importing std.c.linux.socket, but this is marked as deprecated in favour of core.sys.posix.BLAH
>
> The use of gethostbyname is a problem for us because, even though std.socket synchronises access to the function, we are using a third party (non-D) library in our application which also uses gethostbyname, and of course that library doesn't care about the synchronisation in std.socket.
>
>
> Is there a reason why gethostbyname_r isn't usually used?
> Even for those environments which don't have it, version(linux) (or whatever) in core.sys.posix.netdb should be able to deal with that easily, shouldn't it?
gethostbyname_r is a GNU extension and not standard POSIX. That means it's only available on GNU/Linux systems that additionally don't use an alternative libc. gettaddrinfo is a more recent standard reentrant function with more functionality.
InternetHost.getHostByName uses gethostbyname_r if visible and otherwise falls back to gethostbyname. There doesn't appear to be a condition in which gethostbyname_r would be visible, probably as a result of moving from std.c.linux to core.sys.posix. InternetHost.getHostByName is public so it can be used directly, but apart from that it appears to be used internally twice:
1) in getAddress when getaddrinfo is not available.
1) always used in the constructor of InternetAddress.
I guess #2 is the issue you're having. The doc for InternetAddress does say it uses InternetHost internally, and the docs do recommend getAddress over using Internet{Host, Address} directly, but maybe InternetHost.getHostByName should use getAddress internally to benefit from getaddrinfo. If not, it should probably at least warn about not being reentrant.
I don't know what OS still doesn't have getaddrinfo. Ideally we could deprecate all these bad legacy types and functions.
|