Module Name:    src
Committed By:   rtr
Date:           Sun Jul  6 03:33:33 UTC 2014

Modified Files:
        src/sys/kern: sys_socket.c uipc_usrreq.c
        src/sys/net: raw_usrreq.c rtsock.c
        src/sys/netatalk: ddp_usrreq.c
        src/sys/netbt: hci_socket.c l2cap_socket.c rfcomm_socket.c sco_socket.c
        src/sys/netinet: raw_ip.c tcp_usrreq.c udp_usrreq.c
        src/sys/netinet6: raw_ip6.c udp6_usrreq.c
        src/sys/netipsec: keysock.c
        src/sys/netnatm: natm.c
        src/sys/sys: protosw.h

Log Message:
* split PRU_SENSE functionality out of xxx_usrreq() switches and place into
  separate xxx_stat(struct socket *, struct stat *) functions.
* replace calls using pr_generic with req == PRU_SENSE with pr_stat().

further change will follow that cleans up the pattern used to extract the
pcb and test for its presence.

reviewed by rmind


To generate a diff of this commit:
cvs rdiff -u -r1.71 -r1.72 src/sys/kern/sys_socket.c
cvs rdiff -u -r1.155 -r1.156 src/sys/kern/uipc_usrreq.c
cvs rdiff -u -r1.40 -r1.41 src/sys/net/raw_usrreq.c
cvs rdiff -u -r1.149 -r1.150 src/sys/net/rtsock.c
cvs rdiff -u -r1.47 -r1.48 src/sys/netatalk/ddp_usrreq.c
cvs rdiff -u -r1.26 -r1.27 src/sys/netbt/hci_socket.c
cvs rdiff -u -r1.17 -r1.18 src/sys/netbt/l2cap_socket.c
cvs rdiff -u -r1.18 -r1.19 src/sys/netbt/rfcomm_socket.c
cvs rdiff -u -r1.19 -r1.20 src/sys/netbt/sco_socket.c
cvs rdiff -u -r1.127 -r1.128 src/sys/netinet/raw_ip.c
cvs rdiff -u -r1.180 -r1.181 src/sys/netinet/tcp_usrreq.c
cvs rdiff -u -r1.202 -r1.203 src/sys/netinet/udp_usrreq.c
cvs rdiff -u -r1.121 -r1.122 src/sys/netinet6/raw_ip6.c
cvs rdiff -u -r1.101 -r1.102 src/sys/netinet6/udp6_usrreq.c
cvs rdiff -u -r1.29 -r1.30 src/sys/netipsec/keysock.c
cvs rdiff -u -r1.29 -r1.30 src/sys/netnatm/natm.c
cvs rdiff -u -r1.49 -r1.50 src/sys/sys/protosw.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/sys_socket.c
diff -u src/sys/kern/sys_socket.c:1.71 src/sys/kern/sys_socket.c:1.72
--- src/sys/kern/sys_socket.c:1.71	Tue Jul  1 05:49:18 2014
+++ src/sys/kern/sys_socket.c	Sun Jul  6 03:33:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys_socket.c,v 1.71 2014/07/01 05:49:18 rtr Exp $	*/
+/*	$NetBSD: sys_socket.c,v 1.72 2014/07/06 03:33:33 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_socket.c,v 1.71 2014/07/01 05:49:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_socket.c,v 1.72 2014/07/06 03:33:33 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -239,8 +239,7 @@ soo_stat(file_t *fp, struct stat *ub)
 	ub->st_mode = S_IFSOCK;
 
 	solock(so);
-	error = (*so->so_proto->pr_usrreqs->pr_generic)(so, PRU_SENSE,
-	    (struct mbuf *)ub, NULL, NULL, curlwp);
+	error = (*so->so_proto->pr_usrreqs->pr_stat)(so, ub);
 	sounlock(so);
 
 	return error;

Index: src/sys/kern/uipc_usrreq.c
diff -u src/sys/kern/uipc_usrreq.c:1.155 src/sys/kern/uipc_usrreq.c:1.156
--- src/sys/kern/uipc_usrreq.c:1.155	Tue Jul  1 05:49:18 2014
+++ src/sys/kern/uipc_usrreq.c	Sun Jul  6 03:33:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_usrreq.c,v 1.155 2014/07/01 05:49:18 rtr Exp $	*/
+/*	$NetBSD: uipc_usrreq.c,v 1.156 2014/07/06 03:33:33 rtr Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2000, 2004, 2008, 2009 The NetBSD Foundation, Inc.
@@ -96,7 +96,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.155 2014/07/01 05:49:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.156 2014/07/06 03:33:33 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -377,6 +377,7 @@ unp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_CONTROL);
+	KASSERT(req != PRU_SENSE);
 
 	KASSERT(solocked(so));
 	unp = sotounpcb(so);
@@ -627,30 +628,6 @@ unp_usrreq(struct socket *so, int req, s
 		unp_detach(so);
 		break;
 
-	case PRU_SENSE:
-		((struct stat *) m)->st_blksize = so->so_snd.sb_hiwat;
-		switch (so->so_type) {
-		case SOCK_SEQPACKET: /* FALLTHROUGH */
-		case SOCK_STREAM:
-			if (unp->unp_conn == 0) 
-				break;
-
-			so2 = unp->unp_conn->unp_socket;
-			KASSERT(solocked2(so, so2));
-			((struct stat *) m)->st_blksize += so2->so_rcv.sb_cc;
-			break;
-		default:
-			break;
-		}
-		((struct stat *) m)->st_dev = NODEV;
-		if (unp->unp_ino == 0)
-			unp->unp_ino = unp_ino++;
-		((struct stat *) m)->st_atimespec =
-		    ((struct stat *) m)->st_mtimespec =
-		    ((struct stat *) m)->st_ctimespec = unp->unp_ctime;
-		((struct stat *) m)->st_ino = unp->unp_ino;
-		return (0);
-
 	case PRU_RCVOOB:
 		error = EOPNOTSUPP;
 		break;
