1 /* xgethostname.c -- return current hostname with unlimited length 2 3 Copyright (C) 1992, 1996, 2000, 2001, 2003, 2004, 2005 Free Software 4 Foundation, Inc. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2, or (at your option) 9 any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software Foundation, 18 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 19 20 /* written by Jim Meyering */ 21 22 #ifdef HAVE_CONFIG_H 23 # include <config.h> 24 #endif 25 26 /* Specification. */ 27 #include "xgethostname.h" 28 29 #include <stdlib.h> 30 #include <errno.h> 31 32 #if HAVE_UNISTD_H 33 # include <unistd.h> 34 #endif 35 36 #include "xalloc.h" 37 38 #ifndef ENAMETOOLONG 39 # define ENAMETOOLONG 0 40 #endif 41 42 #ifndef INITIAL_HOSTNAME_LENGTH 43 # define INITIAL_HOSTNAME_LENGTH 34 44 #endif 45 46 /* Return the current hostname in malloc'd storage. 47 If malloc fails, exit. 48 Upon any other failure, return NULL and set errno. */ 49 char * 50 xgethostname (void) 51 { 52 char *hostname = NULL; 53 size_t size = INITIAL_HOSTNAME_LENGTH; 54 55 while (1) 56 { 57 /* Use SIZE_1 here rather than SIZE to work around the bug in 58 SunOS 5.5's gethostname whereby it NUL-terminates HOSTNAME 59 even when the name is as long as the supplied buffer. */ 60 size_t size_1; 61 62 hostname = x2realloc (hostname, &size); 63 size_1 = size - 1; 64 hostname[size_1 - 1] = '\0'; 65 errno = 0; 66 67 if (gethostname (hostname, size_1) == 0) 68 { 69 if (! hostname[size_1 - 1]) 70 break; 71 } 72 else if (errno != 0 && errno != ENAMETOOLONG && errno != EINVAL 73 /* OSX/Darwin does this when the buffer is not large enough */ 74 && errno != ENOMEM) 75 { 76 int saved_errno = errno; 77 free (hostname); 78 errno = saved_errno; 79 return NULL; 80 } 81 } 82 83 return hostname; 84 } 85