better: sysconf seems to be the preferred way
authorHeikki Lindholm <holin@iki.fi>
Fri, 9 Apr 2010 15:18:42 +0000 (15:18 +0000)
committerHeikki Lindholm <holin@iki.fi>
Fri, 9 Apr 2010 15:18:42 +0000 (15:18 +0000)
configure.ac
src/hostlist/hostlist-server.c
src/include/platform.h

index 9a86199bd3f4ab52bff27a6a6d5c7839464e1e21..d02d03896c7b2c9d24f790d6c73698194803bb3c 100644 (file)
@@ -573,7 +573,7 @@ AC_FUNC_VPRINTF
 AC_HEADER_SYS_WAIT
 AC_TYPE_OFF_T
 AC_TYPE_UID_T
-AC_CHECK_FUNCS([floor gethostname memmove rmdir strncasecmp strrchr strtol atoll dup2 fdatasync ftruncate gettimeofday memset mkdir mkfifo select socket strcasecmp strchr strdup strerror strstr clock_gettime getrusage rand uname setlocale getcwd mktime gmtime_r gmtime strlcpy strlcat ftruncate stat64 sbrk mmap mremap setrlimit gethostbyaddr initgroups getifaddrs freeifaddrs getnameinfo getaddrinfo inet_ntoa localtime_r nl_langinfo putenv realpath strndup gethostbyname2 gethostbyname])
+AC_CHECK_FUNCS([floor gethostname memmove rmdir strncasecmp strrchr strtol atoll dup2 fdatasync ftruncate gettimeofday memset mkdir mkfifo select socket strcasecmp strchr strdup strerror strstr clock_gettime getrusage rand uname setlocale getcwd mktime gmtime_r gmtime strlcpy strlcat ftruncate stat64 sbrk mmap mremap setrlimit sysconf gethostbyaddr initgroups getifaddrs freeifaddrs getnameinfo getaddrinfo inet_ntoa localtime_r nl_langinfo putenv realpath strndup gethostbyname2 gethostbyname])
 
 # restore LIBS
 LIBS=$SAVE_LIBS
index 9e0307ec08146ce8a74dc242dd83e84403c6c7ff..f3f92e9fb1c2330b178c3bb79218b75630c106d1 100644 (file)
@@ -104,6 +104,11 @@ struct HostSet
   char *data;
 };
 
+/**
+ * Local max hostname length (some platforms use sysconf() for it)
+ */
+static int max_hostname_length;
+
 /**
  * Task that will produce a new response object.
  */
@@ -400,11 +405,11 @@ adv_create_message ( const struct GNUNET_PeerIdentity * peer,
   unsigned long long port;
 
   char *uri;
-  char hostname[HOST_NAME_MAX];
+  char hostname[max_hostname_length + 1];
   char *protocol = "http://";
   char *port_s = GNUNET_malloc(6 * sizeof(char));
 
-  if (0 != gethostname (hostname, sizeof (hostname) - 1))
+  if (0 != gethostname (hostname, sizeof (hostname)))
   {
     GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR,
         "Could not get system's hostname, unable to create advertisement message");
@@ -613,6 +618,16 @@ GNUNET_HOSTLIST_server_start (const struct GNUNET_CONFIGURATION_Handle *c,
 {
   unsigned long long port;
 
+#if HAVE_SYSCONF && defined(_SC_HOST_NAME_MAX)
+  max_hostname_length = sysconf(_SC_HOST_NAME_MAX);
+  if (-1 == max_hostname_length)
+    return GNUNET_SYSERR;
+#elif defined(HOST_NAME_MAX)
+  max_hostname_length = HOST_NAME_MAX;
+#else
+  max_hostname_length = 255; /* sensible default? */
+#endif
+
   sched = s;
   cfg = c;
   stats = st;
index 7a31f4fa716799ad502c85c64c0ceaf46624b080..7bf2b2f8f69f546f82f17fe3beac251ceffce21a 100644 (file)
 #endif
 
 #ifdef FREEBSD
-#ifndef HOST_NAME_MAX
-#define HOST_NAME_MAX MAXHOSTNAMELEN
-#endif
 #define __BYTE_ORDER BYTE_ORDER
 #define __BIG_ENDIAN BIG_ENDIAN
 #endif
 
 #ifdef DARWIN
-#ifndef HOST_NAME_MAX
-#define HOST_NAME_MAX MAXHOSTNAMELEN
-#endif
 #define __BYTE_ORDER BYTE_ORDER
 #define __BIG_ENDIAN BIG_ENDIAN
  /* not available on darwin, override configure */