2 * hostname This file contains an implementation of the command
3 * that maintains the hostname and the domainname. It
4 * is also used to show the FQDN and the IP-Addresses.
6 * Usage: hostname [-d|-f|-s|-a|-i|-y|-n]
8 * hostname {name|-F file}
10 * nisdomainname {name|-F file}
12 * Version: hostname 1.101 (2003-10-11)
14 * Author: Peter Tobias <tobias@et-inf.fho-emden.de>
17 * {1.90} Peter Tobias : Added -a and -i options.
18 * {1.91} Bernd Eckenfels : -v,-V rewritten, long_opts (major rewrite), usage.
19 *19960120 {1.95} Bernd Eckenfels : -y/nisdomainname - support for get/setdomainname added
20 *19960218 {1.96} Bernd Eckenfels : netinet/in.h added
21 *19980629 {1.97} Arnaldo Carvalho de Melo : gettext instead of catgets for i18n
22 *20000213 {1.99} Arnaldo Carvalho de Melo : fixed some i18n strings
23 *20010404 {1.100} Arnaldo Carvalho de Melo: use setlocale
24 *20031011 {1.101} Maik Broemme: gcc 3.x fixes (default: break)
26 * This program is free software; you can redistribute it
27 * and/or modify it under the terms of the GNU General
28 * Public License as published by the Free Software
29 * Foundation; either version 2 of the License, or (at
30 * your option) any later version.
40 #include <sys/param.h>
41 #include <netinet/in.h>
42 #include <arpa/inet.h>
48 #include <sys/socket.h> /* for PF_INET6 */
49 #include <sys/types.h> /* for inet_ntop */
53 #include <netdnet/dn.h>
56 char *Release = RELEASE, *Version = "hostname 1.100 (2001-04-14)";
58 static char *program_name;
61 static void sethname(char *);
62 static void setdname(char *);
63 static void showhname(char *, int);
64 static void usage(void);
65 static void version(void);
66 static void setfilename(char *, int);
73 static void setnname(char *nname)
76 fprintf(stderr, _("Setting nodename to `%s'\n"),
78 if (setnodename(nname, strlen(nname))) {
81 fprintf(stderr, _("%s: you must be root to change the node name\n"), program_name);
84 fprintf(stderr, _("%s: name too long\n"), program_name);
92 #endif /* HAVE_AFDECnet */
94 static void sethname(char *hname)
97 fprintf(stderr, _("Setting hostname to `%s'\n"),
99 if (sethostname(hname, strlen(hname))) {
102 fprintf(stderr, _("%s: you must be root to change the host name\n"), program_name);
105 fprintf(stderr, _("%s: name too long\n"), program_name);
112 static void setdname(char *dname)
115 fprintf(stderr, _("Setting domainname to `%s'\n"),
117 if (setdomainname(dname, strlen(dname))) {
120 fprintf(stderr, _("%s: you must be root to change the domain name\n"), program_name);
123 fprintf(stderr, _("%s: name too long\n"), program_name);
130 static void showhname(char *hname, int c)
134 struct in6_addr **ip6;
136 register char *p, **alias;
140 fprintf(stderr, _("Resolving `%s' ...\n"), hname);
143 !(hp = gethostbyname2(hname, PF_INET6)) &&
145 !(hp = gethostbyname(hname))) {
146 herror(program_name);
151 fprintf(stderr, _("Result: h_name=`%s'\n"),
154 alias = hp->h_aliases;
156 fprintf(stderr, _("Result: h_aliases=`%s'\n"),
159 if (hp->h_addrtype == PF_INET6) {
160 char addr[INET6_ADDRSTRLEN + 1];
161 addr[INET6_ADDRSTRLEN] = '\0';
162 ip6 = (struct in6_addr **) hp->h_addr_list;
164 if (inet_ntop(PF_INET6, *ip6++, addr, INET6_ADDRSTRLEN))
165 fprintf(stderr, _("Result: h_addr_list=`%s'\n"), addr);
166 else if (errno == EAFNOSUPPORT)
167 fprintf(stderr, _("%s: protocol family not supported\n"),
169 else if (errno == ENOSPC)
170 fprintf(stderr, _("%s: name too long\n"), program_name);
175 ip = (struct in_addr **) hp->h_addr_list;
177 fprintf(stderr, _("Result: h_addr_list=`%s'\n"),
181 if (!(p = strchr(hp->h_name, '.')) && (c == 'd'))
186 while (hp->h_aliases[0])
187 printf("%s ", *hp->h_aliases++);
192 if (hp->h_addrtype == PF_INET6) {
193 char addr[INET6_ADDRSTRLEN + 1];
194 addr[INET6_ADDRSTRLEN] = '\0';
195 while (hp->h_addr_list[0]) {
196 if (inet_ntop(PF_INET6, (struct in6_addr *)*hp->h_addr_list++,
197 addr, INET6_ADDRSTRLEN)) {
199 } else if (errno == EAFNOSUPPORT) {
200 fprintf(stderr, _("\n%s: protocol family not supported\n"),
203 } else if (errno == ENOSPC) {
204 fprintf(stderr, _("\n%s: name too long\n"), program_name);
211 while (hp->h_addr_list[0])
212 printf("%s ", inet_ntoa(*(struct in_addr *)*hp->h_addr_list++));
220 printf("%s\n", hp->h_name);
225 printf("%s\n", hp->h_name);
230 static void setfilename(char *name, int what)
234 char fline[MAXHOSTNAMELEN];
236 if ((fd = fopen(name, "r")) != NULL) {
237 while (fgets(fline, sizeof(fline), fd) != NULL) {
238 if ((p = index(fline, '\n')) != NULL)
241 fprintf(stderr, ">> %s\n", fline);
255 #endif /* HAVE_AFDECnet */
260 fprintf(stderr, _("%s: can't open `%s'\n"),
266 static void version(void)
268 fprintf(stderr, "%s\n%s\n", Release, Version);
269 exit(5); /* E_VERSION */
272 static void usage(void)
274 fprintf(stderr, _("Usage: hostname [-v] {hostname|-F file} set hostname (from file)\n"));
275 fprintf(stderr, _(" domainname [-v] {nisdomain|-F file} set NIS domainname (from file)\n"));
277 fprintf(stderr, _(" nodename [-v] {nodename|-F file} set DECnet node name (from file)\n"));
279 fprintf(stderr, _(" hostname [-v] [-d|-f|-s|-a|-i|-y|-n] display formatted name\n"));
280 fprintf(stderr, _(" hostname [-v] display hostname\n\n"));
281 fprintf(stderr, _(" hostname -V|--version|-h|--help print info and exit\n\n"));
282 fprintf(stderr, _(" dnsdomainname=hostname -d, {yp,nis,}domainname=hostname -y\n\n"));
283 fprintf(stderr, _(" -s, --short short host name\n"));
284 fprintf(stderr, _(" -a, --alias alias names\n"));
285 fprintf(stderr, _(" -i, --ip-address addresses for the hostname\n"));
286 fprintf(stderr, _(" -f, --fqdn, --long long host name (FQDN)\n"));
287 fprintf(stderr, _(" -d, --domain DNS domain name\n"));
288 fprintf(stderr, _(" -y, --yp, --nis NIS/YP domainname\n"));
290 fprintf(stderr, _(" -n, --node DECnet node name\n"));
291 #endif /* HAVE_AFDECnet */
292 fprintf(stderr, _(" -F, --file read hostname or NIS domainname from given file\n\n"));
294 " This command can read or set the hostname or the NIS domainname. You can\n"
295 " also read the DNS domain or the FQDN (fully qualified domain name).\n"
296 " Unless you are using bind or NIS for host lookups you can change the\n"
297 " FQDN (Fully Qualified Domain Name) and the DNS domain name (which is\n"
298 " part of the FQDN) in the /etc/hosts file.\n"));
300 exit(4); /* E_USAGE */
304 int main(int argc, char **argv)
308 int option_index = 0;
310 char myname[MAXHOSTNAMELEN + 1] =
314 static const struct option long_options[] =
316 {"domain", no_argument, 0, 'd'},
317 {"file", required_argument, 0, 'F'},
318 {"fqdn", no_argument, 0, 'f'},
319 {"help", no_argument, 0, 'h'},
320 {"long", no_argument, 0, 'f'},
321 {"short", no_argument, 0, 's'},
322 {"version", no_argument, 0, 'V'},
323 {"verbose", no_argument, 0, 'v'},
324 {"alias", no_argument, 0, 'a'},
325 {"ip-address", no_argument, 0, 'i'},
326 {"nis", no_argument, 0, 'y'},
327 {"yp", no_argument, 0, 'y'},
329 {"node", no_argument, 0, 'n'},
330 #endif /* HAVE_AFDECnet */
334 setlocale (LC_ALL, "");
335 bindtextdomain("net-tools", "/usr/share/locale");
336 textdomain("net-tools");
338 program_name = (rindex(argv[0], '/')) ? rindex(argv[0], '/') + 1 : argv[0];
340 if (!strcmp(program_name, "ypdomainname") ||
341 !strcmp(program_name, "domainname") ||
342 !strcmp(program_name, "nisdomainname"))
344 if (!strcmp(program_name, "dnsdomainname"))
347 if (!strcmp(program_name, "nodename"))
349 #endif /* HAVE_AFDECnet */
351 while ((c = getopt_long(argc, argv, "adfF:h?isVvyn", long_options, &option_index)) != EOF)
370 #endif /* HAVE_AFDECnet */
379 break; // not reached
384 break; // not reached
390 if (file || (optind < argc)) {
391 fprintf(stderr, _("%s: You can't change the DNS domain name with this command\n"), program_name);
392 fprintf(stderr, _("\nUnless you are using bind or NIS for host lookups you can change the DNS\n"));
393 fprintf(stderr, _("domain name (which is part of the FQDN) in the /etc/hosts file.\n"));
400 setfilename(file, SETHOST);
404 sethname(argv[optind]);
408 gethostname(myname, sizeof(myname));
410 fprintf(stderr, _("gethostname()=`%s'\n"), myname);
412 printf("%s\n", myname);
414 showhname(myname, type);
418 setfilename(file, SETDOMAIN);
422 setdname(argv[optind]);
425 if (getdomainname(myname, sizeof(myname)) < 0) {
426 perror("getdomainname()");
430 fprintf(stderr, _("getdomainname()=`%s'\n"), myname);
431 printf("%s\n", myname);
436 setfilename(file, SETNODE);
440 setnname(argv[optind]);
443 getnodename(myname, sizeof(myname));
445 fprintf(stderr, _("getnodename()=`%s'\n"), myname);
446 printf("%s\n", myname);
448 #endif /* HAVE_AFDECnet */