]> git.saurik.com Git - apple/libc.git/blobdiff - gen/FreeBSD/gethostname.c
Libc-1082.50.1.tar.gz
[apple/libc.git] / gen / FreeBSD / gethostname.c
index 016a3876ec518aa9fcb8e8c39b6b7969bd5e0dd4..031e2c8775f493c95e2a01dd1ccfaada03ae94ea 100644 (file)
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
  * 4. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
 static char sccsid[] = "@(#)gethostname.c      8.1 (Berkeley) 6/4/93";
 #endif /* LIBC_SCCS and not lint */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libc/gen/gethostname.c,v 1.3 2002/03/22 21:52:05 obrien Exp $");
+__FBSDID("$FreeBSD: src/lib/libc/gen/gethostname.c,v 1.8 2007/01/09 00:27:54 imp Exp $");
 
+#include <string.h>
 #include <sys/param.h>
 #include <sys/sysctl.h>
+#include <limits.h>
+
+#include <errno.h>
+#include <unistd.h>
 
 int
 gethostname(name, namelen)
        char *name;
-       int namelen;
+       size_t namelen;
 {
        int mib[2];
-       size_t size;
 
        mib[0] = CTL_KERN;
        mib[1] = KERN_HOSTNAME;
-       size = namelen;
-       if (sysctl(mib, 2, name, &size, NULL, 0) == -1)
+       if (namelen < MAXHOSTNAMELEN + 1) {
+               char local_buf[MAXHOSTNAMELEN + 1];
+               size_t local_len = sizeof(local_buf);
+               if (sysctl(mib, 2, local_buf, &local_len, NULL, 0) == -1) {
+                       if (errno == ENOMEM)
+                               errno = ENAMETOOLONG;
+                       return (-1);
+               }
+               strncpy(name, local_buf, namelen);
+               name[namelen - 1] = 0;
+       } else {
+       if (sysctl(mib, 2, name, &namelen, NULL, 0) == -1) {
+               if (errno == ENOMEM)
+                       errno = ENAMETOOLONG;
                return (-1);
+               }
+       }
        return (0);
 }