]> granicus.if.org Git - curl/commitdiff
Curl_gethostname: return un-qualified machine name
authorSteve Holme <steve_holme@hotmail.com>
Tue, 13 Sep 2011 21:19:47 +0000 (22:19 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Sun, 18 Sep 2011 11:24:58 +0000 (13:24 +0200)
Fixed Curl_gethostname() so that it always returns the un-qualified
machine name rather than being dependent on the socket provider.

Note: The return of getenv("CURL_GETHOSTNAME") is also parsed in case
the developer / test harness provided a fully qualified domain name as
it's value as well.

lib/curl_gethostname.c

index 7f0bfed54912fcf07d0cfc90fafb474ed7a3bbb4..210ca026437daa5464f5fa7b113a45c2ee2c9c33 100644 (file)
 
 #include "curl_gethostname.h"
 
+/* Hostname buffer size */
+#define HOSTNAME_MAX 1024
+
 /*
  * Curl_gethostname() is a wrapper around gethostname() which allows
  * overriding the host name that the function would normally return.
  * This capability is used by the test suite to verify exact matching
- * of NTLM authentication, which exercises libcurl's MD4 and DES code.
+ * of NTLM authentication, which exercises libcurl's MD4 and DES code
+ * as well as by the SMTP module when a hostname is not provided.
  *
  * For libcurl debug enabled builds host name overriding takes place
  * when environment variable CURL_GETHOSTNAME is set, using the value
  * held by the variable to override returned host name.
  *
+ * Note: The function always returns the un-qualified hostname rather
+ * than being provider dependent.
+ *
  * For libcurl shared library release builds the test suite preloads
  * another shared library named libhostname using the LD_PRELOAD
  * mechanism which intercepts, and might override, the gethostname()
@@ -58,24 +65,48 @@ int Curl_gethostname(char *name, GETHOSTNAME_TYPE_ARG2 namelen) {
   return -1;
 
 #else
+  int err = 0;
+  char* dot = NULL;
+  char hostname[HOSTNAME_MAX + 1];
 
 #ifdef DEBUGBUILD
 
   /* Override host name when environment variable CURL_GETHOSTNAME is set */
   const char *force_hostname = getenv("CURL_GETHOSTNAME");
   if(force_hostname) {
-    strncpy(name, force_hostname, namelen);
-    name[namelen-1] = '\0';
-    return 0;
+    strncpy(hostname, force_hostname, sizeof(hostname));
+    hostname[sizeof(hostname) - 1] = '\0';
   }
+  else
+    err = gethostname(hostname, sizeof(hostname));
 
-#endif /* DEBUGBUILD */
+#else /* DEBUGBUILD */
 
   /* The call to system's gethostname() might get intercepted by the
      libhostname library when libcurl is built as a non-debug shared
      library when running the test suite. */
-  return gethostname(name, namelen);
+  err = gethostname(hostname, sizeof(hostname));
+
+#endif
+
+  if(err != 0)
+    return err;
+
+  /* Is the hostname fully qualified? */
+  dot = strchr(hostname, '.');
+  if(dot) {
+    /* Copy only the machine name to the specified buffer */
+    size_t size = dot - hostname;
+    strncpy(name, hostname, namelen > size ? size : namelen);
+    name[(namelen > size ? size : namelen) - 1] = '\0';
+  }
+  else {
+    /* Copy the hostname to the specified buffer */
+    strncpy(name, hostname, namelen);
+    name[namelen - 1] = '\0';
+  }
 
+  return 0;
 #endif
 
 }