From nobody@FreeBSD.org  Mon Nov  5 10:13:11 2007
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 25E2916A417
	for <freebsd-gnats-submit@FreeBSD.org>; Mon,  5 Nov 2007 10:13:11 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21])
	by mx1.freebsd.org (Postfix) with ESMTP id 1822E13C491
	for <freebsd-gnats-submit@FreeBSD.org>; Mon,  5 Nov 2007 10:13:11 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.14.1/8.14.1) with ESMTP id lA5ACx21047550
	for <freebsd-gnats-submit@FreeBSD.org>; Mon, 5 Nov 2007 10:12:59 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.14.1/8.14.1/Submit) id lA5ACx0L047547;
	Mon, 5 Nov 2007 10:12:59 GMT
	(envelope-from nobody)
Message-Id: <200711051012.lA5ACx0L047547@www.freebsd.org>
Date: Mon, 5 Nov 2007 10:12:59 GMT
From: Andrew Li <andrew2.li@citi.com>
To: freebsd-gnats-submit@FreeBSD.org
Subject: [patch] Extend ktrace/kdump output
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         117836
>Category:       kern
>Synopsis:       [patch] [request] Extend ktrace/kdump output
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    des
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Mon Nov 05 10:20:00 UTC 2007
>Closed-Date:    Mon Sep 01 08:04:47 UTC 2008
>Last-Modified:  Mon Sep  1 08:10:01 UTC 2008
>Originator:     Andrew Li
>Release:        FreeBSD 8.0-CURRENT
>Organization:
Citigroup
>Environment:
FreeBSD elmo 8.0-CURRENT FreeBSD 8.0-CURRENT #4: Thu Nov  1 18:51:10 EST 2007     root@elmo:/usr/obj_current/var/src_current/sys/GENERIC  i386

and

FreeBSD elmo 7.0-CURRENT FreeBSD 7.0-CURRENT #82: Fri Oct 19 16:34:25
EST 2007   root at elmo:/usr/obj_current/var/src_current/sys/GENERIC   i386
>Description:
Extended ktrace/kdump output to decode struct sockaddr and struct stat. The new ktrace/kdump shows a more readable output for struct sockaddr and {f,l,}stat(2).

For example, the old ktrace/kdump on struct sockaddr:
  2345 telnet CALL connect(0x3,0xbfbfe600,0x1c)
  2345 telnet RET connect 0

The new ktrace/kdump on struct sockaddr:
  2345 telnet CALL connect(0x3,0xbfbfe600,0x1c)
  2345 telnet SOCK {AF_INET, 127.0.0.1:8000}
  2345 telnet RET connect 0

Old ktrace/kdump for stat(2):
  34536 stat CALL stat(0x8048614,0xbfbfe908)
  34536 stat RET stat 0

New ktrace/kdump for stat(2):
  34534 stat CALL stat(0x8048614,0xbfbfe908)
  34534 stat STAT {dev=100, ino=383524, mode=-rw-r--r-- , nlink=1,
uid=1000, gid=1000, rdev=1528768, atime=1192715539, stime=1192471088,
ctime=1192471088, birthtime=1192471088, size=17898, blksize=4096,
blocks=36, flags=0x0}
  34534 stat RET stat 0

The patch passed "make universe" on 7.0-CURRENT, and "make world" on 8.0-CURRENT.
>How-To-Repeat:

>Fix:


Patch attached with submission follows:

*** ./sys/kern/kern_ktrace.c.orig	Thu Aug 30 07:17:11 2007
--- ./sys/kern/kern_ktrace.c	Mon Oct 22 12:18:26 2007
***************
*** 51,56 ****
--- 51,58 ----
  #include <sys/proc.h>
  #include <sys/unistd.h>
  #include <sys/vnode.h>
+ #include <sys/socket.h>
+ #include <sys/stat.h>
  #include <sys/ktrace.h>
  #include <sys/sx.h>
  #include <sys/sysctl.h>
***************
*** 107,113 ****
  	sizeof(struct ktr_genio),		/* KTR_GENIO */
  	sizeof(struct ktr_psig),		/* KTR_PSIG */
  	sizeof(struct ktr_csw),			/* KTR_CSW */
! 	0					/* KTR_USER */
  };
  
  static STAILQ_HEAD(, ktr_request) ktr_free;
--- 109,117 ----
  	sizeof(struct ktr_genio),		/* KTR_GENIO */
  	sizeof(struct ktr_psig),		/* KTR_PSIG */
  	sizeof(struct ktr_csw),			/* KTR_CSW */
! 	0,					/* KTR_USER */
! 	0,					/* KTR_SOCKADDR */
! 	0					/* KTR_STAT */
  };
  
  static STAILQ_HEAD(, ktr_request) ktr_free;
***************
*** 552,557 ****
--- 556,610 ----
  	kc->user = user;
  	ktr_enqueuerequest(curthread, req);
  }
+ 
+ void
+ ktrsockaddr(sin)
+ 	struct sockaddr *sin;
+ {
+ 	struct ktr_request *req;
+ 	char *buf = NULL;
+ 
+ 	if (sin && sin->sa_len > 0) {
+ 		buf = malloc(sin->sa_len, M_KTRACE, M_WAITOK);
+ 		bcopy(sin, buf, sin->sa_len);
+ 	}
+ 	req = ktr_getrequest(KTR_SOCKADDR);
+ 	if (req == NULL) {
+ 		if (buf != NULL)
+ 			free(buf, M_KTRACE);
+ 		return;
+ 	}
+ 	if (sin && sin->sa_len > 0) {
+ 		req->ktr_buffer = buf;
+ 		req->ktr_header.ktr_len = sin->sa_len;
+ 	}
+ 	ktr_submitrequest(curthread, req);
+ }
+ 
+ void
+ ktrstat(statp)
+ 	struct stat *statp;
+ {
+ 	struct ktr_request *req;
+ 	struct stat *buf = NULL;
+ 
+ 	if (statp) {
+ 		buf = malloc(sizeof(struct stat), M_KTRACE, M_WAITOK);
+ 		*buf = *statp;
+ 	}
+ 	req = ktr_getrequest(KTR_STAT);
+ 	if (req == NULL) {
+ 		if (buf != NULL)
+ 			free(buf, M_KTRACE);
+ 		return;
+ 	}
+ 	if (statp) {
+ 		req->ktr_buffer = buf;
+ 		req->ktr_header.ktr_len = sizeof(struct stat);
+ 	}
+ 
+ 	ktr_submitrequest(curthread, req);
+ }
  #endif /* KTRACE */
  
  /* Interface and common routines */
*** ./sys/kern/vfs_syscalls.c.orig	Mon Sep 10 10:00:16 2007
--- ./sys/kern/vfs_syscalls.c	Mon Oct 22 12:17:00 2007
***************
*** 38,43 ****
--- 38,44 ----
  __FBSDID("$FreeBSD: src/sys/kern/vfs_syscalls.c,v 1.443 2007/09/10 00:00:16 rwatson Exp $");
  
  #include "opt_compat.h"
+ #include "opt_ktrace.h"
  #include "opt_mac.h"
  
  #include <sys/param.h>
***************
*** 67,72 ****
--- 68,76 ----
  #include <sys/jail.h>
  #include <sys/syscallsubr.h>
  #include <sys/sysctl.h>
+ #ifdef KTRACE
+ #include <sys/ktrace.h>
+ #endif
  
  #include <machine/stdarg.h>
  
***************
*** 2118,2123 ****
--- 2122,2131 ----
  	if (error)
  		return (error);
  	*sbp = sb;
+ #ifdef KTRACE
+ 	if (KTRPOINT(td, KTR_STAT))
+ 		ktrstat(&sb);
+ #endif
  	return (0);
  }
  
***************
*** 2169,2174 ****
--- 2177,2186 ----
  	if (error)
  		return (error);
  	*sbp = sb;
+ #ifdef KTRACE
+ 	if (KTRPOINT(td, KTR_STAT))
+ 		ktrstat(&sb);
+ #endif
  	return (0);
  }
  
*** ./sys/kern/kern_descrip.c.orig	Tue Aug  7 00:26:00 2007
--- ./sys/kern/kern_descrip.c	Sat Oct 20 20:17:03 2007
***************
*** 39,44 ****
--- 39,45 ----
  
  #include "opt_compat.h"
  #include "opt_ddb.h"
