summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorotto <otto@openbsd.org>2011-07-08 19:28:36 +0000
committerotto <otto@openbsd.org>2011-07-08 19:28:36 +0000
commitf980d548d51816bd3a9fda5d8037cd6e918ebced (patch)
tree5dc601a1fb3f365460fccc061b035055e0d7ed9a
parentext2fs is not really the most common linux filesystem. (diff)
downloadwireguard-openbsd-f980d548d51816bd3a9fda5d8037cd6e918ebced.tar.xz
wireguard-openbsd-f980d548d51816bd3a9fda5d8037cd6e918ebced.zip
Support sending struct info to kdump. So far for struct stat and
struct sockaddress; mostly from freebsd. ok deraadt@ tedu@ nicm@
-rw-r--r--lib/libc/sys/ktrace.25
-rw-r--r--sys/kern/kern_descrip.c7
-rw-r--r--sys/kern/kern_ktrace.c26
-rw-r--r--sys/kern/uipc_syscalls.c40
-rw-r--r--sys/kern/vfs_syscalls.c7
-rw-r--r--sys/sys/ktrace.h21
-rw-r--r--usr.bin/kdump/kdump.17
-rw-r--r--usr.bin/kdump/kdump.c232
-rw-r--r--usr.bin/kdump/kdump_subr.h3
-rw-r--r--usr.bin/kdump/mksubr4
-rw-r--r--usr.bin/ktrace/ktrace.111
-rw-r--r--usr.bin/ktrace/ktrace.h4
-rw-r--r--usr.bin/ktrace/subr.c5
13 files changed, 346 insertions, 26 deletions
diff --git a/lib/libc/sys/ktrace.2 b/lib/libc/sys/ktrace.2
index bc5540ff951..b1cae715ba6 100644
--- a/lib/libc/sys/ktrace.2
+++ b/lib/libc/sys/ktrace.2
@@ -1,4 +1,4 @@
-.\" $OpenBSD: ktrace.2,v 1.19 2007/07/17 16:30:10 jmc Exp $
+.\" $OpenBSD: ktrace.2,v 1.20 2011/07/08 19:30:32 otto Exp $
.\" $NetBSD: ktrace.2,v 1.2 1995/02/27 12:33:58 cgd Exp $
.\"
.\" Copyright (c) 1993
@@ -30,7 +30,7 @@
.\"
.\" @(#)ktrace.2 8.1 (Berkeley) 6/4/93
.\"
-.Dd $Mdocdate: July 17 2007 $
+.Dd $Mdocdate: July 8 2011 $
.Dt KTRACE 2
.Os
.Sh NAME
@@ -93,6 +93,7 @@ generate much output).
.It Dv KTRFAC_PSIG Trace posted signals.
.It Dv KTRFAC_EMUL Trace emulation changes.
.It Dv KTRFAC_CSW Trace context switch points.
+.It Dv KTRFAC_STRUCT Trace various structs
.It Dv KTRFAC_INHERIT Inherit tracing to future children.
.El
.Pp
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index 0d3a6d1a627..7ead57404e6 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_descrip.c,v 1.86 2011/04/02 17:04:35 guenther Exp $ */
+/* $OpenBSD: kern_descrip.c,v 1.87 2011/07/08 19:28:36 otto Exp $ */
/* $NetBSD: kern_descrip.c,v 1.42 1996/03/30 22:24:38 christos Exp $ */
/*
@@ -59,6 +59,7 @@
#include <sys/syscallargs.h>
#include <sys/event.h>
#include <sys/pool.h>
+#include <sys/ktrace.h>
#include <uvm/uvm_extern.h>
@@ -632,6 +633,10 @@ sys_fstat(struct proc *p, void *v, register_t *retval)
error = copyout((caddr_t)&ub, (caddr_t)SCARG(uap, sb),
sizeof (ub));
}
+#ifdef KTRACE
+ if (error == 0 && KTRPOINT(p, KTR_STRUCT))
+ ktrstat(p, &ub);
+#endif
return (error);
}
diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c
index 4ca73fced3c..09eb8d1d842 100644
--- a/sys/kern/kern_ktrace.c
+++ b/sys/kern/kern_ktrace.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_ktrace.c,v 1.52 2011/07/07 18:11:24 art Exp $ */
+/* $OpenBSD: kern_ktrace.c,v 1.53 2011/07/08 19:28:36 otto Exp $ */
/* $NetBSD: kern_ktrace.c,v 1.23 1996/02/09 18:59:36 christos Exp $ */
/*
@@ -278,6 +278,30 @@ ktrcsw(struct proc *p, int out, int user)
p->p_traceflag &= ~KTRFAC_ACTIVE;
}
+void
+ktrstruct(struct proc *p, const char *name, const void *data, size_t datalen)
+{
+ struct ktr_header kth;
+ void *buf;
+ size_t buflen;
+
+ p->p_traceflag |= KTRFAC_ACTIVE;
+ ktrinitheader(&kth, p, KTR_STRUCT);
+
+ if (data == NULL)
+ datalen = 0;
+ buflen = strlen(name) + 1 + datalen;
+ buf = malloc(buflen, M_TEMP, M_WAITOK);
+ strlcpy(buf, name, buflen);
+ bcopy(data, buf + strlen(name) + 1, datalen);
+ kth.ktr_buf = buf;
+ kth.ktr_len = buflen;
+
+ ktrwrite(p, &kth);
+ free(buf, M_TEMP);
+ p->p_traceflag &= ~KTRFAC_ACTIVE;
+}
+
/* Interface and common routines */
/*
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index 2189694e6b6..d9f707e82f0 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uipc_syscalls.c,v 1.80 2011/07/08 05:01:27 matthew Exp $ */
+/* $OpenBSD: uipc_syscalls.c,v 1.81 2011/07/08 19:28:38 otto Exp $ */
/* $NetBSD: uipc_syscalls.c,v 1.19 1996/02/09 19:00:48 christos Exp $ */
/*
@@ -114,6 +114,10 @@ sys_bind(struct proc *p, void *v, register_t *retval)
error = sockargs(&nam, SCARG(uap, name), SCARG(uap, namelen),
MT_SONAME);
if (error == 0) {
+#ifdef KTRACE
+ if (KTRPOINT(p, KTR_STRUCT))
+ ktrsockaddr(p, mtod(nam, caddr_t), SCARG(uap, namelen));
+#endif
error = sobind(fp->f_data, nam, p);
m_freem(nam);
}
@@ -231,9 +235,14 @@ sys_accept(struct proc *p, void *v, register_t *retval)
namelen = nam->m_len;
/* SHOULD COPY OUT A CHAIN HERE */
if ((error = copyout(mtod(nam, caddr_t),
- SCARG(uap, name), namelen)) == 0)
+ SCARG(uap, name), namelen)) == 0) {
+#ifdef KTRACE
+ if (KTRPOINT(p, KTR_STRUCT))
+ ktrsockaddr(p, mtod(nam, caddr_t), namelen);
+#endif
error = copyout(&namelen, SCARG(uap, anamelen),
sizeof (*SCARG(uap, anamelen)));
+ }
}
/* if an error occurred, free the file descriptor */
if (error) {
@@ -276,6 +285,10 @@ sys_connect(struct proc *p, void *v, register_t *retval)
MT_SONAME);
if (error)
goto bad;
+#ifdef KTRACE
+ if (KTRPOINT(p, KTR_STRUCT))
+ ktrsockaddr(p, mtod(nam, caddr_t), SCARG(uap, namelen));
+#endif
error = soconnect(so, nam);
if (error)
goto bad;
@@ -481,6 +494,10 @@ sendit(struct proc *p, int s, struct msghdr *mp, int flags, register_t *retsize)
MT_SONAME);
if (error)
goto bad;
+#ifdef KTRACE
+ if (KTRPOINT(p, KTR_STRUCT))
+ ktrsockaddr(p, mtod(to, caddr_t), mp->msg_namelen);
+#endif
}
if (mp->msg_control) {
if (mp->msg_controllen < CMSG_ALIGN(sizeof(struct cmsghdr))
@@ -703,6 +720,11 @@ recvit(struct proc *p, int s, struct msghdr *mp, caddr_t namelenp,
error = copyout(mtod(from, caddr_t), mp->msg_name, alen);
if (error)
goto out;
+#ifdef KTRACE
+ if (KTRPOINT(p, KTR_STRUCT))
+ ktrsockaddr(p, mtod(from, caddr_t), alen);
+#endif
+
}
mp->msg_namelen = alen;
if (namelenp &&
@@ -917,8 +939,13 @@ sys_getsockname(struct proc *p, void *v, register_t *retval)
if (len > m->m_len)
len = m->m_len;
error = copyout(mtod(m, caddr_t), SCARG(uap, asa), len);
- if (error == 0)
+ if (error == 0) {
+#ifdef KTRACE
+ if (KTRPOINT(p, KTR_STRUCT))
+ ktrsockaddr(p, mtod(m, caddr_t), len);
+#endif
error = copyout(&len, SCARG(uap, alen), sizeof (len));
+ }
bad:
FRELE(fp);
if (m)
@@ -961,8 +988,13 @@ sys_getpeername(struct proc *p, void *v, register_t *retval)
if (len > m->m_len)
len = m->m_len;
error = copyout(mtod(m, caddr_t), SCARG(uap, asa), len);
- if (error == 0)
+ if (error == 0) {
+#ifdef KTRACE
+ if (KTRPOINT(p, KTR_STRUCT))
+ ktrsockaddr(p, mtod(m, caddr_t), len);
+#endif
error = copyout(&len, SCARG(uap, alen), sizeof (len));
+ }
bad:
FRELE(fp);
m_freem(m);
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 10b8d420d5f..4f94147b51a 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfs_syscalls.c,v 1.170 2011/07/08 04:23:24 matthew Exp $ */
+/* $OpenBSD: vfs_syscalls.c,v 1.171 2011/07/08 19:28:38 otto Exp $ */
/* $NetBSD: vfs_syscalls.c,v 1.71 1996/04/23 10:29:02 mycroft Exp $ */
/*
@@ -53,6 +53,7 @@
#include <sys/dirent.h>
#include <sys/dkio.h>
#include <sys/disklabel.h>
+#include <sys/ktrace.h>
#include <sys/syscallargs.h>
@@ -1710,6 +1711,10 @@ dofstatat(struct proc *p, int fd, const char *path, struct stat *buf,
if (suser(p, 0))
sb.st_gen = 0;
error = copyout(&sb, buf, sizeof(sb));
+#ifdef KTRACE
+ if (error == 0 && KTRPOINT(p, KTR_STRUCT))
+ ktrstat(p, &sb);
+#endif
return (error);
}
diff --git a/sys/sys/ktrace.h b/sys/sys/ktrace.h
index c3273354dc1..fb6442eca38 100644
--- a/sys/sys/ktrace.h
+++ b/sys/sys/ktrace.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ktrace.h,v 1.10 2011/06/02 16:19:12 deraadt Exp $ */
+/* $OpenBSD: ktrace.h,v 1.11 2011/07/08 19:28:38 otto Exp $ */
/* $NetBSD: ktrace.h,v 1.12 1996/02/04 02:12:29 christos Exp $ */
/*
@@ -134,6 +134,16 @@ struct ktr_csw {
#define KTR_EMUL 7
/* record contains emulation name */
+/*
+ * KTR_STRUCT - misc. structs
+ */
+#define KTR_STRUCT 8
+ /*
+ * record contains null-terminated struct name followed by
+ * struct contents
+ */
+struct sockaddr;
+struct stat;
/*
* kernel trace points (in p_traceflag)
@@ -146,6 +156,8 @@ struct ktr_csw {
#define KTRFAC_PSIG (1<<KTR_PSIG)
#define KTRFAC_CSW (1<<KTR_CSW)
#define KTRFAC_EMUL (1<<KTR_EMUL)
+#define KTRFAC_STRUCT (1<<KTR_STRUCT)
+
/*
* trace flags (also in p_traceflags)
*/
@@ -173,4 +185,11 @@ void ktrsysret(struct proc *, register_t, int, register_t);
void ktrsettracevnode(struct proc *, struct vnode *);
+void ktrstruct(struct proc *, const char *, const void *, size_t);
+#define ktrsockaddr(p, s, l) \
+ ktrstruct((p), "sockaddr", (s), (l))
+#define ktrstat(p, s) \
+ ktrstruct((p), "stat", (s), sizeof(struct stat))
+
+
#endif /* !_KERNEL */
diff --git a/usr.bin/kdump/kdump.1 b/usr.bin/kdump/kdump.1
index 2a837898b98..f8015bc780e 100644
--- a/usr.bin/kdump/kdump.1
+++ b/usr.bin/kdump/kdump.1
@@ -1,4 +1,4 @@
-.\" $OpenBSD: kdump.1,v 1.17 2007/05/31 19:20:11 jmc Exp $
+.\" $OpenBSD: kdump.1,v 1.18 2011/07/08 19:29:44 otto Exp $
.\"
.\" Copyright (c) 1990, 1993
.\" The Regents of the University of California. All rights reserved.
@@ -29,7 +29,7 @@
.\"
.\" from: @(#)kdump.1 8.1 (Berkeley) 6/6/93
.\"
-.Dd $Mdocdate: May 31 2007 $
+.Dd $Mdocdate: July 8 2011 $
.Dt KDUMP 1
.Os
.Sh NAME
@@ -96,6 +96,9 @@ Show output only for the
specified.
.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 T
Display absolute timestamps for each entry (seconds since the Epoch).
.It Fl t Op ceinsw
diff --git a/usr.bin/kdump/kdump.c b/usr.bin/kdump/kdump.c
index 2b88b181017..d332e2dc48c 100644
--- a/usr.bin/kdump/kdump.c
+++ b/usr.bin/kdump/kdump.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kdump.c,v 1.54 2011/07/07 06:39:48 otto Exp $ */
+/* $OpenBSD: kdump.c,v 1.55 2011/07/08 19:29:44 otto Exp $ */
/*-
* Copyright (c) 1988, 1993
@@ -37,6 +37,11 @@
#include <sys/ptrace.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/stat.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
#define _KERNEL
#include <sys/errno.h>
#undef _KERNEL
@@ -46,7 +51,10 @@
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
+#include <stdint.h>
#include <string.h>
+#include <grp.h>
+#include <pwd.h>
#include <unistd.h>
#include <vis.h>
@@ -55,11 +63,12 @@
#include "kdump_subr.h"
#include "extern.h"
-int timestamp, decimal, iohex, fancy = 1, tail, maxdata;
+int timestamp, decimal, iohex, fancy = 1, tail, maxdata, resolv;
char *tracefile = DEF_TRACEFILE;
struct ktr_header ktr_header;
pid_t pid = -1;
+#define TIME_FORMAT "%b %e %T %Y"
#define eqs(s1, s2) (strcmp((s1), (s2)) == 0)
#include <sys/syscall.h>
@@ -120,6 +129,7 @@ static void ktrnamei(const char *, size_t);
static void ktrpsig(struct ktr_psig *);
static void ktrsyscall(struct ktr_syscall *);
static void ktrsysret(struct ktr_sysret *);
+static void ktrstruct(char *, size_t);
static void setemul(const char *);
static void usage(void);
@@ -133,7 +143,7 @@ main(int argc, char *argv[])
current = &emulations[0]; /* native */
- while ((ch = getopt(argc, argv, "e:f:dlm:nRp:Tt:xX")) != -1)
+ while ((ch = getopt(argc, argv, "e:f:dlm:nrRp:Tt:xX")) != -1)
switch (ch) {
case 'e':
setemul(optarg);
@@ -156,6 +166,9 @@ main(int argc, char *argv[])
case 'p':
pid = atoi(optarg);
break;
+ case 'r':
+ resolv = 1;
+ break;
case 'R':
timestamp = 2; /* relative timestamp */
break;
@@ -228,6 +241,9 @@ main(int argc, char *argv[])
case KTR_EMUL:
ktremul(m, ktrlen);
break;
+ case KTR_STRUCT:
+ ktrstruct(m, ktrlen);
+ break;
}
if (tail)
(void)fflush(stdout);
@@ -276,6 +292,9 @@ dumpheader(struct ktr_header *kth)
case KTR_EMUL:
type = "EMUL";
break;
+ case KTR_STRUCT:
+ type = "STRU";
+ break;
default:
(void)snprintf(unknown, sizeof unknown, "UNKNOWN(%d)",
kth->ktr_type);
@@ -870,13 +889,218 @@ ktrcsw(struct ktr_csw *cs)
cs->user ? "user" : "kernel");
}
+
+
+void
+ktrsockaddr(struct sockaddr *sa)
+{
+/*
+ TODO: Support additional address families
+ #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;
+ if (sa_un->sun_len <= sizeof(sa_un->sun_len) +
+ sizeof(sa_un->sun_family)) {
+ printf("invalid");
+ break;
+ }
+ printf("\"%.*s\"", (int)(sa_un->sun_len -
+ sizeof(sa_un->sun_len) - sizeof(sa_un->sun_family)),
+ 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=%d, ino=%u, mode=%s, nlink=%u, ",
+ statp->st_dev, statp->st_ino, mode, statp->st_nlink);
+ if (resolv == 0 || (pwd = getpwuid(statp->st_uid)) == NULL)
+ printf("uid=%u, ", statp->st_uid);
+ else
+ printf("uid=\"%s\", ", pwd->pw_name);
+ if (resolv == 0 || (grp = getgrgid(statp->st_gid)) == NULL)
+ printf("gid=%u, ", statp->st_gid);
+ else
+ printf("gid=\"%s\", ", grp->gr_name);
+ printf("rdev=%d, ", statp->st_rdev);
+ printf("atime=");
+ if (resolv == 0)
+ printf("%jd", (intmax_t)statp->st_atim.tv_sec);
+ else {
+ tm = localtime(&statp->st_atim.tv_sec);
+ (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
+ printf("\"%s\"", timestr);
+ }
+ if (statp->st_atim.tv_nsec != 0)
+ printf(".%09ld, ", statp->st_atim.tv_nsec);
+ else
+ printf(", ");
+ printf("stime=");
+ if (resolv == 0)
+ printf("%jd", (intmax_t)statp->st_mtim.tv_sec);
+ else {
+ tm = localtime(&statp->st_mtim.tv_sec);
+ (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
+ printf("\"%s\"", timestr);
+ }
+ if (statp->st_mtim.tv_nsec != 0)
+ printf(".%09ld, ", statp->st_mtim.tv_nsec);
+ else
+ printf(", ");
+ printf("ctime=");
+ if (resolv == 0)
+ printf("%jd", (intmax_t)statp->st_ctim.tv_sec);
+ else {
+ tm = localtime(&statp->st_ctim.tv_sec);
+ (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
+ printf("\"%s\"", timestr);
+ }
+ if (statp->st_ctim.tv_nsec != 0)
+ printf(".%09ld, ", statp->st_ctim.tv_nsec);
+ else
+ printf(", ");
+ printf("size=%lld, blocks=%lld, blksize=%u, flags=0x%x, gen=0x%x",
+ statp->st_size, statp->st_blocks, statp->st_blksize,
+ statp->st_flags, statp->st_gen);
+ printf(" }\n");
+}
+
+void
+ktrstruct(char *buf, size_t buflen)
+{
+ char *name, *data;
+ size_t namelen, datalen;
+ int i;
+ struct stat sb;
+ struct sockaddr_storage ss;
+
+ 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;
+ memcpy(&sb, data, datalen);
+ ktrstat(&sb);
+ } else if (strcmp(name, "sockaddr") == 0) {
+ if (datalen > sizeof(ss))
+ goto invalid;
+ memcpy(&ss, data, datalen);
+ if ((ss.ss_family != AF_UNIX &&
+ datalen < sizeof(struct sockaddr)) || datalen != ss.ss_len)
+ goto invalid;
+ ktrsockaddr((struct sockaddr *)&ss);
+ } else {
+ printf("unknown structure\n");
+ }
+ return;
+invalid:
+ printf("invalid record\n");
+}
+
static void
usage(void)
{
extern char *__progname;
fprintf(stderr, "usage: %s "
- "[-dlnRTXx] [-e emulation] [-f file] [-m maxdata] [-p pid]\n"
+ "[-dlnRrTXx] [-e emulation] [-f file] [-m maxdata] [-p pid]\n"
"%*s[-t [ceinsw]]\n",
__progname, (int)(sizeof("usage: ") + strlen(__progname)), "");
exit(1);
diff --git a/usr.bin/kdump/kdump_subr.h b/usr.bin/kdump/kdump_subr.h
index 0d470637523..b08742ef538 100644
--- a/usr.bin/kdump/kdump_subr.h
+++ b/usr.bin/kdump/kdump_subr.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: kdump_subr.h,v 1.2 2011/07/04 06:44:52 otto Exp $ */
+/* $OpenBSD: kdump_subr.h,v 1.3 2011/07/08 19:29:44 otto Exp $ */
/*
* Copyright(c) 2006 2006 David Kirchner <dpk@dpk.net>
*
@@ -40,6 +40,7 @@ void sockoptlevelname(int);
void sockdomainname(int);
void sockipprotoname(int);
void socktypename(int);
+void sockfamilyname(int);
void thrcreateflagsname(int);
void mlockallname(int);
void shmatname(int);
diff --git a/usr.bin/kdump/mksubr b/usr.bin/kdump/mksubr
index 454a32af46b..6652aa99a81 100644
--- a/usr.bin/kdump/mksubr
+++ b/usr.bin/kdump/mksubr
@@ -1,5 +1,5 @@
#!/bin/sh
-# $OpenBSD: mksubr,v 1.4 2011/07/04 06:44:52 otto Exp $
+# $OpenBSD: mksubr,v 1.5 2011/07/08 19:29:44 otto Exp $
#
# Copyright (c) 2006 David Kirchner <dpk@dpk.net>
#
@@ -365,7 +365,7 @@ auto_switch_type "sigprocmaskhowname" "SIG_[A-Z]+[[:space:]]+[0-9]+" "sys/signal
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 "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"
diff --git a/usr.bin/ktrace/ktrace.1 b/usr.bin/ktrace/ktrace.1
index 2c7afe1538e..c5105c5a43c 100644
--- a/usr.bin/ktrace/ktrace.1
+++ b/usr.bin/ktrace/ktrace.1
@@ -1,4 +1,4 @@
-.\" $OpenBSD: ktrace.1,v 1.20 2011/06/25 18:44:43 jmc Exp $
+.\" $OpenBSD: ktrace.1,v 1.21 2011/07/08 19:29:44 otto Exp $
.\"
.\" Copyright (c) 1990, 1993
.\" The Regents of the University of California. All rights reserved.
@@ -29,7 +29,7 @@
.\"
.\" from: @(#)ktrace.1 8.1 (Berkeley) 6/6/93
.\"
-.Dd $Mdocdate: June 25 2011 $
+.Dd $Mdocdate: July 8 2011 $
.Dt KTRACE 1
.Os
.Sh NAME
@@ -108,8 +108,9 @@ The default flags are
.Cm e ,
.Cm i ,
.Cm n ,
-and
-.Cm s .
+.Cm s ,
+and
+.Cm t .
The following table equates the letters with the tracepoints:
.Pp
.Bl -tag -width flag -offset indent -compact
@@ -123,6 +124,8 @@ trace I/O
trace namei translations
.It Cm s
trace signal processing
+.It Cm t
+trace various structures
.It Cm w
trace context switch points
.It Cm +
diff --git a/usr.bin/ktrace/ktrace.h b/usr.bin/ktrace/ktrace.h
index fdf135f8c27..f0ce8b9394b 100644
--- a/usr.bin/ktrace/ktrace.h
+++ b/usr.bin/ktrace/ktrace.h
@@ -1,4 +1,4 @@
-/* * $OpenBSD: ktrace.h,v 1.3 2003/06/03 02:56:09 millert Exp $*/
+/* * $OpenBSD: ktrace.h,v 1.4 2011/07/08 19:29:44 otto Exp $*/
/*-
* Copyright (c) 1988, 1993
* The Regents of the University of California. All rights reserved.
@@ -31,7 +31,7 @@
*/
#define DEF_POINTS (KTRFAC_SYSCALL | KTRFAC_SYSRET | KTRFAC_NAMEI | \
- KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_EMUL)
+ KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_EMUL | KTRFAC_STRUCT)
#define ALL_POINTS (DEF_POINTS | KTRFAC_CSW)
diff --git a/usr.bin/ktrace/subr.c b/usr.bin/ktrace/subr.c
index 2702c4ccd76..0b44bb02498 100644
--- a/usr.bin/ktrace/subr.c
+++ b/usr.bin/ktrace/subr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: subr.c,v 1.6 2009/10/27 23:59:39 deraadt Exp $ */
+/* $OpenBSD: subr.c,v 1.7 2011/07/08 19:29:44 otto Exp $ */
/* $NetBSD: subr.c,v 1.6 1995/08/31 23:01:45 jtc Exp $ */
/*-
@@ -68,6 +68,9 @@ getpoints(s)
case 'w':
facs |= KTRFAC_CSW;
break;
+ case 't':
+ facs |= KTRFAC_STRUCT;
+ break;
case '+':
facs |= DEF_POINTS;
break;