@@ -871,6 +848,38 @@ unp_ioctl(struct socket *so, u_long cmd,
 	return EOPNOTSUPP;
 }
 
+static int
+unp_stat(struct socket *so, struct stat *ub)
+{
+	struct unpcb *unp;
+	struct socket *so2;
+
+	unp = sotounpcb(so);
+	if (unp == NULL)
+		return EINVAL;
+
+	ub->st_blksize = so->so_snd.sb_hiwat;
+	switch (so->so_type) {
+	case SOCK_SEQPACKET: /* FALLTHROUGH */
+	case SOCK_STREAM:
+		if (unp->unp_conn == 0) 
+			break;
+
+		so2 = unp->unp_conn->unp_socket;
+		KASSERT(solocked2(so, so2));
+		ub->st_blksize += so2->so_rcv.sb_cc;
+		break;
+	default:
+		break;
+	}
+	ub->st_dev = NODEV;
+	if (unp->unp_ino == 0)
+		unp->unp_ino = unp_ino++;
+	ub->st_atimespec = ub->st_mtimespec = ub->st_ctimespec = unp->unp_ctime;
+	ub->st_ino = unp->unp_ino;
+	return (0);
+}
+
 /*
  * Allocate the new sockaddr.  We have to allocate one
  * extra byte so that we can ensure that the pathname
@@ -1817,5 +1826,6 @@ const struct pr_usrreqs unp_usrreqs = {
 	.pr_attach	= unp_attach,
 	.pr_detach	= unp_detach,
 	.pr_ioctl	= unp_ioctl,
+	.pr_stat	= unp_stat,
 	.pr_generic	= unp_usrreq,
 };

Index: src/sys/net/raw_usrreq.c
diff -u src/sys/net/raw_usrreq.c:1.40 src/sys/net/raw_usrreq.c:1.41
--- src/sys/net/raw_usrreq.c:1.40	Sun Jun 22 08:10:18 2014
+++ src/sys/net/raw_usrreq.c	Sun Jul  6 03:33:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_usrreq.c,v 1.40 2014/06/22 08:10:18 rtr Exp $	*/
+/*	$NetBSD: raw_usrreq.c,v 1.41 2014/07/06 03:33:33 rtr Exp $	*/
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.40 2014/06/22 08:10:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.41 2014/07/06 03:33:33 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/mbuf.h>
@@ -163,6 +163,7 @@ raw_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_CONTROL);
+	KASSERT(req != PRU_SENSE);
 
 	s = splsoftnet();
 	KERNEL_LOCK(1, NULL);
@@ -237,13 +238,6 @@ raw_usrreq(struct socket *so, int req, s
 			raw_disconnect(rp);
 		break;
 
-	case PRU_SENSE:
-		/*
-		 * stat: don't bother with a blocksize.
-		 */
-		error = 0;
-		break;
-
 	/*
 	 * Not supported.
 	 */

Index: src/sys/net/rtsock.c
diff -u src/sys/net/rtsock.c:1.149 src/sys/net/rtsock.c:1.150
--- src/sys/net/rtsock.c:1.149	Tue Jul  1 05:49:18 2014
+++ src/sys/net/rtsock.c	Sun Jul  6 03:33:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtsock.c,v 1.149 2014/07/01 05:49:18 rtr Exp $	*/
+/*	$NetBSD: rtsock.c,v 1.150 2014/07/06 03:33:33 rtr Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.149 2014/07/01 05:49:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.150 2014/07/06 03:33:33 rtr Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -231,6 +231,12 @@ COMPATNAME(route_ioctl)(struct socket *s
 }
 
 static int
+COMPATNAME(route_stat)(struct socket *so, struct stat *ub)
+{
+	return 0;
+}
+
+static int
 COMPATNAME(route_usrreq)(struct socket *so, int req, struct mbuf *m,
     struct mbuf *nam, struct mbuf *control, struct lwp *l)
 {
@@ -239,6 +245,7 @@ COMPATNAME(route_usrreq)(struct socket *
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_CONTROL);
+	KASSERT(req != PRU_SENSE);
 
 	s = splsoftnet();
 	error = raw_usrreq(so, req, m, nam, control, l);
@@ -1336,6 +1343,7 @@ static const struct pr_usrreqs route_usr
 	.pr_attach	= COMPATNAME(route_attach_wrapper),
 	.pr_detach	= COMPATNAME(route_detach_wrapper),
 	.pr_ioctl	= COMPATNAME(route_ioctl_wrapper),
+	.pr_stat	= COMPATNAME(route_stat_wrapper),
 	.pr_generic	= COMPATNAME(route_usrreq_wrapper),
 };
 

Index: src/sys/netatalk/ddp_usrreq.c
diff -u src/sys/netatalk/ddp_usrreq.c:1.47 src/sys/netatalk/ddp_usrreq.c:1.48
--- src/sys/netatalk/ddp_usrreq.c:1.47	Tue Jul  1 05:49:18 2014
+++ src/sys/netatalk/ddp_usrreq.c	Sun Jul  6 03:33:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ddp_usrreq.c,v 1.47 2014/07/01 05:49:18 rtr Exp $	 */
+/*	$NetBSD: ddp_usrreq.c,v 1.48 2014/07/06 03:33:33 rtr Exp $	 */
 
 /*
  * Copyright (c) 1990,1991 Regents of The University of Michigan.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.47 2014/07/01 05:49:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.48 2014/07/06 03:33:33 rtr Exp $");
 
 #include "opt_mbuftrace.h"
 
@@ -85,6 +85,7 @@ ddp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_CONTROL);
+	KASSERT(req != PRU_SENSE);
 
 	ddp = sotoddpcb(so);
 
@@ -187,13 +188,6 @@ ddp_usrreq(struct socket *so, int req, s
 		 */
 		return (EOPNOTSUPP);
 
-	case PRU_SENSE:
-		/*
-		 * 1. Don't return block size.
-		 * 2. Don't mfree.
-		 */
-		return (0);
-
 	default:
 		error = EOPNOTSUPP;
 	}
