Module Name:    src
Committed By:   joerg
Date:           Thu Jan 31 14:30:47 UTC 2013

Modified Files:
        src/sys/kern: uipc_domain.c
        src/sys/sys: socket.h

Log Message:
Add sockaddr_format to ease debugging code dealing with socket
addresses.


To generate a diff of this commit:
cvs rdiff -u -r1.87 -r1.88 src/sys/kern/uipc_domain.c
cvs rdiff -u -r1.107 -r1.108 src/sys/sys/socket.h

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

Modified files:

Index: src/sys/kern/uipc_domain.c
diff -u src/sys/kern/uipc_domain.c:1.87 src/sys/kern/uipc_domain.c:1.88
--- src/sys/kern/uipc_domain.c:1.87	Thu Oct 27 21:10:55 2011
+++ src/sys/kern/uipc_domain.c	Thu Jan 31 14:30:47 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_domain.c,v 1.87 2011/10/27 21:10:55 seanb Exp $	*/
+/*	$NetBSD: uipc_domain.c,v 1.88 2013/01/31 14:30:47 joerg Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1993
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_domain.c,v 1.87 2011/10/27 21:10:55 seanb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_domain.c,v 1.88 2013/01/31 14:30:47 joerg Exp $");
 
 #include <sys/param.h>
 #include <sys/socket.h>
@@ -52,6 +52,7 @@ __KERNEL_RCSID(0, "$NetBSD: uipc_domain.
 #include <sys/file.h>
 #include <sys/filedesc.h>
 #include <sys/kauth.h>
+#include <netinet/in.h>
 
 MALLOC_DECLARE(M_SOCKADDR);
 
@@ -331,6 +332,66 @@ sockaddr_free(struct sockaddr *sa)
 	free(sa, M_SOCKADDR);
 }
 
+void
+sockaddr_format(const struct sockaddr *sa, char *buf, size_t len)
+{
+	const struct sockaddr_un *sun = (const struct sockaddr_un *)sa;
+	const struct sockaddr_in *sin = (const struct sockaddr_in *)sa;
+	const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)sa;
+	const uint8_t *data;
+	size_t data_len;
+
+	if (sa == NULL) {
+		strlcpy(buf, "(null)", len);
+		return;
+	}
+
+	switch (sa->sa_family) {
+	default:
+		snprintf(buf, len, "(unknown socket family %d)",
+		    (int)sa->sa_family);
+		return;
+	case AF_LOCAL:
+		strlcpy(buf, "unix:", len);
+		strlcat(buf, sun->sun_path, len);
+		return;
+	case AF_INET:
+		strlcpy(buf, "inet:", len);
+		if (len < 6)
+			return;
+		buf += 5;
+		len -= 5;
+		data = (const uint8_t *)&sin->sin_addr;
+		data_len = sizeof(sin->sin_addr);
+		break;
+	case AF_INET6:
+		strlcpy(buf, "inet6:", len);
+		if (len < 7)
+			return;
+		buf += 6;
+		len -= 6;
+		data = (const uint8_t *)&sin6->sin6_addr;
+		data_len = sizeof(sin6->sin6_addr);
+		break;
+	}
+	for (;;) {
+		if (--len == 0)
+			break;
+
+		uint8_t hi = *data >> 4;
+		uint8_t lo = *data & 15;
+		--data_len;
+		++data;
+		*buf++ = hi + (hi >= 10 ? 'a' - 10 : '0');
+		if (--len == 0)
+			break;
+		*buf++ = lo + (lo >= 10 ? 'a' - 10 : '0');
+		if (data_len == 0)
+			break;
+	}
+	*buf = 0;
+}
+
 /*
  * sysctl helper to stuff PF_LOCAL pcbs into sysctl structures
  */

Index: src/sys/sys/socket.h
diff -u src/sys/sys/socket.h:1.107 src/sys/sys/socket.h:1.108
--- src/sys/sys/socket.h:1.107	Fri Jun 22 18:26:35 2012
+++ src/sys/sys/socket.h	Thu Jan 31 14:30:47 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: socket.h,v 1.107 2012/06/22 18:26:35 christos Exp $	*/
+/*	$NetBSD: socket.h,v 1.108 2013/01/31 14:30:47 joerg Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -602,6 +602,7 @@ const struct sockaddr *sockaddr_any_by_f
 const void *sockaddr_anyaddr(const struct sockaddr *, socklen_t *);
 int sockaddr_cmp(const struct sockaddr *, const struct sockaddr *);
 struct sockaddr *sockaddr_dup(const struct sockaddr *, int);
+void sockaddr_format(const struct sockaddr *, char *, size_t);
 void sockaddr_free(struct sockaddr *);
 __END_DECLS
 #endif /* _KERNEL */

Reply via email to