Simon Josefsson wrote:
> > I'm undecided.
> 
> Avoiding -lws2_32 is good, but if the application links to -lws2_32
> anyway, there will be no saving.
> ...
> Some additional questions:
> 
> 1) How do I use it?  This doesn't seem to work:
> 
> j...@mocca:~$ cat foo.c
> #define WINVER 0x0500
> #include <windows.h>
> #include <stdio.h>
> int main () {
>   char out[1024];
>   DWORD size = 1024;
>   BOOL t = GetComputerNameEx(ComputerNameDnsHostname, out, &size);
>   printf("hi %d: %s", t, out);
> }
> j...@mocca:~$ i586-mingw32msvc-gcc -o foo.exe foo.c 
> /tmp/ccDXn2yi.o:foo.c:(.text+0x37): undefined reference to 
> `_GetComputerNameEx'
> collect2: ld returned 1 exit status
> j...@mocca:~$ 
>
> 2) What is the maximum string size that GetComputerNameEx can return?
>    For the gethostname, the max size is documented.
> 
> 3) Is the GetComputerNameEx semantics right?

You are right. In summary:

   - GetComputerNameEx(ComputerNameDnsHostname,...) returns the right hostname,
     but it hard to use portably:
       - It requires defining _WIN32_WINNT to at least 0x0500.
       - With mingw, it also requires
         "#define GetComputerNameEx GetComputerNameExA".
       - With older versions of mingw, none of the declarations are present at
         all, not even of the enum value ComputerNameDnsHostname.
   - GetComputerName() does not return the right kind of hostname.
   - gethostname() requires linking with -lws2_32.

I'm now convinced that linking with -lws2_32 is the least evil.
I have applied your patch from 2009-03-31.

Also, I'm fixing the handling of len > INT_MAX.


2009-08-02  Bruno Haible  <br...@clisp.org>

        * lib/gethostname.c (gethostname): Fix handling of large len argument.
        Add comments.

--- lib/gethostname.c.orig      2009-08-02 12:02:00.000000000 +0200
+++ lib/gethostname.c   2009-08-02 11:59:12.000000000 +0200
@@ -21,6 +21,7 @@
 #include <config.h>
 
 #if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
+/* Unix API.  */
 
 /* Specification.  */
 #include <unistd.h>
@@ -59,6 +60,17 @@
 }
 
 #else
+/* Native Windows API.  Which primitive to choose?
+   - gethostname() requires linking with -lws2_32.
+   - GetComputerName() does not return the right kind of hostname.
+   - GetComputerNameEx(ComputerNameDnsHostname,...) returns the right hostname,
+     but it hard to use portably:
+       - It requires defining _WIN32_WINNT to at least 0x0500.
+       - With mingw, it also requires
+         "#define GetComputerNameEx GetComputerNameExA".
+       - With older versions of mingw, none of the declarations are present at
+         all, not even of the enum value ComputerNameDnsHostname.
+   So we use gethostname().  Linking with -lws2_32 is the least evil.  */
 
 #define WIN32_LEAN_AND_MEAN
 /* Get winsock2.h. */
@@ -70,9 +82,13 @@
 #undef gethostname
 
 int
-rpl_gethostname (char *name, size_t namelen)
+rpl_gethostname (char *name, size_t len)
 {
-  int r = gethostname (name, (int) namelen);
+  int r;
+
+  if (len > INT_MAX)
+    len = INT_MAX;
+  r = gethostname (name, (int) len);
   if (r < 0)
     set_winsock_errno ();
 


Reply via email to