@@ -484,6 +478,19 @@ ddp_ioctl(struct socket *so, u_long cmd,
 	return at_control(cmd, addr, ifp);
 }
 
+static int
+ddp_stat(struct socket *so, struct stat *ub)
+{
+	struct ddpcb   *ddp;
+
+	ddp = sotoddpcb(so);
+	if (ddp == NULL)
+		return EINVAL;
+
+	/* Don't return block size. */
+	return 0;
+}
+
 /*
  * For the moment, this just find the pcb with the correct local address.
  * In the future, this will actually do some real searching, so we can use
@@ -558,12 +565,14 @@ PR_WRAP_USRREQS(ddp)
 #define	ddp_attach	ddp_attach_wrapper
 #define	ddp_detach	ddp_detach_wrapper
 #define	ddp_ioctl	ddp_ioctl_wrapper
+#define	ddp_stat	ddp_stat_wrapper
 #define	ddp_usrreq	ddp_usrreq_wrapper
 
 const struct pr_usrreqs ddp_usrreqs = {
 	.pr_attach	= ddp_attach,
 	.pr_detach	= ddp_detach,
 	.pr_ioctl	= ddp_ioctl,
+	.pr_stat	= ddp_stat,
 	.pr_generic	= ddp_usrreq,
 };
 

Index: src/sys/netbt/hci_socket.c
diff -u src/sys/netbt/hci_socket.c:1.26 src/sys/netbt/hci_socket.c:1.27
--- src/sys/netbt/hci_socket.c:1.26	Tue Jul  1 05:49:18 2014
+++ src/sys/netbt/hci_socket.c	Sun Jul  6 03:33:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: hci_socket.c,v 1.26 2014/07/01 05:49:18 rtr Exp $	*/
+/*	$NetBSD: hci_socket.c,v 1.27 2014/07/06 03:33:33 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.26 2014/07/01 05:49:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.27 2014/07/06 03:33:33 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -493,6 +493,17 @@ hci_ioctl(struct socket *up, u_long cmd,
 	return err;
 }
 
+static int
+hci_stat(struct socket *so, struct stat *ub)
+{
+	struct hci_pcb *pcb = (struct hci_pcb *)so->so_pcb;
+
+	if (pcb == NULL)
+		return EINVAL;
+
+	return 0;
+}
+
 /*
  * User Request.
  * up is socket
@@ -515,6 +526,7 @@ hci_usrreq(struct socket *up, int req, s
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_CONTROL);
+	KASSERT(req != PRU_SENSE);
 
 	switch(req) {
 	case PRU_PURGEIF:
@@ -628,9 +640,6 @@ hci_usrreq(struct socket *up, int req, s
 
 		return hci_send(pcb, m, (sa ? &sa->bt_bdaddr : &pcb->hp_raddr));
 
-	case PRU_SENSE:
-		return 0;		/* (no sense - Doh!) */
-
 	case PRU_RCVD:
 	case PRU_RCVOOB:
 		return EOPNOTSUPP;	/* (no release) */
@@ -869,11 +878,13 @@ PR_WRAP_USRREQS(hci)
 #define	hci_attach		hci_attach_wrapper
 #define	hci_detach		hci_detach_wrapper
 #define	hci_ioctl		hci_ioctl_wrapper
+#define	hci_stat		hci_stat_wrapper
 #define	hci_usrreq		hci_usrreq_wrapper
 
 const struct pr_usrreqs hci_usrreqs = {
 	.pr_attach	= hci_attach,
 	.pr_detach	= hci_detach,
 	.pr_ioctl	= hci_ioctl,
+	.pr_stat	= hci_stat,
 	.pr_generic	= hci_usrreq,
 };

