svn commit: r195841 - in projects/libprocstat/sys: kern sys

Stanislav Sedov stas at FreeBSD.org
Fri Jul 24 14:49:00 UTC 2009


Author: stas
Date: Fri Jul 24 14:48:59 2009
New Revision: 195841
URL: http://svn.freebsd.org/changeset/base/195841

Log:
  - Add fields required for fstat to kinfo_file structure and code to initialize
    them.  It appears that the size of spare memory in the end of struct isn't
    enough so I expanded it for now.

Modified:
  projects/libprocstat/sys/kern/kern_descrip.c
  projects/libprocstat/sys/sys/user.h

Modified: projects/libprocstat/sys/kern/kern_descrip.c
==============================================================================
--- projects/libprocstat/sys/kern/kern_descrip.c	Fri Jul 24 13:50:29 2009	(r195840)
+++ projects/libprocstat/sys/kern/kern_descrip.c	Fri Jul 24 14:48:59 2009	(r195841)
@@ -59,6 +59,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/mqueue.h>
 #include <sys/mutex.h>
 #include <sys/namei.h>
+#include <sys/selinfo.h>
+#include <sys/pipe.h>
 #include <sys/priv.h>
 #include <sys/proc.h>
 #include <sys/protosw.h>
@@ -72,12 +74,17 @@ __FBSDID("$FreeBSD$");
 #include <sys/sysproto.h>
 #include <sys/tty.h>
 #include <sys/unistd.h>
+#include <sys/un.h>
+#include <sys/unpcb.h>
 #include <sys/user.h>
 #include <sys/vnode.h>
 #ifdef KTRACE
 #include <sys/ktrace.h>
 #endif
 
+#include <netinet/in.h>
+#include <netinet/in_pcb.h>
+
 #include <security/audit/audit.h>
 
 #include <vm/uma.h>