+ #include "opt_ktrace.h"
  
  #include <sys/param.h>
  #include <sys/systm.h>
***************
*** 69,74 ****
--- 70,78 ----
  #include <sys/sysproto.h>
  #include <sys/unistd.h>
  #include <sys/vnode.h>
+ #ifdef KTRACE
+ #include <sys/ktrace.h>
+ #endif
  
  #include <security/audit/audit.h>
  
***************
*** 1129,1134 ****
--- 1133,1142 ----
  
  	error = fo_stat(fp, sbp, td->td_ucred, td);
  	fdrop(fp, td);
+ #ifdef KTRACE
+ 	if (error == 0 && KTRPOINT(td, KTR_STAT))
+ 		ktrstat(sbp);
+ #endif
  	return (error);
  }
  
*** ./sys/kern/uipc_syscalls.c.orig	Mon Aug 27 15:19:45 2007
--- ./sys/kern/uipc_syscalls.c	Mon Nov  5 18:24:06 2007
***************
*** 227,232 ****
--- 227,236 ----
  	if (error)
  		return (error);
  	so = fp->f_data;
+ #ifdef KTRACE
+ 	if (KTRPOINT(td, KTR_SOCKADDR))
+ 		ktrsockaddr(sa);
+ #endif
  #ifdef MAC
  	SOCK_LOCK(so);
  	error = mac_check_socket_bind(td->td_ucred, so, sa);
***************
*** 454,459 ****
--- 458,467 ----
  		/* check sa_len before it is destroyed */
  		if (*namelen > sa->sa_len)
  			*namelen = sa->sa_len;
+ #ifdef KTRACE
+ 		if (KTRPOINT(td, KTR_SOCKADDR))
+ 			ktrsockaddr(sa);
+ #endif
  		*name = sa;
  		sa = NULL;
  	}
***************
*** 548,553 ****
--- 556,565 ----
  		error = EALREADY;
  		goto done1;
  	}
+ #ifdef KTRACE
+ 	if (KTRPOINT(td, KTR_SOCKADDR))
+ 		ktrsockaddr(sa);
+ #endif
  #ifdef MAC
  	SOCK_LOCK(so);
  	error = mac_check_socket_connect(td->td_ucred, so, sa);
***************
*** 1070,1075 ****
--- 1082,1091 ----
  	}
  out:
  	fdrop(fp, td);
+ #ifdef KTRACE
+ 	if (fromsa && KTRPOINT(td, KTR_SOCKADDR))
+ 		ktrsockaddr(fromsa);
+ #endif
  	if (fromsa)
  		FREE(fromsa, M_SONAME);
  
***************
*** 1474,1479 ****
--- 1490,1499 ----
  	else
  		len = MIN(*alen, (*sa)->sa_len);
  	*alen = len;
+ #ifdef KTRACE
+ 	if (KTRPOINT(td, KTR_SOCKADDR))
+ 		ktrsockaddr(*sa);
+ #endif
  bad:
  	fdrop(fp, td);
  	if (error && *sa) {
***************
*** 1571,1576 ****
--- 1591,1600 ----
  	else
  		len = MIN(*alen, (*sa)->sa_len);
  	*alen = len;
+ #ifdef KTRACE
+ 	if (KTRPOINT(td, KTR_SOCKADDR))
+ 		ktrsockaddr(*sa);
+ #endif
  bad:
  	if (error && *sa) {
  		free(*sa, M_SONAME);
***************
*** 2347,2352 ****
--- 2371,2380 ----
  	error = getsock(td->td_proc->p_fd, uap->sd, &fp, NULL);
  	if (error)
  		goto sctp_bad;
+ #ifdef KTRACE
+ 	if (KTRPOINT(td, KTR_SOCKADDR))
+ 		ktrsockaddr(to);
+ #endif
  
  	iov[0].iov_base = uap->msg;
  	iov[0].iov_len = uap->mlen;
***************
*** 2450,2455 ****
--- 2478,2487 ----
  	error = copyiniov(uap->iov, uap->iovlen, &iov, EMSGSIZE);
  	if (error)
  		goto sctp_bad1;
+ #ifdef KTRACE
+ 	if (KTRPOINT(td, KTR_SOCKADDR))
+ 		ktrsockaddr(to);
+ #endif
  
  	so = (struct socket *)fp->f_data;
  #ifdef MAC
***************
*** 2633,2638 ****
--- 2665,2674 ----
  			goto out;
  		}
  	}