Index: src/sys/netbt/l2cap_socket.c
diff -u src/sys/netbt/l2cap_socket.c:1.17 src/sys/netbt/l2cap_socket.c:1.18
--- src/sys/netbt/l2cap_socket.c:1.17	Tue Jul  1 05:49:18 2014
+++ src/sys/netbt/l2cap_socket.c	Sun Jul  6 03:33:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: l2cap_socket.c,v 1.17 2014/07/01 05:49:18 rtr Exp $	*/
+/*	$NetBSD: l2cap_socket.c,v 1.18 2014/07/06 03:33:33 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.17 2014/07/01 05:49:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.18 2014/07/06 03:33:33 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -122,6 +122,17 @@ l2cap_ioctl(struct socket *up, u_long cm
 	return EPASSTHROUGH;
 }
 
+static int
+l2cap_stat(struct socket *so, struct stat *ub)
+{
+	struct l2cap_channel *pcb = so->so_pcb;
+
+	if (pcb == NULL)
+		return EINVAL;
+
+	return 0;
+}
+
 /*
  * User Request.
  * up is socket
@@ -150,6 +161,7 @@ l2cap_usrreq(struct socket *up, int req,
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_CONTROL);
+	KASSERT(req != PRU_SENSE);
 
 	switch (req) {
 	case PRU_PURGEIF:
@@ -235,9 +247,6 @@ l2cap_usrreq(struct socket *up, int req,
 		sbappendrecord(&up->so_snd, m);
 		return l2cap_send(pcb, m0);
 
-	case PRU_SENSE:
-		return 0;		/* (no release) */
-
 	case PRU_RCVD:
 	case PRU_RCVOOB:
 		return EOPNOTSUPP;	/* (no release) */
@@ -417,11 +426,13 @@ PR_WRAP_USRREQS(l2cap)
 #define	l2cap_attach		l2cap_attach_wrapper
 #define	l2cap_detach		l2cap_detach_wrapper
 #define	l2cap_ioctl		l2cap_ioctl_wrapper
+#define	l2cap_stat		l2cap_stat_wrapper
 #define	l2cap_usrreq		l2cap_usrreq_wrapper
 
 const struct pr_usrreqs l2cap_usrreqs = {
 	.pr_attach	= l2cap_attach,
 	.pr_detach	= l2cap_detach,
 	.pr_ioctl	= l2cap_ioctl,
+	.pr_stat	= l2cap_stat,
 	.pr_generic	= l2cap_usrreq,
 };

Index: src/sys/netbt/rfcomm_socket.c
diff -u src/sys/netbt/rfcomm_socket.c:1.18 src/sys/netbt/rfcomm_socket.c:1.19
--- src/sys/netbt/rfcomm_socket.c:1.18	Tue Jul  1 05:49:18 2014
+++ src/sys/netbt/rfcomm_socket.c	Sun Jul  6 03:33:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rfcomm_socket.c,v 1.18 2014/07/01 05:49:18 rtr Exp $	*/
+/*	$NetBSD: rfcomm_socket.c,v 1.19 2014/07/06 03:33:33 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.18 2014/07/01 05:49:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.19 2014/07/06 03:33:33 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -130,6 +130,17 @@ rfcomm_ioctl(struct socket *up, u_long c
 	return EPASSTHROUGH;
 }
 
+static int
+rfcomm_stat(struct socket *so, struct stat *ub)
+{
+	struct rfcomm_dlc *pcb = so->so_pcb;
+
+	if (pcb == NULL)
+		return EINVAL;
+
+	return 0;
+}
+
 /*
  * User Request.
  * up is socket
@@ -158,6 +169,7 @@ rfcomm_usrreq(struct socket *up, int req
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_CONTROL);
+	KASSERT(req != PRU_SENSE);
 
 	switch (req) {
 	case PRU_PURGEIF:
@@ -234,9 +246,6 @@ rfcomm_usrreq(struct socket *up, int req
 
 		return rfcomm_send(pcb, m0);
 
-	case PRU_SENSE:
-		return 0;		/* (no release) */
-
 	case PRU_RCVD:
 		return rfcomm_rcvd(pcb, sbspace(&up->so_rcv));
 
@@ -430,11 +439,13 @@ PR_WRAP_USRREQS(rfcomm)
 #define	rfcomm_attach		rfcomm_attach_wrapper
 #define	rfcomm_detach		rfcomm_detach_wrapper
 #define	rfcomm_ioctl		rfcomm_ioctl_wrapper
+#define	rfcomm_stat		rfcomm_stat_wrapper
 #define	rfcomm_usrreq		rfcomm_usrreq_wrapper
 
 const struct pr_usrreqs rfcomm_usrreqs = {
 	.pr_attach	= rfcomm_attach,
 	.pr_detach	= rfcomm_detach,
 	.pr_ioctl	= rfcomm_ioctl,
+	.pr_stat	= rfcomm_stat,
 	.pr_generic	= rfcomm_usrreq,
 };

