Contents of /tags/mkinitrd-6_4_0/busybox/libbb/safe_gethostname.c
Parent Directory | Revision Log
Revision 1313 -
(show annotations)
(download)
Fri May 27 18:20:23 2011 UTC (13 years, 4 months ago) by niro
File MIME type: text/plain
File size: 2566 byte(s)
Fri May 27 18:20:23 2011 UTC (13 years, 4 months ago) by niro
File MIME type: text/plain
File size: 2566 byte(s)
tagged 'mkinitrd-6_4_0'
1 | /* vi: set sw=4 ts=4: */ |
2 | /* |
3 | * Safe gethostname implementation for busybox |
4 | * |
5 | * Copyright (C) 2008 Tito Ragusa <farmatito@tiscali.it> |
6 | * |
7 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
8 | */ |
9 | |
10 | /* |
11 | * SUSv2 guarantees that "Host names are limited to 255 bytes" |
12 | * POSIX.1-2001 guarantees that "Host names (not including the terminating |
13 | * null byte) are limited to HOST_NAME_MAX bytes" (64 bytes on my box). |
14 | * |
15 | * RFC1123 says: |
16 | * |
17 | * The syntax of a legal Internet host name was specified in RFC-952 |
18 | * [DNS:4]. One aspect of host name syntax is hereby changed: the |
19 | * restriction on the first character is relaxed to allow either a |
20 | * letter or a digit. Host software MUST support this more liberal |
21 | * syntax. |
22 | * |
23 | * Host software MUST handle host names of up to 63 characters and |
24 | * SHOULD handle host names of up to 255 characters. |
25 | */ |
26 | |
27 | #include "libbb.h" |
28 | #include <sys/utsname.h> |
29 | |
30 | /* |
31 | * On success return the current malloced and NUL terminated hostname. |
32 | * On error return malloced and NUL terminated string "?". |
33 | * This is an illegal first character for a hostname. |
34 | * The returned malloced string must be freed by the caller. |
35 | */ |
36 | char* FAST_FUNC safe_gethostname(void) |
37 | { |
38 | struct utsname uts; |
39 | |
40 | /* The length of the arrays in a struct utsname is unspecified; |
41 | * the fields are terminated by a null byte. |
42 | * Note that there is no standard that says that the hostname |
43 | * set by sethostname(2) is the same string as the nodename field of the |
44 | * struct returned by uname (indeed, some systems allow a 256-byte host- |
45 | * name and an 8-byte nodename), but this is true on Linux. The same holds |
46 | * for setdomainname(2) and the domainname field. |
47 | */ |
48 | |
49 | /* Uname can fail only if you pass a bad pointer to it. */ |
50 | uname(&uts); |
51 | return xstrndup(!uts.nodename[0] ? "?" : uts.nodename, sizeof(uts.nodename)); |
52 | } |
53 | |
54 | /* |
55 | * On success return the current malloced and NUL terminated domainname. |
56 | * On error return malloced and NUL terminated string "?". |
57 | * This is an illegal first character for a domainname. |
58 | * The returned malloced string must be freed by the caller. |
59 | */ |
60 | char* FAST_FUNC safe_getdomainname(void) |
61 | { |
62 | #if defined(__linux__) |
63 | /* The field domainname of struct utsname is Linux specific. */ |
64 | struct utsname uts; |
65 | uname(&uts); |
66 | return xstrndup(!uts.domainname[0] ? "?" : uts.domainname, sizeof(uts.domainname)); |
67 | #else |
68 | /* We really don't care about people with domain names wider than most screens */ |
69 | char buf[256]; |
70 | int r = getdomainname(buf, sizeof(buf)); |
71 | buf[sizeof(buf)-1] = '\0'; |
72 | return xstrdup(r < 0 ? "?" : buf); |
73 | #endif |
74 | } |