Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/bin/hostname Add the following options
details: https://anonhg.NetBSD.org/src/rev/568261b8cd9f
branches: trunk
changeset: 788770:568261b8cd9f
user: roy <roy%NetBSD.org@localhost>
date: Fri Jul 19 10:34:51 2013 +0000
description:
Add the following options
-A Display the FQDN of each address on all interfaces.
-a Display alias name(s) of the host.
-d Display the DNS domain.
-f Display the FQDN for the hostname.
-I Display each IP address on all interfaces.
-i Display the IP address(es) for the hostname.
diffstat:
bin/hostname/hostname.1 | 34 ++++++++++--
bin/hostname/hostname.c | 123 ++++++++++++++++++++++++++++++++++++++++++++---
2 files changed, 142 insertions(+), 15 deletions(-)
diffs (239 lines):
diff -r 27ee65e6e2df -r 568261b8cd9f bin/hostname/hostname.1
--- a/bin/hostname/hostname.1 Fri Jul 19 08:29:27 2013 +0000
+++ b/bin/hostname/hostname.1 Fri Jul 19 10:34:51 2013 +0000
@@ -1,4 +1,4 @@
-.\" $NetBSD: hostname.1,v 1.17 2003/08/07 09:05:13 agc Exp $
+.\" $NetBSD: hostname.1,v 1.18 2013/07/19 10:34:51 roy Exp $
.\"
.\" Copyright (c) 1983, 1988, 1990, 1993
.\" The Regents of the University of California. All rights reserved.
@@ -29,7 +29,7 @@
.\"
.\" @(#)hostname.1 8.2 (Berkeley) 4/28/95
.\"
-.Dd April 28, 1995
+.Dd July 19, 2013
.Dt HOSTNAME 1
.Os
.Sh NAME
@@ -37,7 +37,7 @@
.Nd set or print name of current host system
.Sh SYNOPSIS
.Nm
-.Op Fl s
+.Op Fl AadIifs
.Op Ar name-of-host
.Sh DESCRIPTION
.Nm
@@ -50,14 +50,36 @@
.Pp
Options:
.Bl -tag -width flag
+.It Fl A
+Display the FQDN of each address on all interfaces.
+.It Fl a
+Display alias name(s) of the host.
+.It Fl d
+Display the DNS domain.
+.It Fl f
+Display the FQDN for the hostname.
+.It Fl I
+Display each IP address on all interfaces.
+.It Fl i
+Display the IP address(es) for the hostname.
.It Fl s
-Trims off any domain information from the printed
-name.
+Display the short hostname.
.El
+.Sh NOTES
+With the exception of
+.Fl I
+and
+.Fl s ,
+the other options will retrieve their results from the resolver.
.Sh SEE ALSO
.Xr domainname 1 ,
+.Xr getaddrinfo 3 ,
.Xr gethostname 3 ,
-.Xr sethostname 3
+.Xr sethostname 3 ,
+.Xr gethostbyname 3 ,
+.Xr getifaddrs 3 ,
+.Xr getnameinfo 3 ,
+.Xr hosts 5
.Sh HISTORY
The
.Nm
diff -r 27ee65e6e2df -r 568261b8cd9f bin/hostname/hostname.c
--- a/bin/hostname/hostname.c Fri Jul 19 08:29:27 2013 +0000
+++ b/bin/hostname/hostname.c Fri Jul 19 10:34:51 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: hostname.c,v 1.17 2011/08/29 14:51:18 joerg Exp $ */
+/* $NetBSD: hostname.c,v 1.18 2013/07/19 10:34:51 roy Exp $ */
/*
* Copyright (c) 1988, 1993
@@ -39,13 +39,19 @@
#if 0
static char sccsid[] = "@(#)hostname.c 8.2 (Berkeley) 4/28/95";
#else
-__RCSID("$NetBSD: hostname.c,v 1.17 2011/08/29 14:51:18 joerg Exp $");
+__RCSID("$NetBSD: hostname.c,v 1.18 2013/07/19 10:34:51 roy Exp $");
#endif
#endif /* not lint */
#include <sys/param.h>
+#include <sys/socket.h>
+
+#include <net/if.h>
+#include <netinet/in.h>
#include <err.h>
+#include <ifaddrs.h>
+#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -56,13 +62,36 @@
int
main(int argc, char *argv[])
{
- int ch, sflag;
+ int ch, Aflag, aflag, dflag, Iflag, iflag, fflag, sflag, i;
char *p, hostname[MAXHOSTNAMELEN + 1];
+ struct addrinfo hints, *ainfos, *ai;
+ struct hostent *hent;
+ struct ifaddrs *ifa, *ifp;
+ struct sockaddr_in6 *sin6;
+ char buf[MAX(MAXHOSTNAMELEN + 1, INET6_ADDRSTRLEN)];
setprogname(argv[0]);
- sflag = 0;
- while ((ch = getopt(argc, argv, "s")) != -1)
+ Aflag = aflag = dflag = Iflag = iflag = fflag = sflag = 0;
+ while ((ch = getopt(argc, argv, "AadIifs")) != -1)
switch (ch) {
+ case 'A':
+ Aflag = 1;
+ break;
+ case 'a':
+ aflag = 1;
+ break;
+ case 'd':
+ dflag = 1;
+ break;
+ case 'I':
+ Iflag = 1;
+ break;
+ case 'i':
+ iflag = 1;
+ break;
+ case 'f':
+ fflag = 1;
+ break;
case 's':
sflag = 1;
break;
@@ -79,13 +108,89 @@
if (*argv) {
if (sethostname(*argv, strlen(*argv)))
err(1, "sethostname");
+ } else if (Aflag || Iflag) {
+ if (getifaddrs(&ifa) == -1)
+ err(1, "getifaddrs");
+ for (ifp = ifa; ifp; ifp = ifp->ifa_next) {
+ if (ifp->ifa_addr == NULL ||
+ ifp->ifa_flags & IFF_LOOPBACK ||
+ !(ifp->ifa_flags & IFF_UP))
+ continue;
+
+ switch(ifp->ifa_addr->sa_family) {
+ case AF_INET:
+ break;
+ case AF_INET6:
+ /* Skip link local addresses */
+ sin6 = (struct sockaddr_in6 *)ifp->ifa_addr;
+ if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr) ||
+ IN6_IS_ADDR_MC_LINKLOCAL(&sin6->sin6_addr))
+ continue;
+ break;
+ default:
+ /* We only translate IPv4 or IPv6 addresses */
+ continue;
+ }
+ i = getnameinfo(ifp->ifa_addr, ifp->ifa_addr->sa_len,
+ buf, sizeof(buf), NULL, 0,
+ Iflag ? NI_NUMERICHOST: NI_NAMEREQD);
+ if (i == -1) {
+ if (Iflag && i != EAI_NONAME)
+ errx(1, "getnameinfo: %s",
+ gai_strerror(i));
+ } else
+ printf("%s\n", buf);
+ }
+ freeifaddrs(ifa);
} else {
if (gethostname(hostname, sizeof(hostname)))
err(1, "gethostname");
hostname[sizeof(hostname) - 1] = '\0';
- if (sflag && (p = strchr(hostname, '.')))
- *p = '\0';
- (void)printf("%s\n", hostname);
+ if (aflag) {
+ if ((hent = gethostbyname(hostname)) == NULL)
+ errx(1, "gethostbyname: %s",
+ hstrerror(h_errno));
+ for (i = 0; hent->h_aliases[i]; i++)
+ printf("%s\n", hent->h_aliases[i]);
+ } else if (dflag || iflag || fflag) {
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_flags = AI_CANONNAME;
+ if (getaddrinfo(hostname, NULL, &hints, &ainfos) == -1)
+ err(1, "getaddrinfo");
+ if (ainfos) {
+ if (dflag) {
+ if ((p = strchr(ainfos->ai_canonname,
+ '.')))
+ printf("%s\n", p + 1);
+ } else if (iflag) {
+ for (ai = ainfos; ai; ai = ai->ai_next)
+ {
+ i = getnameinfo(ai->ai_addr,
+ ai->ai_addrlen,
+ buf, sizeof(buf), NULL, 0,
+ NI_NUMERICHOST);
+ if (i == -1)
+ errx(1,
+ "getnameinfo: %s",
+ gai_strerror(i));
+ printf("%s\n", buf);
+ }
+ } else {
+ if (sflag &&
+ (p = strchr(ainfos->ai_canonname,
+ '.')))
+ *p = '\0';
+ printf("%s\n", ainfos->ai_canonname);
+ }
+ freeaddrinfo(ainfos);
+ }
+ } else {
+ if (sflag && (p = strchr(hostname, '.')))
+ *p = '\0';
+ printf("%s\n", hostname);
+ }
}
exit(0);
/* NOTREACHED */
@@ -94,7 +199,7 @@
static void
usage(void)
{
- (void)fprintf(stderr, "usage: %s [-s] [name-of-host]\n",
+ (void)fprintf(stderr, "usage: %s [-AadIifs] [name-of-host]\n",
getprogname());
exit(1);
/* NOTREACHED */
Home |
Main Index |
Thread Index |
Old Index