Index: src/sys/netbt/sco_socket.c
diff -u src/sys/netbt/sco_socket.c:1.19 src/sys/netbt/sco_socket.c:1.20
--- src/sys/netbt/sco_socket.c:1.19	Tue Jul  1 05:49:18 2014
+++ src/sys/netbt/sco_socket.c	Sun Jul  6 03:33:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sco_socket.c,v 1.19 2014/07/01 05:49:18 rtr Exp $	*/
+/*	$NetBSD: sco_socket.c,v 1.20 2014/07/06 03:33:33 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.19 2014/07/01 05:49:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.20 2014/07/06 03:33:33 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -113,6 +113,17 @@ sco_ioctl(struct socket *up, u_long cmd,
 	return EOPNOTSUPP;
 }
 
+static int
+sco_stat(struct socket *so, struct stat *ub)
+{
+	struct sco_pcb *pcb = (struct sco_pcb *)so->so_pcb;
+
+	if (pcb == NULL)
+		return EINVAL;
+
+	return 0;
+}
+
 /*
  * User Request.
  * up is socket
@@ -137,6 +148,7 @@ sco_usrreq(struct socket *up, int req, s
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_CONTROL);
+	KASSERT(req != PRU_SENSE);
 
 	switch(req) {
 	case PRU_PURGEIF:
@@ -223,9 +235,6 @@ sco_usrreq(struct socket *up, int req, s
 		sbappendrecord(&up->so_snd, m);
 		return sco_send(pcb, m0);
 
-	case PRU_SENSE:
-		return 0;		/* (no sense - Doh!) */
-
 	case PRU_RCVD:
 	case PRU_RCVOOB:
 		return EOPNOTSUPP;	/* (no release) */
@@ -384,11 +393,13 @@ PR_WRAP_USRREQS(sco)
 #define	sco_attach		sco_attach_wrapper
 #define	sco_detach		sco_detach_wrapper
 #define	sco_ioctl		sco_ioctl_wrapper
+#define	sco_stat		sco_stat_wrapper
 #define	sco_usrreq		sco_usrreq_wrapper
 
 const struct pr_usrreqs sco_usrreqs = {
 	.pr_attach	= sco_attach,
 	.pr_detach	= sco_detach,
 	.pr_ioctl	= sco_ioctl,
+	.pr_stat	= sco_stat,
 	.pr_generic	= sco_usrreq,
 };

Index: src/sys/netinet/raw_ip.c
diff -u src/sys/netinet/raw_ip.c:1.127 src/sys/netinet/raw_ip.c:1.128
--- src/sys/netinet/raw_ip.c:1.127	Tue Jul  1 05:49:18 2014
+++ src/sys/netinet/raw_ip.c	Sun Jul  6 03:33:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_ip.c,v 1.127 2014/07/01 05:49:18 rtr Exp $	*/
+/*	$NetBSD: raw_ip.c,v 1.128 2014/07/06 03:33:33 rtr Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -65,7 +65,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.127 2014/07/01 05:49:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.128 2014/07/06 03:33:33 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_compat_netbsd.h"
@@ -572,6 +572,19 @@ rip_ioctl(struct socket *so, u_long cmd,
 	return in_control(so, cmd, nam, ifp);
 }
 
+static int
+rip_stat(struct socket *so, struct stat *ub)
+{
+	struct inpcb *inp;
+
+	inp = sotoinpcb(so);
+	if (inp == NULL)
+		return EINVAL;
+
+	/* stat: don't bother with a blocksize. */
+	return 0;
+}
+
 int
 rip_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
     struct mbuf *control, struct lwp *l)
