| @@ -4,20 +4,17 @@ |
| * |
| * Copyright (C) 1999 by Randolph Chung <[email protected]> |
| * |
| - | * adjusted by Erik Andersen <[email protected]> to remove |
| + | * Adjusted by Erik Andersen <[email protected]> to remove |
| * use of long options and GNU getopt. Improved the usage info. |
| * |
| - | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| - | * |
| * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
| */ |
| - | |
| #include "libbb.h" |
| |
| static void do_sethostname(char *s, int isfile) |
| { |
| - | if (!s) |
| - | return; |
| + | // if (!s) |
| + | // return; |
| if (isfile) { |
| parser_t *parser = config_open2(s, xfopen_for_read); |
| while (config_read(parser, &s, 1, 1, "# \t", PARSE_NORMAL & ~PARSE_GREEDY)) { |
| @@ -25,15 +22,65 @@ static void do_sethostname(char *s, int isfile) |
| } |
| if (ENABLE_FEATURE_CLEAN_UP) |
| config_close(parser); |
| - | } else if (sethostname(s, strlen(s)) < 0) { |
| - | if (errno == EPERM) |
| - | bb_error_msg_and_die(bb_msg_perm_denied_are_you_root); |
| + | } else if (sethostname(s, strlen(s))) { |
| + | // if (errno == EPERM) |
| + | // bb_error_msg_and_die(bb_msg_perm_denied_are_you_root); |
| bb_perror_msg_and_die("sethostname"); |
| } |
| } |
| |
| + | /* Manpage circa 2009: |
| + | * |
| + | * hostname [-v] [-a] [--alias] [-d] [--domain] [-f] [--fqdn] [--long] |
| + | * [-i] [--ip-address] [-s] [--short] [-y] [--yp] [--nis] |
| + | * |
| + | * hostname [-v] [-F filename] [--file filename] / [hostname] |
| + | * |
| + | * domainname [-v] [-F filename] [--file filename] / [name] |
| + | * { bbox: not supported } |
| + | * |
| + | * nodename [-v] [-F filename] [--file filename] / [name] |
| + | * { bbox: not supported } |
| + | * |
| + | * dnsdomainname [-v] |
| + | * { bbox: supported: Linux kernel build needs this } |
| + | * nisdomainname [-v] |
| + | * { bbox: not supported } |
| + | * ypdomainname [-v] |
| + | * { bbox: not supported } |
| + | * |
| + | * -a, --alias |
| + | * Display the alias name of the host (if used). |
| + | * { bbox: not supported } |
| + | * -d, --domain |
| + | * Display the name of the DNS domain. Don't use the command |
| + | * domainname to get the DNS domain name because it will show the |
| + | * NIS domain name and not the DNS domain name. Use dnsdomainname |
| + | * instead. |
| + | * -f, --fqdn, --long |
| + | * Display the FQDN (Fully Qualified Domain Name). A FQDN consists |
| + | * of a short host name and the DNS domain name. Unless you are |
| + | * using bind or NIS for host lookups you can change the FQDN and |
| + | * the DNS domain name (which is part of the FQDN) in the |
| + | * /etc/hosts file. |
| + | * -i, --ip-address |
| + | * Display the IP address(es) of the host. |
| + | * -s, --short |
| + | * Display the short host name. This is the host name cut at the |
| + | * first dot. |
| + | * -v, --verbose |
| + | * Be verbose and tell what's going on. |
| + | * { bbox: supported but ignored } |
| + | * -y, --yp, --nis |
| + | * Display the NIS domain name. If a parameter is given (or --file |
| + | * name ) then root can also set a new NIS domain. |
| + | * { bbox: not supported } |
| + | * -F, --file filename |
| + | * Read the host name from the specified file. Comments (lines |
| + | * starting with a `#') are ignored. |
| + | */ |
| int hostname_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| - | int hostname_main(int argc, char **argv) |
| + | int hostname_main(int argc UNUSED_PARAM, char **argv) |
| { |
| enum { |
| OPT_d = 0x1, |
| @@ -44,49 +91,63 @@ int hostname_main(int argc, char **argv) |
| OPT_dfis = 0xf, |
| }; |
| |
| + | unsigned opts; |
| char *buf; |
| char *hostname_str; |
| |
| - | if (argc < 1) |
| - | bb_show_usage(); |
| + | #if ENABLE_LONG_OPTS |
| + | applet_long_options = |
| + | "domain\0" No_argument "d" |
| + | "fqdn\0" No_argument "f" |
| + | //Enable if seen in active use in some distro: |
| + | // "long\0" No_argument "f" |
| + | // "ip-address\0" No_argument "i" |
| + | // "short\0" No_argument "s" |
| + | // "verbose\0" No_argument "v" |
| + | "file\0" No_argument "F" |
| + | ; |
| |
| - | getopt32(argv, "dfisF:", &hostname_str); |
| + | #endif |
| + | /* dnsdomainname from net-tools 1.60, hostname 1.100 (2001-04-14), |
| + | * supports hostname's options too (not just -v as manpage says) */ |
| + | opts = getopt32(argv, "dfisF:v", &hostname_str); |
| argv += optind; |
| buf = safe_gethostname(); |
| + | if (applet_name[0] == 'd') /* dnsdomainname? */ |
| + | opts = OPT_d; |
| |
| - | /* Output in desired format */ |
| - | if (option_mask32 & OPT_dfis) { |
| + | if (opts & OPT_dfis) { |
| + | /* Cases when we need full hostname (or its part) */ |
| struct hostent *hp; |
| char *p; |
| + | |
| hp = xgethostbyname(buf); |
| - | p = strchr(hp->h_name, '.'); |
| - | if (option_mask32 & OPT_f) { |
| + | p = strchrnul(hp->h_name, '.'); |
| + | if (opts & OPT_f) { |
| puts(hp->h_name); |
| - | } else if (option_mask32 & OPT_s) { |
| - | if (p) |
| - | *p = '\0'; |
| + | } else if (opts & OPT_s) { |
| + | *p = '\0'; |
| puts(hp->h_name); |
| - | } else if (option_mask32 & OPT_d) { |
| - | if (p) |
| + | } else if (opts & OPT_d) { |
| + | if (*p) |
| puts(p + 1); |
| - | } else if (option_mask32 & OPT_i) { |
| + | } else /*if (opts & OPT_i)*/ { |
| while (hp->h_addr_list[0]) { |
| printf("%s ", inet_ntoa(*(struct in_addr *) (*hp->h_addr_list++))); |
| } |
| bb_putchar('\n'); |
| } |
| - | } |
| - | /* Set the hostname */ |
| - | else if (option_mask32 & OPT_F) { |
| + | } else if (opts & OPT_F) { |
| + | /* Set the hostname */ |
| do_sethostname(hostname_str, 1); |
| } else if (argv[0]) { |
| + | /* Set the hostname */ |
| do_sethostname(argv[0], 0); |
| - | } |
| - | /* Or if all else fails, |
| - | * just print the current hostname */ |
| - | else { |
| + | } else { |
| + | /* Just print the current hostname */ |
| puts(buf); |
| } |
| + | |
| if (ENABLE_FEATURE_CLEAN_UP) |
| free(buf); |
| return EXIT_SUCCESS; |