+ #ifdef KTRACE
+ 	if (KTRPOINT(td, KTR_SOCKADDR))
+ 		ktrsockaddr(fromsa);
+ #endif
  	if (uap->msg_flags) {
  		error = copyout(&msg_flags, uap->msg_flags, sizeof (int));
  		if (error) {
*** ./sys/sys/ktrace.h.orig	Tue Dec 27 09:09:09 2005
--- ./sys/sys/ktrace.h	Sat Oct 20 20:15:41 2007
***************
*** 151,156 ****
--- 151,168 ----
  #define KTR_USER	7
  
  /*
+  * KTR_SOCKADDR - socket address calls
+  */
+ #define KTR_SOCKADDR	8
+ struct sockaddr;
+ 
+ /*
+  * KTR_STAT - file stat calls
+  */
+ #define KTR_STAT	9
+ struct stat;
+ 
+ /*
   * KTR_DROP - If this bit is set in ktr_type, then at least one event
   * between the previous record and this record was dropped.
   */
***************
*** 167,172 ****
--- 179,186 ----
  #define	KTRFAC_PSIG	(1<<KTR_PSIG)
  #define KTRFAC_CSW	(1<<KTR_CSW)
  #define KTRFAC_USER	(1<<KTR_USER)
+ #define KTRFAC_SOCKADDR	(1<<KTR_SOCKADDR)
+ #define KTRFAC_STAT	(1<<KTR_STAT)
  /*
   * trace flags (also in p_traceflags)
   */
***************
*** 185,190 ****
--- 199,206 ----
  void	ktrsysret(int, int, register_t);
  void	ktrprocexit(struct thread *);
  void	ktruserret(struct thread *);
+ void	ktrsockaddr(struct sockaddr *);
+ void	ktrstat(struct stat *);
  
  #else
  
*** ./usr.bin/kdump/kdump.c.orig	Tue Jul 10 10:01:30 2007
--- ./usr.bin/kdump/kdump.c	Mon Nov  5 21:04:38 2007
***************
*** 58,69 ****
--- 58,83 ----
  #include <sys/ktrace.h>
  #include <sys/ioctl.h>
  #include <sys/socket.h>
+ #include <sys/stat.h>
+ #include <sys/un.h>
+ #ifdef IPX
+ #include <sys/types.h>
+ #include <netipx/ipx.h>
+ #endif
+ #ifdef NETATALK
+ #include <netatalk/at.h>
+ #endif
+ #include <netinet/in.h>
  #include <dlfcn.h>
  #include <err.h>
+ #include <grp.h>
+ #include <inttypes.h>
  #include <locale.h>
+ #include <pwd.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
+ #include <time.h>
  #include <unistd.h>
  #include <vis.h>
  #include "ktrace.h"
***************
*** 80,92 ****
  void ktrpsig(struct ktr_psig *);
  void ktrcsw(struct ktr_csw *);
  void ktruser(int, unsigned char *);
  void usage(void);
  const char *ioctlname(u_long);
  
! int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata;
  const char *tracefile = DEF_TRACEFILE;
  struct ktr_header ktr_header;
  
  #define eqs(s1, s2)	(strcmp((s1), (s2)) == 0)
  
  int
--- 94,110 ----
  void ktrpsig(struct ktr_psig *);
  void ktrcsw(struct ktr_csw *);
  void ktruser(int, unsigned char *);
+ void ktrsockaddr(struct sockaddr *);
+ void ktrstat(struct stat *);
  void usage(void);
  const char *ioctlname(u_long);
  
! int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata,
!     resolv = 0;
  const char *tracefile = DEF_TRACEFILE;
  struct ktr_header ktr_header;
  
+ #define TIME_FORMAT	"%b %e %T %Y"
  #define eqs(s1, s2)	(strcmp((s1), (s2)) == 0)
  
  int
***************
*** 100,106 ****
  
  	(void) setlocale(LC_CTYPE, "");
  
! 	while ((ch = getopt(argc,argv,"f:dElm:np:HRsTt:")) != -1)
  		switch((char)ch) {
  		case 'f':
  			tracefile = optarg;
--- 118,124 ----
  
  	(void) setlocale(LC_CTYPE, "");
  
! 	while ((ch = getopt(argc,argv,"f:dElm:np:HRrsTt:")) != -1)
  		switch((char)ch) {
  		case 'f':
  			tracefile = optarg;
***************
*** 120,125 ****
--- 138,146 ----
  		case 'p':
  			pid = atoi(optarg);
  			break;
+ 		case 'r':
+ 			resolv = 1;
+ 			break;
  		case 's':
  			suppressdata = 1;
  			break;
***************
*** 209,214 ****
--- 230,241 ----
  		case KTR_USER:
  			ktruser(ktrlen, m);
  			break;
+ 		case KTR_SOCKADDR:
+ 			ktrsockaddr((struct sockaddr *)m);
+ 			break;
+ 		case KTR_STAT:
+ 			ktrstat((struct stat *)m);
+ 			break;
  		default:
  			printf("\n");
  			break;
***************
*** 260,265 ****
--- 287,298 ----
  	case KTR_USER:
  		type = "USER";
  		break;
+ 	case KTR_SOCKADDR:
+ 		type = "SOCK";
+ 		break;
+ 	case KTR_STAT:
+ 		type = "STAT";
+ 		break;
  	default:
  		(void)sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
  		type = unknown;
***************
*** 1115,1120 ****
--- 1148,1294 ----
  }
  
  void
+ ktrsockaddr(struct sockaddr *kts)
+ {
+ /*
+  TODO: Support additional address families
+ 	#include <netatm/atm.h>
+ 	struct sockaddr_atm	*atm;
+ 	#include <netnatm/natm.h>
+ 	struct sockaddr_natm	*natm;
+ 	#include <netsmb/netbios.h>
+ 	struct sockaddr_nb	*nb;
+ */
+ 	char addr[64];
+ 
+ 	printf("{ ");
+ 	sockaprotoname(kts->sa_family);
+ 	switch(kts->sa_family) {
+ 	case AF_INET: {
+ 		struct sockaddr_in	*in;
+ 
+ 		in = (struct sockaddr_in *)kts;
+ 		printf(", %s:%u }\n", inet_ntoa(in->sin_addr),
+ 			ntohs(in->sin_port));
+ 		break;
+ 	}
+ #ifdef NETATALK
+ 	case AF_APPLETALK: {
+ 		struct sockaddr_at	*at;
+ 		struct netrange		*nr;
+ 
+ 		at = (struct sockaddr_at *)kts;
+ 		nr = &at->sat_range.r_netrange;
+ 		printf(", %d.%d, %d-%d, %d }\n", ntohs(at->sat_addr.s_net),
+ 			at->sat_addr.s_node, ntohs(nr->nr_firstnet),
+ 			ntohs(nr->nr_lastnet), nr->nr_phase);
+ 		break;
+ 	}
+ #endif
+ 	case AF_INET6: {
+ 		struct sockaddr_in6	*in6;
+ 
+ 		in6 = (struct sockaddr_in6 *)kts;
+ 		inet_ntop(AF_INET6, &in6->sin6_addr, addr, sizeof(addr));
+ 		printf(", [%s]:%u }\n", addr, htons(in6->sin6_port));
+ 		break;
+ 	}
+ #ifdef IPX
+ 	case AF_IPX: {
+ 		struct sockaddr_ipx	*ipx;
+ 
+ 		ipx = (struct sockaddr_ipx *)kts;
+ 		printf(", %s }\n", ipx_ntoa(ipx->sipx_addr));
+ 		break;
+ 	}
+ #endif
+ 	case AF_UNIX: {
+ 		struct sockaddr_un	*un;
+ 
+ 		un = (struct sockaddr_un *)kts;
+ 		printf(", %.*s }\n", un->sun_len, un->sun_path);
+ 		break;
+ 	}
+ 	default:
+ 		printf(", UNKNOWN FAMILY }\n");
+ 	}
+ }
+ 
+ void
+ ktrstat(struct stat *statp)
+ {
+ 	char mode[12], timestr[PATH_MAX + 4];
+ 	struct passwd *pwd;
+ 	struct group  *grp;
+ 	struct tm *tm;
+ 
+ 	strmode(statp->st_mode, mode);
+ 	printf("{dev=%ju, ino=%ju, mode=%s, nlink=%ju, ",
+ 		(uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino, mode,
+ 		(uintmax_t)statp->st_nlink);
+ 	if (resolv == 0 || (pwd = getpwuid(statp->st_uid)) == NULL)
+ 		printf("uid=%ju, ", (uintmax_t)statp->st_uid);
+ 	else
+ 		printf("uid=\"%s\", ", pwd->pw_name);
+ 	if (resolv == 0 || (grp = getgrgid(statp->st_gid)) == NULL)
+ 		printf("gid=%ju, ", (uintmax_t)statp->st_gid);
+ 	else
+ 		printf("gid=\"%s\", ", grp->gr_name);
+ 	printf("rdev=%ju, ", (uintmax_t)statp->st_rdev);
+ 	printf("atime=");
+ 	if (resolv == 0)
+ 		printf("%ld", statp->st_atimespec.tv_sec);
+ 	else {
+ 		tm = localtime(&statp->st_atimespec.tv_sec);
+ 		(void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
+ 		printf("\"%s\"", timestr);
+ 	}
+ 	if (statp->st_atimespec.tv_nsec != 0)
+ 		printf(".%09ld, ", statp->st_atimespec.tv_nsec);
+ 	else
+ 		printf(", ");
+ 	printf("stime=");
+ 	if (resolv == 0)
+ 		printf("%ld", statp->st_mtimespec.tv_sec);
+ 	else {
+ 		tm = localtime(&statp->st_mtimespec.tv_sec);
+ 		(void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
+ 		printf("\"%s\"", timestr);
+ 	}
+ 	if (statp->st_mtimespec.tv_nsec != 0)
+ 		printf(".%09ld, ", statp->st_mtimespec.tv_nsec);
+ 	else
+ 		printf(", ");
+ 	printf("ctime=");
+ 	if (resolv == 0)
+ 		printf("%ld", statp->st_ctimespec.tv_sec);
+ 	else {
+ 		tm = localtime(&statp->st_ctimespec.tv_sec);
+ 		(void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
+ 		printf("\"%s\"", timestr);
+ 	}
+ 	if (statp->st_ctimespec.tv_nsec != 0)
+ 		printf(".%09ld, ", statp->st_ctimespec.tv_nsec);
+ 	else
+ 		printf(", ");
+ 	printf("birthtime=");
+ 	if (resolv == 0)
+ 		printf("%ld", statp->st_birthtimespec.tv_sec);
+ 	else {
+ 		tm = localtime(&statp->st_birthtimespec.tv_sec);
+ 		(void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
+ 		printf("\"%s\"", timestr);
+ 	}
+ 	if (statp->st_birthtimespec.tv_nsec != 0)
+ 		printf(".%09ld, ", statp->st_birthtimespec.tv_nsec);
+ 	else
+ 		printf(", ");
+ 	printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x}\n",
+ 		(uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize,
+ 		(intmax_t)statp->st_blocks, statp->st_flags);
+ }
+ 
+ void
  usage(void)
  {
  	(void)fprintf(stderr,
*** ./usr.bin/kdump/mksubr.orig	Tue Apr 10 05:16:24 2007
--- ./usr.bin/kdump/mksubr	Sat Oct 20 20:15:07 2007
***************
*** 337,342 ****
--- 337,343 ----
  auto_switch_type "minheritname" "INHERIT_[A-Z]+[[:space:]]+[0-9]+" "sys/mman.h"
  auto_switch_type "quotactlname" "Q_[A-Z]+[[:space:]]+0x[0-9]+" "ufs/ufs/quota.h"
  auto_if_type "sockdomainname" "PF_[[:alnum:]]+[[:space:]]+" "sys/socket.h"
+ auto_if_type "sockaprotoname" "AF_[[:alnum:]]+[[:space:]]+" "sys/socket.h"
  auto_if_type "sockipprotoname" "IPPROTO_[[:alnum:]]+[[:space:]]+" "netinet/in.h"
  auto_switch_type "sockoptname" "SO_[A-Z]+[[:space:]]+0x[0-9]+" "sys/socket.h"
  auto_switch_type "socktypename" "SOCK_[A-Z]+[[:space:]]+[1-9]+[0-9]*" "sys/socket.h"
*** ./usr.bin/kdump/kdump.1.orig	Fri Nov 18 21:36:28 2005
--- ./usr.bin/kdump/kdump.1	Mon Oct 22 22:10:02 2007
***************
*** 96,106 ****
  same trace file.
  .It Fl R
  Display relative timestamps (time since previous entry).
  .It Fl s
  Suppress display of I/O data.
  .It Fl T
  Display absolute timestamps for each entry (seconds since epoch).
! .It Fl t Ar cnisuw
  See the
  .Fl t
  option of
--- 96,109 ----
  same trace file.
  .It Fl R
  Display relative timestamps (time since previous entry).
+ .It Fl r
+ Translate uid, gid and timespecs for STAT records into username,
+ groupname and local time, rather than reporting them as numbers.
  .It Fl s
  Suppress display of I/O data.
  .It Fl T
  Display absolute timestamps for each entry (seconds since epoch).
! .It Fl t Ar cnikstuw
  See the
  .Fl t
  option of
***************
*** 165,171 ****
--- 168,176 ----
  .It Li RET Ta return from syscall Ta syscall name and return value
  .It Li NAMI Ta file name lookup Ta path to file
  .It Li GENIO Ta general I/O Ta fd, read/write, number of bytes
+ .It Li SOCK Ta sockaddr syscall Ta struct sockaddr values
  .It Li SIG Ta signal Ta signal name, handler, mask, code
+ .It Li STAT Ta stat syscall Ta struct stat values
  .It Li CSW Ta context switch Ta stop/resume user/kernel
  .It Li USER Ta data from user process Ta the data
  .El
*** ./usr.bin/ktrace/ktrace.h.orig	Sun Apr 28 23:00:16 2002
--- ./usr.bin/ktrace/ktrace.h	Sat Oct 20 20:13:59 2007
***************
*** 35,41 ****
   */
  
  #define DEF_POINTS (KTRFAC_SYSCALL | KTRFAC_SYSRET | KTRFAC_NAMEI | \
! 		  KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_USER)
  
  #define ALL_POINTS (DEF_POINTS | KTRFAC_CSW)
  
--- 35,42 ----
   */
  
  #define DEF_POINTS (KTRFAC_SYSCALL | KTRFAC_SYSRET | KTRFAC_NAMEI | \
! 		  KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_USER | \
! 		  KTRFAC_SOCKADDR | KTRFAC_STAT)
  
  #define ALL_POINTS (DEF_POINTS | KTRFAC_CSW)
  
*** ./usr.bin/ktrace/ktrace.1.orig	Tue Nov  7 02:17:50 2006
--- ./usr.bin/ktrace/ktrace.1	Mon Oct 22 22:11:04 2007
***************
*** 117,131 ****
  .It Cm i
  trace
  .Tn I/O
  .It Cm s
  trace signal processing
  .It Cm u
  userland traces
  .It Cm w
  context switches
  .It Cm +
  trace the default set of trace points -
! .Cm c , n , i , s , u
  .El
  .It Ar command
  Execute
--- 117,135 ----
  .It Cm i
  trace
  .Tn I/O
+ .It Cm k
+ trace sockaddr content
  .It Cm s
  trace signal processing
+ .It Cm t
+ trace stat struct for stat(2)
  .It Cm u
  userland traces
  .It Cm w
  context switches
  .It Cm +
  trace the default set of trace points -
! .Cm c , n , i , k , s , t , u
  .El
  .It Ar command
  Execute
*** ./usr.bin/ktrace/subr.c.orig	Sat Nov 27 17:51:38 2004
--- ./usr.bin/ktrace/subr.c	Sat Oct 20 20:13:59 2007
***************
*** 71,79 ****
--- 71,85 ----
  		case 'i':
  			facs |= KTRFAC_GENIO;
  			break;
+ 		case 'k':
+ 			facs |= KTRFAC_SOCKADDR;
+ 			break;
  		case 's':
  			facs |= KTRFAC_PSIG;
  			break;
+ 		case 't':
+ 			facs |= KTRFAC_STAT;
+ 			break;
  		case 'u':
  			facs |= KTRFAC_USER;
  			break;


>Release-Note:
>Audit-Trail:
State-Changed-From-To: open->feedback 
State-Changed-By: kmacy 
State-Changed-When: Fri Nov 16 02:53:44 UTC 2007 
State-Changed-Why:  

Need to confirm that this is still pending. 


Responsible-Changed-From-To: freebsd-bugs->kmacy 
Responsible-Changed-By: kmacy 
Responsible-Changed-When: Fri Nov 16 02:53:44 UTC 2007 
Responsible-Changed-Why:  

Need to confirm that this is still pending.  

http://www.freebsd.org/cgi/query-pr.cgi?pr=117836 
Responsible-Changed-From-To: kmacy->des 
Responsible-Changed-By: des 
Responsible-Changed-When: Fri Feb 15 23:51:46 UTC 2008 
Responsible-Changed-Why:  
Taking over as agreed upon with kmacy 

http://www.freebsd.org/cgi/query-pr.cgi?pr=117836 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/117836: commit references a PR
Date: Sat, 23 Feb 2008 01:01:54 +0000 (UTC)

 des         2008-02-23 01:01:49 UTC
 
   FreeBSD src repository
 
   Modified files:
     sys/kern             kern_descrip.c kern_ktrace.c 
                          uipc_syscalls.c vfs_syscalls.c 
     sys/sys              ktrace.h 
     usr.bin/kdump        kdump.1 kdump.c mksubr 
     usr.bin/ktrace       ktrace.1 ktrace.h subr.c 
   Log:
   This patch adds a new ktrace(2) record type, KTR_STRUCT, whose payload
   consists of the null-terminated name and the contents of any structure
   you wish to record.  A new ktrstruct() function constructs and emits a
   KTR_STRUCT record.  It is accompanied by convenience macros for struct
   stat and struct sockaddr.
   
   In kdump(1), KTR_STRUCT records are handled by a dispatcher function
   that runs stringent sanity checks on its contents before handing it
   over to individual decoding funtions for each type of structure.
   Currently supported structures are struct stat and struct sockaddr for
   the AF_INET, AF_INET6 and AF_UNIX families; support for AF_APPLETALK
   and AF_IPX is present but disabled, as I am unable to test it properly.
   
   Since 's' was already taken, the letter 't' is used by ktrace(1) to
   enable KTR_STRUCT trace points, and in kdump(1) to enable their
   decoding.
   
   Derived from patches by Andrew Li <andrew2.li@citi.com>.
   
   PR:             kern/117836
   MFC after:      3 weeks
   
   Revision  Changes    Path
   1.324     +8 -0      src/sys/kern/kern_descrip.c
   1.126     +31 -1     src/sys/kern/kern_ktrace.c
   1.268     +36 -0     src/sys/kern/uipc_syscalls.c
   1.450     +12 -0     src/sys/kern/vfs_syscalls.c
   1.34      +13 -0     src/sys/sys/ktrace.h
   1.16      +7 -3      src/usr.bin/kdump/kdump.1
   1.40      +239 -4    src/usr.bin/kdump/kdump.c
   1.11      +1 -0      src/usr.bin/kdump/mksubr
   1.19      +7 -5      src/usr.bin/ktrace/ktrace.1
   1.5       +1 -1      src/usr.bin/ktrace/ktrace.h
   1.14      +3 -0      src/usr.bin/ktrace/subr.c
 _______________________________________________
 cvs-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/cvs-all
 To unsubscribe, send any mail to "cvs-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: feedback->patched 
State-Changed-By: des 
State-Changed-When: Sat Feb 23 11:37:35 UTC 2008 
State-Changed-Why:  
Committed to HEAD, awaiting MFC 

http://www.freebsd.org/cgi/query-pr.cgi?pr=117836 

From: Peter Jeremy <peterjeremy@optushome.com.au>
To: bug-followup@FreeBSD.org
Cc: Andrew Li <lia@vk2pj.dyndns.org>
Subject: Re: kern/117836: [patch] [request] Extend ktrace/kdump output
Date: Fri, 29 Aug 2008 18:09:28 +1000

 --b5gNqxB1S1yM7hjW
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 
 Attached is a patch I have been running for several months on 2
 different 7.x systems.
 
 -- 
 Peter Jeremy
 
 --b5gNqxB1S1yM7hjW
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: attachment; filename="releng7.txt"
 
 Index: sys/kern/kern_descrip.c
 ===================================================================
 RCS file: /usr/ncvs/src/sys/kern/kern_descrip.c,v
 retrieving revision 1.313.2.1
 diff -u -r1.313.2.1 kern_descrip.c
 --- sys/kern/kern_descrip.c	14 Feb 2008 11:44:59 -0000	1.313.2.1
 +++ sys/kern/kern_descrip.c	16 May 2008 23:52:45 -0000
 @@ -39,6 +39,7 @@
  
  #include "opt_compat.h"
  #include "opt_ddb.h"
 +#include "opt_ktrace.h"
  
  #include <sys/param.h>
  #include <sys/systm.h>
 @@ -69,6 +70,9 @@
  #include <sys/sysproto.h>
  #include <sys/unistd.h>
  #include <sys/vnode.h>
 +#ifdef KTRACE
 +#include <sys/ktrace.h>
 +#endif
  
  #include <security/audit/audit.h>
  
 @@ -1129,6 +1133,10 @@
  
  	error = fo_stat(fp, sbp, td->td_ucred, td);
  	fdrop(fp, td);
 +#ifdef KTRACE
 +	if (error == 0 && KTRPOINT(td, KTR_STRUCT))
 +		ktrstat(sbp);
 +#endif
  	return (error);
  }
  
 Index: sys/kern/kern_ktrace.c
 ===================================================================
 RCS file: /usr/ncvs/src/sys/kern/kern_ktrace.c,v
 retrieving revision 1.121
 diff -u -r1.121 kern_ktrace.c
 --- sys/kern/kern_ktrace.c	29 Aug 2007 21:17:11 -0000	1.121
 +++ sys/kern/kern_ktrace.c	16 May 2008 23:52:45 -0000
 @@ -51,6 +51,8 @@
  #include <sys/proc.h>
  #include <sys/unistd.h>
  #include <sys/vnode.h>
 +#include <sys/socket.h>
 +#include <sys/stat.h>
  #include <sys/ktrace.h>
  #include <sys/sx.h>
  #include <sys/sysctl.h>
 @@ -107,7 +109,8 @@
  	sizeof(struct ktr_genio),		/* KTR_GENIO */
  	sizeof(struct ktr_psig),		/* KTR_PSIG */
  	sizeof(struct ktr_csw),			/* KTR_CSW */
 -	0					/* KTR_USER */
 +	0,					/* KTR_USER */
 +	0,					/* KTR_STRUCT */
  };
  
  static STAILQ_HEAD(, ktr_request) ktr_free;
 @@ -552,6 +555,33 @@
  	kc->user = user;
  	ktr_enqueuerequest(curthread, req);
  }
 +
 +void
 +ktrstruct(name, namelen, data, datalen)
 +	const char *name;
 +	size_t namelen;
 +	void *data;
 +	size_t datalen;
 +{
 +	struct ktr_request *req;
 +	char *buf = NULL;
 +	size_t buflen;
 +
 +	if (!data)
 +		datalen = 0;
 +	buflen = namelen + 1 + datalen;
 +	buf = malloc(buflen, M_KTRACE, M_WAITOK);
 +	bcopy(name, buf, namelen);
 +	buf[namelen] = '\0';
 +	bcopy(data, buf + namelen + 1, datalen);
 +	if ((req = ktr_getrequest(KTR_STRUCT)) == NULL) {
 +		free(buf, M_KTRACE);
 +		return;
 +	}
 +	req->ktr_buffer = buf;
 +	req->ktr_header.ktr_len = buflen;
 +	ktr_submitrequest(curthread, req);
 +}
  #endif /* KTRACE */
  
  /* Interface and common routines */
 Index: sys/kern/uipc_syscalls.c
 ===================================================================
 RCS file: /usr/ncvs/src/sys/kern/uipc_syscalls.c,v
 retrieving revision 1.259.2.3
 diff -u -r1.259.2.3 uipc_syscalls.c
 --- sys/kern/uipc_syscalls.c	6 Mar 2008 05:41:45 -0000	1.259.2.3
 +++ sys/kern/uipc_syscalls.c	16 May 2008 23:52:45 -0000
 @@ -227,6 +227,10 @@
  	if (error)
  		return (error);
  	so = fp->f_data;
 +#ifdef KTRACE
 +	if (KTRPOINT(td, KTR_STRUCT))
 +		ktrsockaddr(sa);
 +#endif
  #ifdef MAC
  	SOCK_LOCK(so);
  	error = mac_check_socket_bind(td->td_ucred, so, sa);
 @@ -454,6 +458,10 @@
  		/* check sa_len before it is destroyed */
  		if (*namelen > sa->sa_len)
  			*namelen = sa->sa_len;
 +#ifdef KTRACE
 +		if (KTRPOINT(td, KTR_STRUCT))
 +			ktrsockaddr(sa);
 +#endif
  		*name = sa;
  		sa = NULL;
  	}
 @@ -548,6 +556,10 @@
  		error = EALREADY;
  		goto done1;
  	}
 +#ifdef KTRACE
 +	if (KTRPOINT(td, KTR_STRUCT))
 +		ktrsockaddr(sa);
 +#endif
  #ifdef MAC
  	SOCK_LOCK(so);
  	error = mac_check_socket_connect(td->td_ucred, so, sa);
 @@ -1070,6 +1082,10 @@
  	}
  out:
  	fdrop(fp, td);
 +#ifdef KTRACE
 +	if (fromsa && KTRPOINT(td, KTR_STRUCT))
 +		ktrsockaddr(fromsa);
 +#endif
  	if (fromsa)
  		FREE(fromsa, M_SONAME);
  
 @@ -1474,6 +1490,10 @@
  	else
  		len = MIN(*alen, (*sa)->sa_len);
  	*alen = len;
 +#ifdef KTRACE
 +	if (KTRPOINT(td, KTR_STRUCT))
 +		ktrsockaddr(*sa);
 +#endif
  bad:
  	fdrop(fp, td);
  	if (error && *sa) {
 @@ -1571,6 +1591,10 @@
  	else
  		len = MIN(*alen, (*sa)->sa_len);
  	*alen = len;
 +#ifdef KTRACE
 +	if (KTRPOINT(td, KTR_STRUCT))
 +		ktrsockaddr(*sa);
 +#endif
  bad:
  	if (error && *sa) {
  		free(*sa, M_SONAME);
 @@ -2357,6 +2381,10 @@
  	error = getsock(td->td_proc->p_fd, uap->sd, &fp, NULL);
  	if (error)
  		goto sctp_bad;
 +#ifdef KTRACE
 +	if (KTRPOINT(td, KTR_STRUCT))
 +		ktrsockaddr(to);
 +#endif
  
  	iov[0].iov_base = uap->msg;
  	iov[0].iov_len = uap->mlen;
 @@ -2460,6 +2488,10 @@
  	error = copyiniov(uap->iov, uap->iovlen, &iov, EMSGSIZE);
  	if (error)
  		goto sctp_bad1;
 +#ifdef KTRACE
 +	if (KTRPOINT(td, KTR_STRUCT))
 +		ktrsockaddr(to);
 +#endif
  
  	so = (struct socket *)fp->f_data;
  #ifdef MAC
 @@ -2643,6 +2675,10 @@
  			goto out;
  		}
  	}
 +#ifdef KTRACE
 +	if (KTRPOINT(td, KTR_STRUCT))
 +		ktrsockaddr(fromsa);
 +#endif
  	if (uap->msg_flags) {
  		error = copyout(&msg_flags, uap->msg_flags, sizeof (int));
  		if (error) {
 Index: sys/kern/vfs_syscalls.c
 ===================================================================
 RCS file: /usr/ncvs/src/sys/kern/vfs_syscalls.c,v
 retrieving revision 1.443
 diff -u -r1.443 vfs_syscalls.c
 --- sys/kern/vfs_syscalls.c	10 Sep 2007 00:00:16 -0000	1.443
 +++ sys/kern/vfs_syscalls.c	16 May 2008 23:52:45 -0000
 @@ -38,6 +38,7 @@
  __FBSDID("$FreeBSD: src/sys/kern/vfs_syscalls.c,v 1.443 2007/09/10 00:00:16 rwatson Exp $");
  
  #include "opt_compat.h"
 +#include "opt_ktrace.h"
  #include "opt_mac.h"
  
  #include <sys/param.h>
 @@ -67,6 +68,9 @@
  #include <sys/jail.h>
  #include <sys/syscallsubr.h>
  #include <sys/sysctl.h>
 +#ifdef KTRACE
 +#include <sys/ktrace.h>
 +#endif
  
  #include <machine/stdarg.h>
  
 @@ -2118,6 +2122,10 @@
  	if (error)
  		return (error);
  	*sbp = sb;
 +#ifdef KTRACE
 +	if (KTRPOINT(td, KTR_STRUCT))
 +		ktrstat(&sb);
 +#endif
  	return (0);
  }
  
 @@ -2169,6 +2177,10 @@
  	if (error)
  		return (error);
  	*sbp = sb;
 +#ifdef KTRACE
 +	if (KTRPOINT(td, KTR_STRUCT))
 +		ktrstat(&sb);
 +#endif
  	return (0);
  }
  
 Index: sys/sys/ktrace.h
 ===================================================================
 RCS file: /usr/ncvs/src/sys/sys/ktrace.h,v
 retrieving revision 1.33
 diff -u -r1.33 ktrace.h
 --- sys/sys/ktrace.h	26 Dec 2005 22:09:09 -0000	1.33
 +++ sys/sys/ktrace.h	16 May 2008 23:52:45 -0000
 @@ -151,6 +151,13 @@
  #define KTR_USER	7
  
  /*
 + * KTR_STRUCT - misc. structs
 + */
 +#define KTR_STRUCT	8
 +struct sockaddr;
 +struct stat;
 +
 +/*
   * KTR_DROP - If this bit is set in ktr_type, then at least one event
   * between the previous record and this record was dropped.
   */
 @@ -167,6 +174,7 @@
  #define	KTRFAC_PSIG	(1<<KTR_PSIG)
  #define KTRFAC_CSW	(1<<KTR_CSW)
  #define KTRFAC_USER	(1<<KTR_USER)
 +#define KTRFAC_STRUCT	(1<<KTR_STRUCT)
  /*
   * trace flags (also in p_traceflags)
   */
 @@ -185,6 +193,11 @@
  void	ktrsysret(int, int, register_t);
  void	ktrprocexit(struct thread *);
  void	ktruserret(struct thread *);
 +void	ktrstruct(const char *, size_t, void *, size_t);
 +#define ktrsockaddr(s) \
 +	ktrstruct("sockaddr", 8, (s), ((struct sockaddr *)(s))->sa_len)
 +#define ktrstat(s) \
 +	ktrstruct("stat", 4, (s), sizeof(struct stat))
  
  #else
  
 Index: usr.bin/kdump/kdump.1
 ===================================================================
 RCS file: /usr/ncvs/src/usr.bin/kdump/kdump.1,v
 retrieving revision 1.15
 diff -u -r1.15 kdump.1
 --- usr.bin/kdump/kdump.1	18 Nov 2005 10:36:28 -0000	1.15
 +++ usr.bin/kdump/kdump.1	16 May 2008 23:52:45 -0000
 @@ -32,7 +32,7 @@
  .\"	@(#)kdump.1	8.1 (Berkeley) 6/6/93
  .\" $FreeBSD: src/usr.bin/kdump/kdump.1,v 1.15 2005/11/18 10:36:28 ru Exp $
  .\"
 -.Dd November 12, 2005
 +.Dd February 23, 2008
  .Dt KDUMP 1
  .Os
  .Sh NAME
 @@ -44,7 +44,7 @@
  .Op Fl f Ar trfile
  .Op Fl m Ar maxdata
  .Op Fl p Ar pid
 -.Op Fl t Op cnisuw
 +.Op Fl t Op cnistuw
  .Sh DESCRIPTION
  The
  .Nm
 @@ -96,11 +96,14 @@
  same trace file.
  .It Fl R
  Display relative timestamps (time since previous entry).
 +.It Fl r
 +When decoding STRU records, display structure members such as UIDs,
 +GIDs, dates etc. symbolically instead of numerically.
  .It Fl s
  Suppress display of I/O data.
  .It Fl T
  Display absolute timestamps for each entry (seconds since epoch).
 -.It Fl t Ar cnisuw
 +.It Fl t Ar cnistuw
  See the
  .Fl t
  option of
 @@ -168,6 +171,7 @@
  .It Li SIG Ta signal Ta signal name, handler, mask, code
  .It Li CSW Ta context switch Ta stop/resume user/kernel
  .It Li USER Ta data from user process Ta the data
 +.It Li STRU Ta various syscalls Ta structure
  .El
  .Sh SEE ALSO
  .Xr ktrace 1
 Index: usr.bin/kdump/kdump.c
 ===================================================================
 RCS file: /usr/ncvs/src/usr.bin/kdump/kdump.c,v
 retrieving revision 1.37.2.2
 diff -u -r1.37.2.2 kdump.c
 --- usr.bin/kdump/kdump.c	12 Jan 2008 00:07:03 -0000	1.37.2.2
 +++ usr.bin/kdump/kdump.c	16 May 2008 23:52:45 -0000
 @@ -58,12 +58,26 @@
  #include <sys/ktrace.h>
  #include <sys/ioctl.h>
  #include <sys/socket.h>
 +#include <sys/stat.h>
 +#include <sys/un.h>
 +#ifdef IPX
 +#include <sys/types.h>
 +#include <netipx/ipx.h>
 +#endif
 +#ifdef NETATALK
 +#include <netatalk/at.h>
 +#endif
 +#include <netinet/in.h>
  #include <dlfcn.h>
  #include <err.h>
 +#include <grp.h>
 +#include <inttypes.h>
  #include <locale.h>
 +#include <pwd.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
 +#include <time.h>
  #include <unistd.h>
  #include <vis.h>
  #include "ktrace.h"
 @@ -80,13 +94,18 @@
  void ktrpsig(struct ktr_psig *);
  void ktrcsw(struct ktr_csw *);
  void ktruser(int, unsigned char *);
 +void ktrsockaddr(struct sockaddr *);
 +void ktrstat(struct stat *);
 +void ktrstruct(char *, size_t);
  void usage(void);
  const char *ioctlname(u_long);
  
 -int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata;
 +int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata,
 +    resolv = 0;
  const char *tracefile = DEF_TRACEFILE;
  struct ktr_header ktr_header;
  
 +#define TIME_FORMAT	"%b %e %T %Y"
  #define eqs(s1, s2)	(strcmp((s1), (s2)) == 0)
  
  int
 @@ -100,7 +119,7 @@
  
  	(void) setlocale(LC_CTYPE, "");
  
 -	while ((ch = getopt(argc,argv,"f:dElm:np:HRsTt:")) != -1)
 +	while ((ch = getopt(argc,argv,"f:dElm:np:HRrsTt:")) != -1)
  		switch((char)ch) {
  		case 'f':
  			tracefile = optarg;
 @@ -120,6 +139,9 @@
  		case 'p':
  			pid = atoi(optarg);
  			break;
 +		case 'r':
 +			resolv = 1;
 +			break;
  		case 's':
  			suppressdata = 1;
  			break;
 @@ -209,6 +231,9 @@
  		case KTR_USER:
  			ktruser(ktrlen, m);
  			break;
 +		case KTR_STRUCT:
 +			ktrstruct(m, ktrlen);
 +			break;
  		default:
  			printf("\n");
  			break;
 @@ -260,6 +285,9 @@
  	case KTR_USER:
  		type = "USER";
  		break;
 +	case KTR_STRUCT:
 +		type = "STRU";
 +		break;
  	default:
  		(void)sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
  		type = unknown;
 @@ -1129,9 +1157,216 @@
  }
  
  void
 +ktrsockaddr(struct sockaddr *sa)
 +{
 +/*
 + TODO: Support additional address families
 +	#include <netatm/atm.h>
 +	struct sockaddr_atm	*atm;
 +	#include <netnatm/natm.h>
 +	struct sockaddr_natm	*natm;
 +	#include <netsmb/netbios.h>
 +	struct sockaddr_nb	*nb;
 +*/
 +	char addr[64];
 +
 +	/*
 +	 * note: ktrstruct() has already verified that sa points to a
 +	 * buffer at least sizeof(struct sockaddr) bytes long and exactly
 +	 * sa->sa_len bytes long.
 +	 */
 +	printf("struct sockaddr { ");
 +	sockfamilyname(sa->sa_family);
 +	printf(", ");
 +
 +#define check_sockaddr_len(n)					\
 +	if (sa_##n->s##n##_len < sizeof(struct sockaddr_##n)) {	\
 +		printf("invalid");				\
 +		break;						\
 +	}
 +
 +	switch(sa->sa_family) {
 +	case AF_INET: {
 +		struct sockaddr_in	*sa_in;
 +
 +		sa_in = (struct sockaddr_in *)sa;
 +		check_sockaddr_len(in);
 +		inet_ntop(AF_INET, &sa_in->sin_addr, addr, sizeof addr);
 +		printf("%s:%u", addr, ntohs(sa_in->sin_port));
 +		break;
 +	}
 +#ifdef NETATALK
 +	case AF_APPLETALK: {
 +		struct sockaddr_at	*sa_at;
 +		struct netrange		*nr;
 +
 +		sa_at = (struct sockaddr_at *)sa;
 +		check_sockaddr_len(at);
 +		nr = &sa_at->sat_range.r_netrange;
 +		printf("%d.%d, %d-%d, %d", ntohs(sa_at->sat_addr.s_net),
 +			sa_at->sat_addr.s_node, ntohs(nr->nr_firstnet),
 +			ntohs(nr->nr_lastnet), nr->nr_phase);
 +		break;
 +	}
 +#endif
 +	case AF_INET6: {
 +		struct sockaddr_in6	*sa_in6;
 +
 +		sa_in6 = (struct sockaddr_in6 *)sa;
 +		check_sockaddr_len(in6);
 +		inet_ntop(AF_INET6, &sa_in6->sin6_addr, addr, sizeof addr);
 +		printf("[%s]:%u", addr, htons(sa_in6->sin6_port));
 +		break;
 +	}
 +#ifdef IPX
 +	case AF_IPX: {
 +		struct sockaddr_ipx	*sa_ipx;
 +
 +		sa_ipx = (struct sockaddr_ipx *)sa;
 +		check_sockaddr_len(ipx);
 +		/* XXX wish we had ipx_ntop */
 +		printf("%s", ipx_ntoa(sa_ipx->sipx_addr));
 +		break;
 +	}
 +#endif
 +	case AF_UNIX: {
 +		struct sockaddr_un *sa_un;
 +
 +		sa_un = (struct sockaddr_un *)sa;
 +		check_sockaddr_len(un);
 +		printf("%.*s", (int)sizeof(sa_un->sun_path), sa_un->sun_path);
 +		break;
 +	}
 +	default:
 +		printf("unknown address family");
 +	}
 +	printf(" }\n");
 +}
 +
 +void
 +ktrstat(struct stat *statp)
 +{
 +	char mode[12], timestr[PATH_MAX + 4];
 +	struct passwd *pwd;
 +	struct group  *grp;
 +	struct tm *tm;
 +
 +	/*
 +	 * note: ktrstruct() has already verified that statp points to a
 +	 * buffer exactly sizeof(struct stat) bytes long.
 +	 */
 +	printf("struct stat {");
 +	strmode(statp->st_mode, mode);
 +	printf("dev=%ju, ino=%ju, mode=%s, nlink=%ju, ",
 +		(uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino, mode,
 +		(uintmax_t)statp->st_nlink);
 +	if (resolv == 0 || (pwd = getpwuid(statp->st_uid)) == NULL)
 +		printf("uid=%ju, ", (uintmax_t)statp->st_uid);
 +	else
 +		printf("uid=\"%s\", ", pwd->pw_name);
 +	if (resolv == 0 || (grp = getgrgid(statp->st_gid)) == NULL)
 +		printf("gid=%ju, ", (uintmax_t)statp->st_gid);
 +	else
 +		printf("gid=\"%s\", ", grp->gr_name);
 +	printf("rdev=%ju, ", (uintmax_t)statp->st_rdev);
 +	printf("atime=");
 +	if (resolv == 0)
 +		printf("%ld", statp->st_atimespec.tv_sec);
 +	else {
 +		tm = localtime(&statp->st_atimespec.tv_sec);
 +		(void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
 +		printf("\"%s\"", timestr);
 +	}
 +	if (statp->st_atimespec.tv_nsec != 0)
 +		printf(".%09ld, ", statp->st_atimespec.tv_nsec);
 +	else
 +		printf(", ");
 +	printf("stime=");
 +	if (resolv == 0)
 +		printf("%ld", statp->st_mtimespec.tv_sec);
 +	else {
 +		tm = localtime(&statp->st_mtimespec.tv_sec);
 +		(void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
 +		printf("\"%s\"", timestr);
 +	}
 +	if (statp->st_mtimespec.tv_nsec != 0)
 +		printf(".%09ld, ", statp->st_mtimespec.tv_nsec);
 +	else
 +		printf(", ");
 +	printf("ctime=");
 +	if (resolv == 0)
 +		printf("%ld", statp->st_ctimespec.tv_sec);
 +	else {
 +		tm = localtime(&statp->st_ctimespec.tv_sec);
 +		(void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
 +		printf("\"%s\"", timestr);
 +	}
 +	if (statp->st_ctimespec.tv_nsec != 0)
 +		printf(".%09ld, ", statp->st_ctimespec.tv_nsec);
 +	else
 +		printf(", ");
 +	printf("birthtime=");
 +	if (resolv == 0)
 +		printf("%ld", statp->st_birthtimespec.tv_sec);
 +	else {
 +		tm = localtime(&statp->st_birthtimespec.tv_sec);
 +		(void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
 +		printf("\"%s\"", timestr);
 +	}
 +	if (statp->st_birthtimespec.tv_nsec != 0)
 +		printf(".%09ld, ", statp->st_birthtimespec.tv_nsec);
 +	else
 +		printf(", ");
 +	printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x",
 +		(uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize,
 +		(intmax_t)statp->st_blocks, statp->st_flags);
 +	printf(" }\n");
 +}
 +
 +void
 +ktrstruct(char *buf, size_t buflen)
 +{
 +	char *name, *data;
 +	size_t namelen, datalen;
 +	int i;
 +
 +	for (name = buf, namelen = 0;
 +	     namelen < buflen && name[namelen] != '\0';
 +	     ++namelen)
 +		/* nothing */;
 +	if (namelen == buflen)
 +		goto invalid;
 +	if (name[namelen] != '\0')
 +		goto invalid;
 +	data = buf + namelen + 1;
 +	datalen = buflen - namelen - 1;
 +	if (datalen == 0)
 +		goto invalid;
 +	/* sanity check */
 +	for (i = 0; i < namelen; ++i)
 +		if (!isalpha((unsigned char)name[i]))
 +			goto invalid;
 +	if (strcmp(name, "stat") == 0) {
 +		if (datalen != sizeof(struct stat))
 +			goto invalid;
 +		ktrstat((struct stat *)data);
 +	} else if (strcmp(name, "sockaddr") == 0) {
 +		if (datalen < sizeof(struct sockaddr) ||
 +		    datalen != ((struct sockaddr *)(data))->sa_len)
 +			goto invalid;
 +		ktrsockaddr((struct sockaddr *)data);
 +	} else {
 +		printf("unknown structure\n");
 +	}
 +	return;
 +invalid:
 +	printf("invalid record\n");
 +}
 +
 +void
  usage(void)
  {
 -	(void)fprintf(stderr,
 -  "usage: kdump [-dEnlHRsT] [-f trfile] [-m maxdata] [-p pid] [-t [cnisuw]]\n");
 +	fprintf(stderr, "usage: kdump [-dEnlHRrsT] [-f trfile] "
 +	    "[-m maxdata] [-p pid] [-t [cnistuw]]\n");
  	exit(1);
  }
 Index: usr.bin/kdump/mksubr
 ===================================================================
 RCS file: /usr/ncvs/src/usr.bin/kdump/mksubr,v
 retrieving revision 1.9
 diff -u -r1.9 mksubr
 --- usr.bin/kdump/mksubr	9 Apr 2007 19:16:24 -0000	1.9
 +++ usr.bin/kdump/mksubr	16 May 2008 23:52:45 -0000
 @@ -337,6 +337,7 @@
  auto_switch_type "minheritname" "INHERIT_[A-Z]+[[:space:]]+[0-9]+" "sys/mman.h"
  auto_switch_type "quotactlname" "Q_[A-Z]+[[:space:]]+0x[0-9]+" "ufs/ufs/quota.h"
  auto_if_type "sockdomainname" "PF_[[:alnum:]]+[[:space:]]+" "sys/socket.h"
 +auto_if_type "sockfamilyname" "AF_[[:alnum:]]+[[:space:]]+" "sys/socket.h"
  auto_if_type "sockipprotoname" "IPPROTO_[[:alnum:]]+[[:space:]]+" "netinet/in.h"
  auto_switch_type "sockoptname" "SO_[A-Z]+[[:space:]]+0x[0-9]+" "sys/socket.h"
  auto_switch_type "socktypename" "SOCK_[A-Z]+[[:space:]]+[1-9]+[0-9]*" "sys/socket.h"
 Index: usr.bin/ktrace/ktrace.1
 ===================================================================
 RCS file: /usr/ncvs/src/usr.bin/ktrace/ktrace.1,v
 retrieving revision 1.18
 diff -u -r1.18 ktrace.1
 --- usr.bin/ktrace/ktrace.1	6 Nov 2006 15:17:50 -0000	1.18
 +++ usr.bin/ktrace/ktrace.1	16 May 2008 23:52:45 -0000
 @@ -32,7 +32,7 @@
  .\"	@(#)ktrace.1	8.1 (Berkeley) 6/6/93
  .\" $FreeBSD: src/usr.bin/ktrace/ktrace.1,v 1.18 2006/11/06 15:17:50 trhodes Exp $
  .\"
 -.Dd November 6, 2006
 +.Dd February 23, 2008
  .Dt KTRACE 1
  .Os
  .Sh NAME
 @@ -43,11 +43,11 @@
  .Op Fl aCcdi
  .Op Fl f Ar trfile
  .Op Fl g Ar pgrp | Fl p Ar pid
 -.Op Fl t Ar trstr
 +.Op Fl t Ar cnistuw
  .Nm
  .Op Fl adi
  .Op Fl f Ar trfile
 -.Op Fl t Ar trstr
 +.Op Fl t Ar cnistuw
  .Ar command
  .Sh DESCRIPTION
  The
 @@ -105,7 +105,7 @@
  Enable (disable) tracing on the indicated process id (only one
  .Fl p
  flag is permitted).
 -.It Fl t Ar trstr
 +.It Fl t Ar cnistuw
  The string argument represents the kernel trace points, one per letter.
  The following table equates the letters with the tracepoints:
  .Pp
 @@ -119,13 +119,15 @@
  .Tn I/O
  .It Cm s
  trace signal processing
 +.It Cm t
 +trace various structures
  .It Cm u
  userland traces
  .It Cm w
  context switches
  .It Cm +
  trace the default set of trace points -
 -.Cm c , n , i , s , u
 +.Cm c , n , i , s , t , u
  .El
  .It Ar command
  Execute
 Index: usr.bin/ktrace/ktrace.h
 ===================================================================
 RCS file: /usr/ncvs/src/usr.bin/ktrace/ktrace.h,v
 retrieving revision 1.4
 diff -u -r1.4 ktrace.h
 --- usr.bin/ktrace/ktrace.h	28 Apr 2002 13:00:16 -0000	1.4
 +++ usr.bin/ktrace/ktrace.h	16 May 2008 23:52:45 -0000
 @@ -35,7 +35,7 @@
   */
  
  #define DEF_POINTS (KTRFAC_SYSCALL | KTRFAC_SYSRET | KTRFAC_NAMEI | \
 -		  KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_USER)
 +		  KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_USER | KTRFAC_STRUCT)
  
  #define ALL_POINTS (DEF_POINTS | KTRFAC_CSW)
  
 Index: usr.bin/ktrace/subr.c
 ===================================================================
 RCS file: /usr/ncvs/src/usr.bin/ktrace/subr.c,v
 retrieving revision 1.13
 diff -u -r1.13 subr.c
 --- usr.bin/ktrace/subr.c	27 Nov 2004 06:51:38 -0000	1.13
 +++ usr.bin/ktrace/subr.c	16 May 2008 23:52:45 -0000
 @@ -74,6 +74,9 @@
  		case 's':
  			facs |= KTRFAC_PSIG;
  			break;
 +		case 't':
 +			facs |= KTRFAC_STRUCT;
 +			break;
  		case 'u':
  			facs |= KTRFAC_USER;
  			break;
 
 --b5gNqxB1S1yM7hjW--

From: =?utf-8?Q?Dag-Erling_Sm=C3=B8rgrav?= <des@des.no>
To: Peter Jeremy <peterjeremy@optushome.com.au>,
    freebsd-gnats-submit@freebsd.org
Cc:  
Subject: Re: kern/117836: [patch] [request] Extend ktrace/kdump output
Date: Sun, 31 Aug 2008 20:43:48 +0200

 Peter Jeremy <peterjeremy@optushome.com.au> writes:
 > Attached is a patch I have been running for several months on 2
 > different 7.x systems.
 
 Why are you submitting this now?
 
 DES
 --=20
 Dag-Erling Sm=C3=B8rgrav - des@des.no

From: Peter Jeremy <peterjeremy@optushome.com.au>
To: Dag-Erling =?iso-8859-1?Q?Sm=F8rgrav?= <des@des.no>
Cc: freebsd-gnats-submit@freebsd.org
Subject: Re: kern/117836: [patch] [request] Extend ktrace/kdump output
Date: Mon, 1 Sep 2008 05:02:37 +1000

 --SdaPbLtAangIkrMZ
 Content-Type: text/plain; charset=iso-8859-1
 Content-Disposition: inline
 Content-Transfer-Encoding: quoted-printable
 
 On 2008-Aug-31 20:43:48 +0200, Dag-Erling Sm=F8rgrav <des@des.no> wrote:
 >Peter Jeremy <peterjeremy@optushome.com.au> writes:
 >> Attached is a patch I have been running for several months on 2
 >> different 7.x systems.
 >
 >Why are you submitting this now?
 
 Confusion on my part - I missed the MFC (I still need to find out why
 my automated builds didn't notice).  My apologies again for this.
 
 --=20
 Peter Jeremy
 Please excuse any delays as the result of my ISP's inability to implement
 an MTA that is either RFC2821-compliant or matches their claimed behaviour.
 
 --SdaPbLtAangIkrMZ
 Content-Type: application/pgp-signature
 Content-Disposition: inline
 
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2.0.9 (FreeBSD)
 
 iEYEARECAAYFAki66s0ACgkQ/opHv/APuIdNkgCgvGyvFuRWClyGUhPCLEvrEb6L
 hZAAoIsZVT2i8SN9QpSO+neTqVi8bRPX
 =1cdn
 -----END PGP SIGNATURE-----
 
 --SdaPbLtAangIkrMZ--
State-Changed-From-To: patched->closed 
State-Changed-By: des 
State-Changed-When: Mon Sep 1 08:04:46 UTC 2008 
State-Changed-Why:  
MFCed to 7 

http://www.freebsd.org/cgi/query-pr.cgi?pr=117836 

From: =?utf-8?Q?Dag-Erling_Sm=C3=B8rgrav?= <des@des.no>
To: Peter Jeremy <peterjeremy@optushome.com.au>
Cc: freebsd-gnats-submit@freebsd.org
Subject: Re: kern/117836: [patch] [request] Extend ktrace/kdump output
Date: Mon, 01 Sep 2008 10:04:14 +0200

 Peter Jeremy <peterjeremy@optushome.com.au> writes:
 > Dag-Erling Sm=C3=B8rgrav <des@des.no> writes:
 > > Why are you submitting this now?
 > Confusion on my part - I missed the MFC (I still need to find out why
 > my automated builds didn't notice).  My apologies again for this.
 
 Ah, OK.  Thanks again!
 
 DES
 --=20
 Dag-Erling Sm=C3=B8rgrav - des@des.no
>Unformatted:
I vaguely recall this making it in. Is it still in the queue?