@@ -582,6 +595,7 @@ rip_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_CONTROL);
+	KASSERT(req != PRU_SENSE);
 
 	s = splsoftnet();
 	if (req == PRU_PURGEIF) {
@@ -675,13 +689,6 @@ rip_usrreq(struct socket *so, int req, s
 	}
 		break;
 
-	case PRU_SENSE:
-		/*
-		 * stat: don't bother with a blocksize.
-		 */
-		splx(s);
-		return (0);
-
 	case PRU_RCVOOB:
 		error = EOPNOTSUPP;
 		break;
@@ -712,12 +719,14 @@ PR_WRAP_USRREQS(rip)
 #define	rip_attach	rip_attach_wrapper
 #define	rip_detach	rip_detach_wrapper
 #define	rip_ioctl	rip_ioctl_wrapper
+#define	rip_stat	rip_stat_wrapper
 #define	rip_usrreq	rip_usrreq_wrapper
 
 const struct pr_usrreqs rip_usrreqs = {
 	.pr_attach	= rip_attach,
 	.pr_detach	= rip_detach,
 	.pr_ioctl	= rip_ioctl,
+	.pr_stat	= rip_stat,
 	.pr_generic	= rip_usrreq,
 };
 

Index: src/sys/netinet/tcp_usrreq.c
diff -u src/sys/netinet/tcp_usrreq.c:1.180 src/sys/netinet/tcp_usrreq.c:1.181
--- src/sys/netinet/tcp_usrreq.c:1.180	Tue Jul  1 05:49:18 2014
+++ src/sys/netinet/tcp_usrreq.c	Sun Jul  6 03:33:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: tcp_usrreq.c,v 1.180 2014/07/01 05:49:18 rtr Exp $	*/
+/*	$NetBSD: tcp_usrreq.c,v 1.181 2014/07/06 03:33:33 rtr Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -99,7 +99,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.180 2014/07/01 05:49:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.181 2014/07/06 03:33:33 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -180,6 +180,7 @@ tcp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_CONTROL);
+	KASSERT(req != PRU_SENSE);
 
 	family = so->so_proto->pr_domain->dom_family;
 
@@ -242,11 +243,11 @@ tcp_usrreq(struct socket *so, int req, s
 	 * a (struct inpcb) pointed at by the socket, and this
 	 * structure will point at a subsidary (struct tcpcb).
 	 */
-	if ((inp == NULL
+	if (inp == NULL
 #ifdef INET6
 	    && in6p == NULL
 #endif
-	    ) && req != PRU_SENSE)
+	    )
 	{
 		error = EINVAL;
 		goto release;
@@ -475,13 +476,6 @@ tcp_usrreq(struct socket *so, int req, s
 		tp = tcp_drop(tp, ECONNABORTED);
 		break;
 
-	case PRU_SENSE:
-		/*
-		 * stat: don't bother with a blocksize.
-		 */
-		splx(s);
-		return (0);
-
 	case PRU_RCVOOB:
 		if (control && control->m_len) {
 			m_freem(control);
@@ -959,6 +953,13 @@ tcp_ioctl(struct socket *so, u_long cmd,
 	}
 }
 
+static int
+tcp_stat(struct socket *so, struct stat *ub)
+{
+	/* stat: don't bother with a blocksize.  */
+	return 0;
+}
+
 /*
  * Initiate (or continue) disconnect.
  * If embryonic state, just send reset (once).
@@ -2196,11 +2197,13 @@ PR_WRAP_USRREQS(tcp)
 #define	tcp_attach	tcp_attach_wrapper
 #define	tcp_detach	tcp_detach_wrapper
 #define	tcp_ioctl	tcp_ioctl_wrapper
+#define	tcp_stat	tcp_stat_wrapper
 #define	tcp_usrreq	tcp_usrreq_wrapper
 
 const struct pr_usrreqs tcp_usrreqs = {
 	.pr_attach	= tcp_attach,
 	.pr_detach	= tcp_detach,
 	.pr_ioctl	= tcp_ioctl,
+	.pr_stat	= tcp_stat,
 	.pr_generic	= tcp_usrreq,
 };

Index: src/sys/netinet/udp_usrreq.c
diff -u src/sys/netinet/udp_usrreq.c:1.202 src/sys/netinet/udp_usrreq.c:1.203
--- src/sys/netinet/udp_usrreq.c:1.202	Tue Jul  1 05:49:18 2014
+++ src/sys/netinet/udp_usrreq.c	Sun Jul  6 03:33:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: udp_usrreq.c,v 1.202 2014/07/01 05:49:18 rtr Exp $	*/
+/*	$NetBSD: udp_usrreq.c,v 1.203 2014/07/06 03:33:33 rtr Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.202 2014/07/01 05:49:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.203 2014/07/06 03:33:33 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_compat_netbsd.h"
@@ -901,6 +901,19 @@ udp_ioctl(struct socket *so, u_long cmd,
 }
 
 static int
+udp_stat(struct socket *so, struct stat *ub)
+{
+	struct inpcb *inp;
+
+	inp = sotoinpcb(so);
+	if (inp == NULL)
+		return EINVAL;
+
+	/* stat: don't bother with a blocksize. */
+	return 0;
+}
+
+static int
 udp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
     struct mbuf *control, struct lwp *l)
 {
@@ -910,6 +923,7 @@ udp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_CONTROL);
+	KASSERT(req != PRU_SENSE);
 
 	s = splsoftnet();
 	if (req == PRU_PURGEIF) {
@@ -1010,13 +1024,6 @@ udp_usrreq(struct socket *so, int req, s
 	}
 		break;
 
-	case PRU_SENSE:
-		/*
-		 * stat: don't bother with a blocksize.
-		 */
-		splx(s);
-		return (0);
-
 	case PRU_RCVOOB:
 		error =  EOPNOTSUPP;
 		break;
@@ -1264,11 +1271,13 @@ PR_WRAP_USRREQS(udp)
 #define	udp_attach	udp_attach_wrapper
 #define	udp_detach	udp_detach_wrapper
 #define	udp_ioctl	udp_ioctl_wrapper
+#define	udp_stat	udp_stat_wrapper
 #define	udp_usrreq	udp_usrreq_wrapper
 
 const struct pr_usrreqs udp_usrreqs = {
 	.pr_attach	= udp_attach,
 	.pr_detach	= udp_detach,
 	.pr_ioctl	= udp_ioctl,
+	.pr_stat	= udp_stat,
 	.pr_generic	= udp_usrreq,
 };

Index: src/sys/netinet6/raw_ip6.c
diff -u src/sys/netinet6/raw_ip6.c:1.121 src/sys/netinet6/raw_ip6.c:1.122
--- src/sys/netinet6/raw_ip6.c:1.121	Tue Jul  1 05:49:19 2014
+++ src/sys/netinet6/raw_ip6.c	Sun Jul  6 03:33:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_ip6.c,v 1.121 2014/07/01 05:49:19 rtr Exp $	*/
+/*	$NetBSD: raw_ip6.c,v 1.122 2014/07/06 03:33:33 rtr Exp $	*/
 /*	$KAME: raw_ip6.c,v 1.82 2001/07/23 18:57:56 jinmei Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.121 2014/07/01 05:49:19 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.122 2014/07/06 03:33:33 rtr Exp $");
 
 #include "opt_ipsec.h"
 
@@ -650,6 +650,13 @@ rip6_ioctl(struct socket *so, u_long cmd
 	return in6_control(so, cmd, nam, ifp);
 }
 
+static int
+rip6_stat(struct socket *so, struct stat *ub)
+{
+	/* stat: don't bother with a blocksize */
+	return 0;
+}
+
 int
 rip6_usrreq(struct socket *so, int req, struct mbuf *m, 
 	struct mbuf *nam, struct mbuf *control, struct lwp *l)
@@ -658,6 +665,7 @@ rip6_usrreq(struct socket *so, int req, 
 	int error = 0;
 
 	KASSERT(req != PRU_CONTROL);
+	KASSERT(req != PRU_SENSE);
 
 	if (req == PRU_PURGEIF) {
 		mutex_enter(softnet_lock);
@@ -826,11 +834,6 @@ rip6_usrreq(struct socket *so, int req, 
 		break;
 	}
 
-	case PRU_SENSE:
-		/*
-		 * stat: don't bother with a blocksize
-		 */
-		return 0;
 	/*
 	 * Not supported.
 	 */
@@ -901,11 +904,13 @@ PR_WRAP_USRREQS(rip6)
 #define	rip6_attach		rip6_attach_wrapper
 #define	rip6_detach		rip6_detach_wrapper
 #define	rip6_ioctl		rip6_ioctl_wrapper
+#define	rip6_stat		rip6_stat_wrapper
 #define	rip6_usrreq		rip6_usrreq_wrapper
 
 const struct pr_usrreqs rip6_usrreqs = {
 	.pr_attach	= rip6_attach,
 	.pr_detach	= rip6_detach,
 	.pr_ioctl	= rip6_ioctl,
+	.pr_stat	= rip6_stat,
 	.pr_generic	= rip6_usrreq,
 };

Index: src/sys/netinet6/udp6_usrreq.c
diff -u src/sys/netinet6/udp6_usrreq.c:1.101 src/sys/netinet6/udp6_usrreq.c:1.102
--- src/sys/netinet6/udp6_usrreq.c:1.101	Tue Jul  1 05:49:19 2014
+++ src/sys/netinet6/udp6_usrreq.c	Sun Jul  6 03:33:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: udp6_usrreq.c,v 1.101 2014/07/01 05:49:19 rtr Exp $	*/
+/*	$NetBSD: udp6_usrreq.c,v 1.102 2014/07/06 03:33:33 rtr Exp $	*/
 /*	$KAME: udp6_usrreq.c,v 1.86 2001/05/27 17:33:00 itojun Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.101 2014/07/01 05:49:19 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.102 2014/07/06 03:33:33 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_inet_csum.h"
@@ -693,6 +693,18 @@ udp6_ioctl(struct socket *so, u_long cmd
 	return in6_control(so, cmd, addr6, ifp);
 }
 
+static int
+udp6_stat(struct socket *so, struct stat *ub)
+{
+	struct in6pcb *in6p = sotoin6pcb(so);
+
+	if (in6p == NULL)
+		return EINVAL;
+
+	/* stat: don't bother with a blocksize */
+	return 0;
+}
+
 int
 udp6_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr6,
     struct mbuf *control, struct lwp *l)
@@ -703,6 +715,7 @@ udp6_usrreq(struct socket *so, int req, 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_CONTROL);
+	KASSERT(req != PRU_SENSE);
 
 	if (req == PRU_PURGEIF) {
 		mutex_enter(softnet_lock);
@@ -773,12 +786,6 @@ udp6_usrreq(struct socket *so, int req, 
 		in6_setpeeraddr(in6p, addr6);
 		break;
 
-	case PRU_SENSE:
-		/*
-		 * stat: don't bother with a blocksize
-		 */
-		return 0;
-
 	case PRU_LISTEN:
 	case PRU_CONNECT2:
 	case PRU_ACCEPT:
@@ -878,11 +885,13 @@ PR_WRAP_USRREQS(udp6)
 #define	udp6_attach	udp6_attach_wrapper
 #define	udp6_detach	udp6_detach_wrapper
 #define	udp6_ioctl	udp6_ioctl_wrapper
+#define	udp6_stat	udp6_stat_wrapper
 #define	udp6_usrreq	udp6_usrreq_wrapper
 
 const struct pr_usrreqs udp6_usrreqs = {
 	.pr_attach	= udp6_attach,
 	.pr_detach	= udp6_detach,
 	.pr_ioctl	= udp6_ioctl,
+	.pr_stat	= udp6_stat,
 	.pr_generic	= udp6_usrreq,
 };

Index: src/sys/netipsec/keysock.c
diff -u src/sys/netipsec/keysock.c:1.29 src/sys/netipsec/keysock.c:1.30
--- src/sys/netipsec/keysock.c:1.29	Tue Jul  1 05:49:19 2014
+++ src/sys/netipsec/keysock.c	Sun Jul  6 03:33:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: keysock.c,v 1.29 2014/07/01 05:49:19 rtr Exp $	*/
+/*	$NetBSD: keysock.c,v 1.30 2014/07/06 03:33:33 rtr Exp $	*/
 /*	$FreeBSD: src/sys/netipsec/keysock.c,v 1.3.2.1 2003/01/24 05:11:36 sam Exp $	*/
 /*	$KAME: keysock.c,v 1.25 2001/08/13 20:07:41 itojun Exp $	*/
 
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.29 2014/07/01 05:49:19 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.30 2014/07/06 03:33:33 rtr Exp $");
 
 #include "opt_ipsec.h"
 
@@ -490,6 +490,12 @@ key_ioctl(struct socket *so, u_long cmd,
 	return EOPNOTSUPP;
 }
 
+static int
+key_stat(struct socket *so, struct stat *ub)
+{
+	return 0;
+}
+
 /*
  * key_usrreq()
  * derived from net/rtsock.c:route_usrreq()
@@ -503,6 +509,7 @@ key_usrreq(struct socket *so, int req,st
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_CONTROL);
+	KASSERT(req != PRU_SENSE);
 
 	s = splsoftnet();
 	error = raw_usrreq(so, req, m, nam, control, l);
@@ -522,12 +529,14 @@ PR_WRAP_USRREQS(key)
 #define	key_attach	key_attach_wrapper
 #define	key_detach	key_detach_wrapper
 #define	key_ioctl	key_ioctl_wrapper
+#define	key_stat	key_stat_wrapper
 #define	key_usrreq	key_usrreq_wrapper
 
 const struct pr_usrreqs key_usrreqs = {
 	.pr_attach	= key_attach,
 	.pr_detach	= key_detach,
 	.pr_ioctl	= key_ioctl,
+	.pr_stat	= key_stat,
 	.pr_generic	= key_usrreq,
 };
 

Index: src/sys/netnatm/natm.c
diff -u src/sys/netnatm/natm.c:1.29 src/sys/netnatm/natm.c:1.30
--- src/sys/netnatm/natm.c:1.29	Tue Jul  1 05:49:19 2014
+++ src/sys/netnatm/natm.c	Sun Jul  6 03:33:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: natm.c,v 1.29 2014/07/01 05:49:19 rtr Exp $	*/
+/*	$NetBSD: natm.c,v 1.30 2014/07/06 03:33:33 rtr Exp $	*/
 
 /*
  * Copyright (c) 1996 Charles D. Cranor and Washington University.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.29 2014/07/01 05:49:19 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.30 2014/07/06 03:33:33 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -131,6 +131,19 @@ done:
   return(error);
 }
 
+static int
+natm_ioctl(struct socket *so, struct stat *ub)
+{
+  struct natmpcb *npcb;
+
+  npcb = (struct natmpcb *) so->so_pcb;
+
+  if (npcb == NULL)
+    return EINVAL;
+
+  return 0;
+}
+
 /*
  * user requests
  */
@@ -151,6 +164,7 @@ natm_usrreq(struct socket *so, int req, 
   KASSERT(req != PRU_ATTACH);
   KASSERT(req != PRU_DETACH);
   KASSERT(req != PRU_CONTROL);
+  KASSERT(req != PRU_SENSE);
 
   s = SPLSOFTNET();
 
@@ -287,10 +301,6 @@ natm_usrreq(struct socket *so, int req, 
 
       break;
 
-    case PRU_SENSE:			/* return status into m */
-      /* return zero? */
-      break;
-
     case PRU_PEERADDR:			/* fetch peer's address */
       snatm = mtod(nam, struct sockaddr_natm *);
       memset(snatm, 0, sizeof(*snatm));
@@ -411,11 +421,13 @@ PR_WRAP_USRREQS(natm)
 #define	natm_attach	natm_attach_wrapper
 #define	natm_detach	natm_detach_wrapper
 #define	natm_ioctl	natm_ioctl_wrapper
+#define	natm_stat	natm_stat_wrapper
 #define	natm_usrreq	natm_usrreq_wrapper
 
 const struct pr_usrreqs natm_usrreqs = {
 	.pr_attach	= natm_attach,
 	.pr_detach	= natm_detach,
 	.pr_ioctl	= natm_ioctl,
+	.pr_stat	= natm_stat,
 	.pr_generic	= natm_usrreq,
 };

Index: src/sys/sys/protosw.h
diff -u src/sys/sys/protosw.h:1.49 src/sys/sys/protosw.h:1.50
--- src/sys/sys/protosw.h:1.49	Tue Jul  1 05:49:19 2014
+++ src/sys/sys/protosw.h	Sun Jul  6 03:33:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: protosw.h,v 1.49 2014/07/01 05:49:19 rtr Exp $	*/
+/*	$NetBSD: protosw.h,v 1.50 2014/07/06 03:33:33 rtr Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1993
@@ -62,6 +62,7 @@ struct ifnet;
 struct sockaddr;
 struct socket;
 struct sockopt;
+struct stat;
 struct domain;
 struct proc;
 struct lwp;
@@ -238,6 +239,7 @@ struct pr_usrreqs {
 	int	(*pr_attach)(struct socket *, int);
 	void	(*pr_detach)(struct socket *);
 	int	(*pr_ioctl)(struct socket *, u_long, void *, struct ifnet *);
+	int	(*pr_stat)(struct socket *, struct stat *);
 	int	(*pr_generic)(struct socket *, int, struct mbuf *,
 	    struct mbuf *, struct mbuf *, struct lwp *);
 };
@@ -300,6 +302,15 @@ name##_ioctl_wrapper(struct socket *a, u
 	return rv;					\
 }							\
 static int						\
+name##_stat_wrapper(struct socket *a, struct stat *b)	\
+{							\
+	int rv;						\
+	KERNEL_LOCK(1, NULL);				\
+	rv = name##_stat(a, b);				\
+	KERNEL_UNLOCK_ONE(NULL);			\
+	return rv;					\
+}							\
+static int						\
 name##_usrreq_wrapper(struct socket *a, int b,		\
     struct mbuf *c, struct mbuf *d, struct mbuf *e,	\
     struct lwp *f)					\

Reply via email to