@@ -103,6 +110,10 @@ static int	fd_last_used(struct filedesc 
 static void	fdgrowtable(struct filedesc *, int);
 static void	fdunused(struct filedesc *fdp, int fd);
 static void	fdused(struct filedesc *fdp, int fd);
+static int	fill_vnode_info(struct vnode *vp, struct kinfo_file *kif);
+static int	fill_socket_info(struct socket *so, struct kinfo_file *kif);
+static int	fill_pts_info(struct tty *tp, struct kinfo_file *kif);
+static int	fill_pipe_info(struct pipe *pi, struct kinfo_file *kif);
 
 /*
  * A process is initially started out with NDFILE descriptors stored within
@@ -2882,103 +2893,69 @@ static SYSCTL_NODE(_kern_proc, KERN_PROC
 CTASSERT(sizeof(struct kinfo_file) == KINFO_FILE_SIZE);
 #endif
 
-static void
-prepare_kinfo_file(struct vnode *vp, struct kinfo_file *kif)
+static int
+export_fd_for_sysctl(void *data, int type, int fd, int fflags, int refcnt,
+    int64_t offset, struct kinfo_file *kif, struct sysctl_req *req)
 {
-	struct vattr va;
-	char *fullpath, *freepath;
-	int error, vfslocked;
+	struct {
+		int	fflag;
+		int	kf_fflag;
+	} fflags_table[] = {
+		{ FREAD, KF_FLAG_READ },
+		{ FWRITE , KF_FLAG_WRITE },
+		{ FAPPEND , KF_FLAG_APPEND },
+		{ FASYNC , KF_FLAG_ASYNC },
+		{ FFSYNC , KF_FLAG_FSYNC },
+		{ FNONBLOCK , KF_FLAG_NONBLOCK },
+		{ O_DIRECT , KF_FLAG_DIRECT },
+		{ FHASLOCK , KF_FLAG_HASLOCK }
+	};
+#define	NFFLAGS	(sizeof(fflags_table) / sizeof(*fflags_table))
+	int error;
+	int vfslocked;
+	struct vnode *vp;
+	int i;
 
-	vref(vp);
-	switch (vp->v_type) {
-	case VNON:
-		kif->kf_vnode_type = KF_VTYPE_VNON;
-		break;
-	case VREG:
-		kif->kf_vnode_type = KF_VTYPE_VREG;
-		break;
-	case VDIR:
-		kif->kf_vnode_type = KF_VTYPE_VDIR;
-		break;
-	case VBLK:
-		kif->kf_vnode_type = KF_VTYPE_VBLK;
-		break;
-	case VCHR:
-		kif->kf_vnode_type = KF_VTYPE_VCHR;
-		break;
-	case VLNK:
-		kif->kf_vnode_type = KF_VTYPE_VLNK;
+	bzero(kif, sizeof(*kif));
+	switch (type) {
+	case KF_TYPE_FIFO:
+	case KF_TYPE_VNODE:
+		vp = (struct vnode *)data;
+		error = fill_vnode_info(vp, kif);
+		vfslocked = VFS_LOCK_GIANT(vp->v_mount);
+		vrele(vp);
+		VFS_UNLOCK_GIANT(vfslocked);
 		break;
-	case VSOCK:
-		kif->kf_vnode_type = KF_VTYPE_VSOCK;
+	case KF_TYPE_SOCKET:
+		error = fill_socket_info((struct socket *)data, kif);
 		break;
-	case VFIFO:
-		kif->kf_vnode_type = KF_VTYPE_VFIFO;
+	case KF_TYPE_PIPE:
+		error = fill_pipe_info((struct pipe *)data, kif);
 		break;
-	case VBAD:
-		kif->kf_vnode_type = KF_VTYPE_VBAD;
+	case KF_TYPE_PTS:
+		error = fill_pts_info((struct tty *)data, kif);
 		break;
 	default:
-		kif->kf_vnode_type = KF_VTYPE_UNKNOWN;
-		break;
+		error = 0;
 	}
-
-	freepath = NULL;
-	fullpath = "-";
-	do {
-		error = VOP_GETATTR(vp, &va, NULL);
-		if (error)
-			break;
+	if (error == 0)
 		kif->kf_status |= KF_ATTR_VALID;
-		kif->kf_file_fsid = va.va_fsid;
-		kif->kf_file_fileid = va.va_fileid;
-		kif->kf_file_mode = MAKEIMODE(va.va_type, va.va_mode);
-		kif->kf_file_size = va.va_size;
-		kif->kf_file_rdev = va.va_rdev;
-	} while (0);
-	vn_fullpath(curthread, vp, &fullpath, &freepath);
-	vfslocked = VFS_LOCK_GIANT(vp->v_mount);
-	vrele(vp);
-	VFS_UNLOCK_GIANT(vfslocked);
-	strlcpy(kif->kf_path, fullpath, sizeof(kif->kf_path));
-	if (freepath != NULL)
-		free(freepath, M_TEMP);
-}
-
-static int
-export_vnode_for_sysctl(struct vnode *vp, int type,
-    struct kinfo_file *kif, struct filedesc *fdp, struct sysctl_req *req)
-{
-	int error;
-
-	bzero(kif, sizeof(*kif));
-
-	vref(vp);
-	kif->kf_fd = type;
-	kif->kf_type = KF_TYPE_VNODE;
-	/* This function only handles directories. */
-	if (vp->v_type != VDIR) {
-		vrele(vp);
-		return (ENOTDIR);
-	}
-	FILEDESC_SUNLOCK(fdp);
-	prepare_kinfo_file(vp, kif);
-	kif->kf_vnode_type = KF_VTYPE_VDIR;
-	vrele(vp);
 
 	/*
-	 * This is not a true file descriptor, so we set a bogus refcount
-	 * and offset to indicate these fields should be ignored.
+	 * Translate file access flags.
 	 */
-	kif->kf_ref_count = -1;
-	kif->kf_offset = -1;
-
+	for (i = 0; i < NFFLAGS; i++)
+		if (fflags & fflags_table[i].fflag)
+			kif->kf_flags |=  fflags_table[i].kf_fflag;
+	kif->kf_fd = fd;
+	kif->kf_type = type;
+	kif->kf_ref_count = refcnt;
+	kif->kf_offset = offset;
 	/* Pack record size down */
 	kif->kf_structsize = offsetof(struct kinfo_file, kf_path) +
 	    strlen(kif->kf_path) + 1;
 	kif->kf_structsize = roundup(kif->kf_structsize, sizeof(uint64_t));
 	error = SYSCTL_OUT(req, kif, kif->kf_structsize);
-	FILEDESC_SLOCK(fdp);
 	return (error);
 }
 
