Module Name:    src
Committed By:   christos
Date:           Wed Sep 26 23:01:04 UTC 2012

Modified Files:
        src/usr.bin/fstat: fstat.c

Log Message:
fix non-numeric address and port printing.


To generate a diff of this commit:
cvs rdiff -u -r1.96 -r1.97 src/usr.bin/fstat/fstat.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/fstat/fstat.c
diff -u src/usr.bin/fstat/fstat.c:1.96 src/usr.bin/fstat/fstat.c:1.97
--- src/usr.bin/fstat/fstat.c:1.96	Sat Mar 24 17:51:23 2012
+++ src/usr.bin/fstat/fstat.c	Wed Sep 26 19:01:04 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: fstat.c,v 1.96 2012/03/24 21:51:23 christos Exp $	*/
+/*	$NetBSD: fstat.c,v 1.97 2012/09/26 23:01:04 christos Exp $	*/
 
 /*-
  * Copyright (c) 1988, 1993
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1988, 19
 #if 0
 static char sccsid[] = "@(#)fstat.c	8.3 (Berkeley) 5/2/95";
 #else
-__RCSID("$NetBSD: fstat.c,v 1.96 2012/03/24 21:51:23 christos Exp $");
+__RCSID("$NetBSD: fstat.c,v 1.97 2012/09/26 23:01:04 christos Exp $");
 #endif
 #endif /* not lint */
 
@@ -767,31 +767,36 @@ getmnton(struct mount *m)
 static const char *
 inet_addrstr(char *buf, size_t len, const struct in_addr *a, uint16_t p)
 {
-	char addr[256];
+	char addr[256], serv[256];
+	struct sockaddr_in sin;
+	const int niflags = nflg ? (NI_NUMERICHOST|NI_NUMERICSERV) : 0;
+
+	(void)memset(&sin, 0, sizeof(sin));
+	sin.sin_family = AF_INET;
+	sin.sin_len = sizeof(sin);
+	sin.sin_addr = *a;
+	sin.sin_port = htons(p);
+
+	serv[0] = '\0';
+
+	if (getnameinfo((struct sockaddr *)&sin, sin.sin_len,
+	    addr, sizeof(addr), serv, sizeof(serv), niflags)) {
+		if (inet_ntop(AF_INET, a, addr, sizeof(addr)) == NULL)
+			strlcpy(addr, "invalid", sizeof(addr));
+	}
+
+	if (serv[0] == '\0')
+		snprintf(serv, sizeof(serv), "%u", p);
 
 	if (a->s_addr == INADDR_ANY) {
 		if (p == 0)
-			addr[0] = '\0';
+			buf[0] = '\0';
 		else
-			strlcpy(addr, "*", sizeof(addr));
-	} else {
-		struct sockaddr_in sin;
-		const int niflags = NI_NUMERICHOST;
-
-		(void)memset(&sin, 0, sizeof(sin));
-		sin.sin_family = AF_INET6;
-		sin.sin_len = sizeof(sin);
-		sin.sin_addr = *a;
-
-		if (getnameinfo((struct sockaddr *)&sin, sin.sin_len,
-		    addr, sizeof(addr), NULL, 0, niflags))
-			if (inet_ntop(AF_INET, a, addr, sizeof(addr)) == NULL)
-				strlcpy(addr, "invalid", sizeof(addr));
+			snprintf(buf, len, "*:%s", serv);
+		return buf;
 	}
-	if (addr[0])
-		snprintf(buf, len, "%s:%u", addr, p);
-	else
-		strlcpy(buf, addr, len);
+
+	snprintf(buf, len, "%s:%s", addr, serv);
 	return buf;
 }
 
@@ -799,39 +804,47 @@ inet_addrstr(char *buf, size_t len, cons
 static const char *
 inet6_addrstr(char *buf, size_t len, const struct in6_addr *a, uint16_t p)
 {
-	char addr[256];
+	char addr[256], serv[256];
+	struct sockaddr_in6 sin6;
+	const int niflags = nflg ? (NI_NUMERICHOST|NI_NUMERICSERV) : 0;
+
+	(void)memset(&sin6, 0, sizeof(sin6));
+	sin6.sin6_family = AF_INET6;
+	sin6.sin6_len = sizeof(sin6);
+	sin6.sin6_addr = *a;
+	sin6.sin6_port = htons(p);
+
+	if (IN6_IS_ADDR_LINKLOCAL(a) &&
+	    *(u_int16_t *)&sin6.sin6_addr.s6_addr[2] != 0) {
+		sin6.sin6_scope_id =
+			ntohs(*(uint16_t *)&sin6.sin6_addr.s6_addr[2]);
+		sin6.sin6_addr.s6_addr[2] = 0;
+		sin6.sin6_addr.s6_addr[3] = 0;
+	}
+
+	serv[0] = '\0';
+
+	if (getnameinfo((struct sockaddr *)&sin6, sin6.sin6_len,
+	    addr, sizeof(addr), serv, sizeof(serv), niflags)) {
+		if (inet_ntop(AF_INET6, a, addr, sizeof(addr)) == NULL)
+			strlcpy(addr, "invalid", sizeof(addr));
+	}
+
+	if (serv[0] == '\0')
+		snprintf(serv, sizeof(serv), "%u", p);
 
 	if (IN6_IS_ADDR_UNSPECIFIED(a)) {
 		if (p == 0)
-			addr[0] = '\0';
+			buf[0] = '\0';
 		else
-			strlcpy(addr, "*", sizeof(addr));
-	} else {
-		struct sockaddr_in6 sin6;
-		const int niflags = NI_NUMERICHOST;
-
-		(void)memset(&sin6, 0, sizeof(sin6));
-		sin6.sin6_family = AF_INET6;
-		sin6.sin6_len = sizeof(sin6);
-		sin6.sin6_addr = *a;
-
-		if (IN6_IS_ADDR_LINKLOCAL(a) &&
-		    *(u_int16_t *)&sin6.sin6_addr.s6_addr[2] != 0) {
-			sin6.sin6_scope_id =
-				ntohs(*(uint16_t *)&sin6.sin6_addr.s6_addr[2]);
-			sin6.sin6_addr.s6_addr[2] = 0;
-			sin6.sin6_addr.s6_addr[3] = 0;
-		}
-
-		if (getnameinfo((struct sockaddr *)&sin6, sin6.sin6_len,
-		    addr, sizeof(addr), NULL, 0, niflags))
-			if (inet_ntop(AF_INET6, a, addr, sizeof(addr)) == NULL)
-				strlcpy(addr, "invalid", sizeof(addr));
+			snprintf(buf, len, "*:%s", serv);
+		return buf;
 	}
-	if (addr[0])
-		snprintf(buf, len, "[%s]:%u", addr, p);
+
+	if (strchr(addr, ':') == NULL)
+		snprintf(buf, len, "%s:%s", addr, serv);
 	else
-		strlcpy(buf, addr, len);
+		snprintf(buf, len, "[%s]:%s", addr, serv);
 
 	return buf;
 }

Reply via email to