Bruno Haible <[EMAIL PROTECTED]> writes: > Hi Simon, > > Here's a proposed patch so that on platforms where gethostname() is missing > and substituted by gnulib, it is declared in <unistd.h>. OK to commit?
Hi. Yes, please do. > Note that this does not resolve the issue with mingw. On mingw, <winsock2.h> > declares gethostname() also - but it requires linking with -lws2_32, > right? Yes. Win32 also has GetComputerName that does not need -lws2_32. It would be easier to use, but which one is right semantically I don't know. > How should the gnulib module handle this? > 1. Should gnulib's replacement call the winsock2 gethostname()? I think so. The Win32 gethostname function takes 'char*,int' so it needs to be wrapped by gnulib, because the POSIX signature is 'char*,size_t'. > 2. Should this be done through immediate linking, or dynamic linking? getaddrinfo.m4 adds -lws2_32 to LIBS automatically now. A tangent: It may be cleaner to define a MINGW_LIBS variable instead, and ask developers to add $(MINGW_LIBS) to automake LIBADD variables for executables that need it. sockets.m4 has been fixed in this way already. Possibly the -lws2_32/LIBSOCKET/MINGW_LIBS handling should be put in a separate module? Then getaddrinfo and sockets can depend on it, rather than duplicating it. gethostname.c could also use GetModuleHandle, similar to how getaddrinfo.c works, to avoid the -lws2_32 requirement. If the application would not otherwise link to -lws2_32 this approach may be nicer. But if applications are linked to -lws2_32 because of other gnulib modules anyway, it doesn't make much sense. The GetModuleHandle approach, together with a fallback replacement function, results in better portability generally. Some Windows releases does not have getaddrinfo, and if the application is linked against -lws2_32 that has it, and the binary is transferred to an old system, it won't work. I suspect all relevant Windows releases has gethostname though. Actually, the getaddrinfo module supports both variants: if the applications sets an appropriate WINVER variable, getaddrinfo will detect as being in -lws2_32 by configure, and the replacement code will not be used. By default, it will not be detected as being in -lws2_32, and the replacement will be used (which tries GetModuleHandle first). Maybe the same approach cannot be used for gethostname: the signatures are different, so if the application passes a size_t and the function assumes int, it may break on platforms where int is 32 bit and size_t is 64 bit (if there are any such Windows platforms?). A wrapper function is needed to convert the data types. Or maybe a #define with a cast? I'm not sure. It seems pretty clear that MINGW_LIBS and GetModuleHandle are two approaches that can solve this problem. The GetModuleHandle solution is more complex, but I'm leaning slightly towards it because it should in theory result in better portability. OTOH, complexity can lead to less portability in practice. /Simon