@@ -2991,12 +2968,14 @@ sysctl_kern_proc_filedesc(SYSCTL_HANDLER
 	struct kinfo_file *kif;
 	struct filedesc *fdp;
 	int error, i, *name;
-	struct socket *so;
-	struct vnode *vp;
 	struct file *fp;
 	struct proc *p;
-	struct tty *tp;
 	size_t oldidx;
+	void *data;
+	int type;
+	int refcnt;
+	int64_t offset;
+	int fflags;
 
 	name = (int *)arg1;
 	if ((p = pfind((pid_t)name[0])) == NULL)
@@ -3006,134 +2985,129 @@ sysctl_kern_proc_filedesc(SYSCTL_HANDLER
 		return (error);
 	}
 	fdp = fdhold(p);
+	kif = malloc(sizeof(*kif), M_TEMP, M_WAITOK);
+	/* ktrace vnode */
+	if (p->p_tracevp != NULL) {
+		vref(p->p_tracevp);
+		data = p->p_tracevp;
+		PROC_UNLOCK(p);
+		export_fd_for_sysctl(data, KF_TYPE_VNODE, KF_FD_TYPE_TRACE,
+		    FREAD | FWRITE, -1, -1, kif, req);
+		PROC_LOCK(p);
+	}
+	/* text vnode */
+	if (p->p_textvp != NULL) {
+		vref(p->p_textvp);
+		data = p->p_textvp;
+		PROC_UNLOCK(p);
+		export_fd_for_sysctl(data, KF_TYPE_VNODE, KF_FD_TYPE_TEXT,
+		    FREAD, -1, -1, kif, req);
+		PROC_LOCK(p);
+	}
 	PROC_UNLOCK(p);
 	if (fdp == NULL)
-		return (ENOENT);
-	kif = malloc(sizeof(*kif), M_TEMP, M_WAITOK);
+		goto fail;
 	FILEDESC_SLOCK(fdp);
-	if (fdp->fd_cdir != NULL)
-		export_vnode_for_sysctl(fdp->fd_cdir, KF_FD_TYPE_CWD, kif,
-				fdp, req);
-	if (fdp->fd_rdir != NULL)
-		export_vnode_for_sysctl(fdp->fd_rdir, KF_FD_TYPE_ROOT, kif,
-				fdp, req);
-	if (fdp->fd_jdir != NULL)
-		export_vnode_for_sysctl(fdp->fd_jdir, KF_FD_TYPE_JAIL, kif,
-				fdp, req);
+	/* working directory */
+	if (fdp->fd_cdir != NULL) {
+		vref(fdp->fd_cdir);
+		data = fdp->fd_cdir;
+		FILEDESC_SUNLOCK(fdp);
+		export_fd_for_sysctl(data, KF_TYPE_VNODE, KF_FD_TYPE_CWD,
+		    FREAD, -1, -1, kif, req);
+		FILEDESC_SLOCK(fdp);
+	}
+	/* root directory */
+	if (fdp->fd_rdir != NULL) {
+		vref(fdp->fd_rdir);
+		data = fdp->fd_rdir;
+		FILEDESC_SUNLOCK(fdp);
+		export_fd_for_sysctl(data, KF_TYPE_VNODE, KF_FD_TYPE_ROOT,
+		    FREAD, -1, -1, kif, req);
+		FILEDESC_SLOCK(fdp);
+	}
+	/* jail directory */
+	if (fdp->fd_jdir != NULL) {
+		vref(fdp->fd_jdir);
+		data = fdp->fd_jdir;
+		FILEDESC_SUNLOCK(fdp);
+		export_fd_for_sysctl(data, KF_TYPE_VNODE, KF_FD_TYPE_JAIL,
+		    FREAD, -1, -1, kif, req);
+		FILEDESC_SLOCK(fdp);
+	}
 	for (i = 0; i < fdp->fd_nfiles; i++) {
 		if ((fp = fdp->fd_ofiles[i]) == NULL)
 			continue;
-		bzero(kif, sizeof(*kif));
-		vp = NULL;
-		so = NULL;
-		tp = NULL;
-		kif->kf_fd = i;
+		data = NULL;
 		switch (fp->f_type) {
 		case DTYPE_VNODE:
-			kif->kf_type = KF_TYPE_VNODE;
-			vp = fp->f_vnode;
+			type = KF_TYPE_VNODE;
+			vref(fp->f_vnode);
+			data = fp->f_vnode;
 			break;
 
 		case DTYPE_SOCKET:
-			kif->kf_type = KF_TYPE_SOCKET;
-			so = fp->f_data;
+			type = KF_TYPE_SOCKET;
+			data = fp->f_data;
 			break;
 
 		case DTYPE_PIPE:
-			kif->kf_type = KF_TYPE_PIPE;
+			type = KF_TYPE_PIPE;
+			data = fp->f_data;
 			break;
 
 		case DTYPE_FIFO:
-			kif->kf_type = KF_TYPE_FIFO;
-			vp = fp->f_vnode;
+			type = KF_TYPE_FIFO;
+			vref(fp->f_vnode);
+			data = fp->f_vnode;
 			break;
 
 		case DTYPE_KQUEUE:
-			kif->kf_type = KF_TYPE_KQUEUE;
+			type = KF_TYPE_KQUEUE;
 			break;
 
 		case DTYPE_CRYPTO:
-			kif->kf_type = KF_TYPE_CRYPTO;
+			type = KF_TYPE_CRYPTO;
 			break;
 
 		case DTYPE_MQUEUE:
-			kif->kf_type = KF_TYPE_MQUEUE;
+			type = KF_TYPE_MQUEUE;
 			break;
 
 		case DTYPE_SHM:
-			kif->kf_type = KF_TYPE_SHM;
+			type = KF_TYPE_SHM;
 			break;
 
 		case DTYPE_SEM:
-			kif->kf_type = KF_TYPE_SEM;
+			type = KF_TYPE_SEM;
 			break;
 
 		case DTYPE_PTS:
-			kif->kf_type = KF_TYPE_PTS;
-			tp = fp->f_data;
+			type = KF_TYPE_PTS;
+			data = fp->f_data;
 			break;
 
 		default:
-			kif->kf_type = KF_TYPE_UNKNOWN;
+			type = KF_TYPE_UNKNOWN;
 			break;
 		}
-		kif->kf_ref_count = fp->f_count;
-		if (fp->f_flag & FREAD)
-			kif->kf_flags |= KF_FLAG_READ;
-		if (fp->f_flag & FWRITE)
-			kif->kf_flags |= KF_FLAG_WRITE;
-		if (fp->f_flag & FAPPEND)
-			kif->kf_flags |= KF_FLAG_APPEND;
-		if (fp->f_flag & FASYNC)
-			kif->kf_flags |= KF_FLAG_ASYNC;
-		if (fp->f_flag & FFSYNC)
-			kif->kf_flags |= KF_FLAG_FSYNC;
-		if (fp->f_flag & FNONBLOCK)
-			kif->kf_flags |= KF_FLAG_NONBLOCK;
-		if (fp->f_flag & O_DIRECT)
-			kif->kf_flags |= KF_FLAG_DIRECT;
-		if (fp->f_flag & FHASLOCK)
-			kif->kf_flags |= KF_FLAG_HASLOCK;
-		kif->kf_offset = fp->f_offset;
-		if (vp != NULL) {
-			/*
-			 * It is OK to drop the filedesc lock here as we will
-			 * re-validate and re-evaluate its properties when
-			 * the loop continues.
-			 */
-			FILEDESC_SUNLOCK(fdp);
-			prepare_kinfo_file(vp, kif);
-			FILEDESC_SLOCK(fdp);
-		}
-		if (so != NULL) {
-			struct sockaddr *sa;
+		refcnt = fp->f_count;
+		fflags = fp->f_flag;
+		offset = fp->f_offset;
 
-			if (so->so_proto->pr_usrreqs->pru_sockaddr(so, &sa)
-			    == 0 && sa->sa_len <= sizeof(kif->kf_sa_local)) {
-				bcopy(sa, &kif->kf_sa_local, sa->sa_len);
-				free(sa, M_SONAME);
-			}
-			if (so->so_proto->pr_usrreqs->pru_peeraddr(so, &sa)
-			    == 00 && sa->sa_len <= sizeof(kif->kf_sa_peer)) {
-				bcopy(sa, &kif->kf_sa_peer, sa->sa_len);
-				free(sa, M_SONAME);
-			}
-			kif->kf_sock_domain =
-			    so->so_proto->pr_domain->dom_family;
-			kif->kf_sock_type = so->so_type;
-			kif->kf_sock_protocol = so->so_proto->pr_protocol;
-		}
-		if (tp != NULL) {
-			strlcpy(kif->kf_path, tty_devname(tp),
-			    sizeof(kif->kf_path));
-		}
-		/* Pack record size down */
-		kif->kf_structsize = offsetof(struct kinfo_file, kf_path) +
-		    strlen(kif->kf_path) + 1;
-		kif->kf_structsize = roundup(kif->kf_structsize,
-		    sizeof(uint64_t));
+		/*
+		 * Create sysctl entry.
+		 * It is OK to drop the filedesc lock here as we will
+		 * re-validate and re-evaluate its properties when
+		 * the loop continues.
+		 */
 		oldidx = req->oldidx;
-		error = SYSCTL_OUT(req, kif, kif->kf_structsize);
+		if (type == KF_TYPE_VNODE || type == KF_TYPE_FIFO)
+			FILEDESC_SUNLOCK(fdp);
+		error = export_fd_for_sysctl(data, type, i,
+		    fflags, refcnt, offset, kif, req);
+		if (type == KF_TYPE_VNODE || type == KF_TYPE_FIFO)
+			FILEDESC_SLOCK(fdp);
 		if (error) {
 			if (error == ENOMEM) {
 				/*
@@ -3149,11 +3123,148 @@ sysctl_kern_proc_filedesc(SYSCTL_HANDLER
 		}
 	}
 	FILEDESC_SUNLOCK(fdp);
+fail:
 	fddrop(fdp);
 	free(kif, M_TEMP);
 	return (error);
 }
 
+static int
+fill_vnode_info(struct vnode *vp, struct kinfo_file *kif)
+{
+	struct {
+		int	vtype;
+		int	kf_vtype;
+	} vtypes_table[] = {
+		{ VNON,  },
+		{ VREG,  },
+		{ VDIR,  },
+		{ VBLK,  },
+		{ VCHR,  },
+		{ VLNK,  },
+		{ VSOCK,  },
+		{ VFIFO, },
+		{ VBAD,  },
+	};
+	char *fullpath, *freepath;
+	struct vattr va;
+#define	NVTYPES	(sizeof(vtypes_table) / sizeof(*vtypes_table))
+	unsigned int i;
+	int error;
+
+	if (vp == NULL)
+		return (1);
+
+	/*
+	 * Perform vtype translation.
+	 */
+	for (i = 0; i < NVTYPES; i++)
+		if (vtypes_table[i].vtype == vp->v_type)
+			break;
+
+	if (i < NVTYPES)
+		kif->kf_vnode_type = vtypes_table[i].kf_vtype;
+	else
+		kif->kf_vnode_type = KF_VTYPE_UNKNOWN;
+
+	freepath = NULL;
+	fullpath = "-";
+	error = vn_fullpath(curthread, vp, &fullpath, &freepath);
+	if (error != 0)
+		return (error);
+	strlcpy(kif->kf_path, fullpath, sizeof(kif->kf_path));
+	free(freepath, M_TEMP);
+
+	/*
+	 * Retrieve vnode attributes.
+	 */
+	error = VOP_GETATTR(vp, &va, NULL);
+	if (error != 0)
+		return (error);
+	kif->kf_file_fsid = va.va_fsid;
+	kif->kf_file_fileid = va.va_fileid;
+	kif->kf_file_mode = MAKEIMODE(va.va_type, va.va_mode);
+	kif->kf_file_size = va.va_size;
+	kif->kf_file_rdev = va.va_rdev;
+	return (0);
+}
+
+static int
+fill_socket_info(struct socket *so, struct kinfo_file *kif)
+{
+	struct sockaddr *sa;
+	struct inpcb *inpcb;
+	struct unpcb *unpcb;
+	int error;
+
+	if (so == NULL)
+		return (1);
+
+	kif->kf_sock_domain = so->so_proto->pr_domain->dom_family;
+	kif->kf_sock_type = so->so_type;
+	kif->kf_sock_protocol = so->so_proto->pr_protocol;
+	kif->kf_sock_pcb = (uint64_t)so->so_pcb;
+	switch(kif->kf_sock_domain) {
+	case AF_INET:
+	case AF_INET6:
+		if (kif->kf_sock_protocol == IPPROTO_TCP) {
+			if (so->so_pcb != NULL) {
+				inpcb = (struct inpcb *)(so->so_pcb);
+				kif->kf_sock_inpcb = (uint64_t)inpcb->inp_ppcb;
+			}
+		}
+		break;
+	case AF_UNIX:
+		if (so->so_pcb != NULL) {
+			unpcb = (struct unpcb *)(so->so_pcb);
+			if (unpcb->unp_conn) {
+				kif->kf_sock_unpconn =
+				    (uint64_t)unpcb->unp_conn;
+				kif->kf_sock_rcv_sb_state =
+				    so->so_rcv.sb_state;
+				kif->kf_sock_snd_sb_state =
+				    so->so_snd.sb_state;
+			}
+		}
+		break;
+	}
+	error = so->so_proto->pr_usrreqs->pru_sockaddr(so, &sa);
+	if (error == 0 && sa->sa_len <= sizeof(kif->kf_sa_local)) {
+		bcopy(sa, &kif->kf_sa_local, sa->sa_len);
+		free(sa, M_SONAME);
+	}
+	error = so->so_proto->pr_usrreqs->pru_peeraddr(so, &sa);
+	if (error == 0 && sa->sa_len <= sizeof(kif->kf_sa_peer)) {
+		bcopy(sa, &kif->kf_sa_peer, sa->sa_len);
+		free(sa, M_SONAME);
+	}
+	strncpy(kif->kf_sock_domname, so->so_proto->pr_domain->dom_name,
+	    sizeof(kif->kf_sock_domname));
+	return (0);
+}
+
+static int
+fill_pts_info(struct tty *tp, struct kinfo_file *kif)
+{
+
+	if (tp == NULL)
+		return (1);
+	strlcpy(kif->kf_path, tty_devname(tp), sizeof(kif->kf_path));
+	return (0);
+}
+
+static int
+fill_pipe_info(struct pipe *pi, struct kinfo_file *kif)
+{
+
+	if (pi == NULL)
+		return (1);
+	kif->pipe_addr = (uint64_t)pi;
+	kif->pipe_peer = (uint64_t)pi->pipe_peer;
+	kif->pipe_buffer_cnt = pi->pipe_buffer.cnt;
+	return (0);
+}
+
 static SYSCTL_NODE(_kern_proc, KERN_PROC_FILEDESC, filedesc, CTLFLAG_RD,
     sysctl_kern_proc_filedesc, "Process filedesc entries");
 

Modified: projects/libprocstat/sys/sys/user.h
==============================================================================
--- projects/libprocstat/sys/sys/user.h	Fri Jul 24 13:50:29 2009	(r195840)
+++ projects/libprocstat/sys/sys/user.h	Fri Jul 24 14:48:59 2009	(r195841)
@@ -270,6 +270,8 @@ struct user {
 #define	KF_FD_TYPE_CWD	-1	/* Current working directory */
 #define	KF_FD_TYPE_ROOT	-2	/* Root directory */
 #define	KF_FD_TYPE_JAIL	-3	/* Jail directory */
+#define	KF_FD_TYPE_TRACE	-4	/* ptrace vnode */
+#define	KF_FD_TYPE_TEXT	-5	/* Text vnode */
 
 #define	KF_FLAG_READ		0x00000001
 #define	KF_FLAG_WRITE		0x00000002
@@ -309,7 +311,7 @@ struct kinfo_ofile {
 };
 
 #if defined(__amd64__) || defined(__i386__)
-#define	KINFO_FILE_SIZE	1392
+#define	KINFO_FILE_SIZE	1496
 #endif
 
 struct kinfo_file {
@@ -318,21 +320,29 @@ struct kinfo_file {
 	int		kf_fd;			/* Array index. */
 	int		kf_ref_count;		/* Reference count. */
 	int		kf_flags;		/* Flags. */
-	int		_kf_pad0;		/* Round to 64 bit alignment */
-	int64_t		kf_offset;		/* Seek location. */
 	int		kf_vnode_type;		/* Vnode type. */
+	int64_t		kf_offset;		/* Seek location. */
+	char		kf_sock_domname[32];	/* Address domain name. */
 	int		kf_sock_domain;		/* Socket domain. */
-	int		kf_sock_type;		/* Socket type. */
 	int		kf_sock_protocol;	/* Socket protocol. */
+	int		kf_sock_type;		/* Socket type. */
+	uint16_t	kf_sock_snd_sb_state;	/* Send buffer state. */
+	uint16_t	kf_sock_rcv_sb_state;	/* Receive buffer state. */
+	uint64_t	kf_sock_pcb;		/* Address of so_pcb. */
+	uint64_t	kf_sock_inpcb;		/* Address of inp_ppcb. */
+	uint64_t	kf_sock_unpconn;	/* Address of unp_conn. */
 	struct sockaddr_storage kf_sa_local;	/* Socket address. */
 	struct sockaddr_storage	kf_sa_peer;	/* Peer address. */
 	dev_t		kf_file_fsid;		/* Vnode filesystem id. */
+	dev_t		kf_file_rdev;		/* File device. */
 	uint64_t 	kf_file_fileid;		/* Global file id. */
+	off_t		kf_file_size;		/* File size. */
 	mode_t		kf_file_mode;		/* File mode. */
 	uint16_t	kf_status;		/* Status flags. */
-	off_t		kf_file_size;		/* File size. */
-	dev_t		kf_file_rdev;		/* File device. */
-	int		_kf_ispare[9];		/* Space for more stuff. */
+	uint32_t	pipe_buffer_cnt;
+	uint64_t	pipe_addr;
+	uint64_t	pipe_peer;
+	int		_kf_ispare[16];		/* Space for more stuff. */
 	/* Truncated before copyout in sysctl */
 	char		kf_path[PATH_MAX];	/* Path to file, if any. */
 };


More information about the svn-src-projects mailing list