Module Name:    src
Committed By:   manu
Date:           Sun May 29 03:32:46 UTC 2011

Modified Files:
        src/sys/kern: uipc_domain.c uipc_proto.c uipc_usrreq.c

Log Message:
Add SOCK_SEQPACKET to PL_LOCAL sockets. Based on patch from Jesse Off,
submitted 8 years ago:
http://mail-index.netbsd.org/tech-kern/2003/04/14/0006.html


To generate a diff of this commit:
cvs rdiff -u -r1.85 -r1.86 src/sys/kern/uipc_domain.c
cvs rdiff -u -r1.21 -r1.22 src/sys/kern/uipc_proto.c
cvs rdiff -u -r1.133 -r1.134 src/sys/kern/uipc_usrreq.c

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

Modified files:

Index: src/sys/kern/uipc_domain.c
diff -u src/sys/kern/uipc_domain.c:1.85 src/sys/kern/uipc_domain.c:1.86
--- src/sys/kern/uipc_domain.c:1.85	Sat Oct  3 20:24:39 2009
+++ src/sys/kern/uipc_domain.c	Sun May 29 03:32:46 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_domain.c,v 1.85 2009/10/03 20:24:39 elad Exp $	*/
+/*	$NetBSD: uipc_domain.c,v 1.86 2011/05/29 03:32:46 manu Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1993
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_domain.c,v 1.85 2009/10/03 20:24:39 elad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_domain.c,v 1.86 2011/05/29 03:32:46 manu Exp $");
 
 #include <sys/param.h>
 #include <sys/socket.h>
@@ -518,6 +518,12 @@
 		       CTL_NET, PF_LOCAL, SOCK_STREAM, CTL_EOL);
 	sysctl_createv(&domain_sysctllog, 0, NULL, NULL,
 		       CTLFLAG_PERMANENT,
+		       CTLTYPE_NODE, "seqpacket",
+		       SYSCTL_DESCR("SOCK_SEQPACKET settings"),
+		       NULL, 0, NULL, 0,
+		       CTL_NET, PF_LOCAL, SOCK_SEQPACKET, CTL_EOL);
+	sysctl_createv(&domain_sysctllog, 0, NULL, NULL,
+		       CTLFLAG_PERMANENT,
 		       CTLTYPE_NODE, "dgram",
 		       SYSCTL_DESCR("SOCK_DGRAM settings"),
 		       NULL, 0, NULL, 0,
@@ -532,6 +538,13 @@
 	sysctl_createv(&domain_sysctllog, 0, NULL, NULL,
 		       CTLFLAG_PERMANENT,
 		       CTLTYPE_STRUCT, "pcblist",
+		       SYSCTL_DESCR("SOCK_SEQPACKET protocol control "
+				    "block list"),
+		       sysctl_unpcblist, 0, NULL, 0,
+		       CTL_NET, PF_LOCAL, SOCK_SEQPACKET, CTL_CREATE, CTL_EOL);
+	sysctl_createv(&domain_sysctllog, 0, NULL, NULL,
+		       CTLFLAG_PERMANENT,
+		       CTLTYPE_STRUCT, "pcblist",
 		       SYSCTL_DESCR("SOCK_DGRAM protocol control block list"),
 		       sysctl_unpcblist, 0, NULL, 0,
 		       CTL_NET, PF_LOCAL, SOCK_DGRAM, CTL_CREATE, CTL_EOL);

Index: src/sys/kern/uipc_proto.c
diff -u src/sys/kern/uipc_proto.c:1.21 src/sys/kern/uipc_proto.c:1.22
--- src/sys/kern/uipc_proto.c:1.21	Thu Apr 24 11:38:36 2008
+++ src/sys/kern/uipc_proto.c	Sun May 29 03:32:46 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_proto.c,v 1.21 2008/04/24 11:38:36 ad Exp $	*/
+/*	$NetBSD: uipc_proto.c,v 1.22 2011/05/29 03:32:46 manu Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1993
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_proto.c,v 1.21 2008/04/24 11:38:36 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_proto.c,v 1.22 2011/05/29 03:32:46 manu Exp $");
 
 #include <sys/param.h>
 #include <sys/socket.h>
@@ -65,6 +65,13 @@
 		.pr_ctloutput = uipc_ctloutput,
 		.pr_usrreq = uipc_usrreq,
 	}, {
+		.pr_type = SOCK_SEQPACKET,
+		.pr_domain = &unixdomain,
+		.pr_flags = PR_CONNREQUIRED|PR_WANTRCVD|PR_RIGHTS|PR_LISTEN|
+			    PR_ATOMIC,
+		.pr_ctloutput = uipc_ctloutput,
+		.pr_usrreq = uipc_usrreq,
+	}, {
 		.pr_input = raw_input,
 		.pr_ctlinput = raw_ctlinput,
 		.pr_usrreq = raw_usrreq,

Index: src/sys/kern/uipc_usrreq.c
diff -u src/sys/kern/uipc_usrreq.c:1.133 src/sys/kern/uipc_usrreq.c:1.134
--- src/sys/kern/uipc_usrreq.c:1.133	Fri Nov 19 06:44:43 2010
+++ src/sys/kern/uipc_usrreq.c	Sun May 29 03:32:46 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_usrreq.c,v 1.133 2010/11/19 06:44:43 dholland Exp $	*/
+/*	$NetBSD: uipc_usrreq.c,v 1.134 2011/05/29 03:32:46 manu 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.133 2010/11/19 06:44:43 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.134 2011/05/29 03:32:46 manu Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -124,7 +124,7 @@
  * Unix communications domain.
  *
  * TODO:
- *	SEQPACKET, RDM
+ *	RDM
  *	rethink name space problems
  *	need a proper out-of-band
  *
@@ -487,6 +487,7 @@
 			panic("uipc 1");
 			/*NOTREACHED*/
 
+		case SOCK_SEQPACKET: /* FALLTHROUGH */
 		case SOCK_STREAM:
 #define	rcv (&so->so_rcv)
 #define snd (&so2->so_snd)
@@ -567,6 +568,7 @@
 			break;
 		}
 
+		case SOCK_SEQPACKET: /* FALLTHROUGH */
 		case SOCK_STREAM:
 #define	rcv (&so2->so_rcv)
 #define	snd (&so->so_snd)
@@ -579,7 +581,7 @@
 			if (unp->unp_conn->unp_flags & UNP_WANTCRED) {
 				/*
 				 * Credentials are passed only once on
-				 * SOCK_STREAM.
+				 * SOCK_STREAM and SOCK_SEQPACKET.
 				 */
 				unp->unp_conn->unp_flags &= ~UNP_WANTCRED;
 				control = unp_addsockcred(l, control);
@@ -592,8 +594,19 @@
 			if (control) {
 				if (sbappendcontrol(rcv, m, control) != 0)
 					control = NULL;
-			} else
-				sbappend(rcv, m);
+			} else {
+				switch(so->so_type) {
+				case SOCK_SEQPACKET:
+					sbappendrecord(rcv, m);
+					break;
+				case SOCK_STREAM:
+					sbappend(rcv, m);
+					break;
+				default:
+					panic("uipc_usrreq");
+					break;
+				}
+			}
 			snd->sb_mbmax -=
 			    rcv->sb_mbcnt - unp->unp_conn->unp_mbcnt;
 			unp->unp_conn->unp_mbcnt = rcv->sb_mbcnt;
@@ -629,10 +642,18 @@
 
 	case PRU_SENSE:
 		((struct stat *) m)->st_blksize = so->so_snd.sb_hiwat;
-		if (so->so_type == SOCK_STREAM && unp->unp_conn != 0) {
+		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)
@@ -767,6 +788,7 @@
 	int error;
 
 	switch (so->so_type) {
+	case SOCK_SEQPACKET: /* FALLTHROUGH */
 	case SOCK_STREAM:
 		if (so->so_lock == NULL) {
 			/* 
@@ -1093,6 +1115,7 @@
 		soisconnected(so);
 		break;
 
+	case SOCK_SEQPACKET: /* FALLTHROUGH */
 	case SOCK_STREAM:
 		unp2->unp_conn = unp;
 		if (req == PRU_CONNECT &&
@@ -1150,6 +1173,7 @@
 		so->so_state &= ~SS_ISCONNECTED;
 		break;
 
+	case SOCK_SEQPACKET: /* FALLTHROUGH */
 	case SOCK_STREAM:
 		KASSERT(solocked2(so, unp2->unp_socket));
 		soisdisconnected(so);
@@ -1171,9 +1195,15 @@
 {
 	struct socket *so;
 
-	if (unp->unp_socket->so_type == SOCK_STREAM && unp->unp_conn &&
-	    (so = unp->unp_conn->unp_socket))
-		socantrcvmore(so);
+	switch(unp->unp_socket->so_type) {
+	case SOCK_SEQPACKET: /* FALLTHROUGH */
+	case SOCK_STREAM:
+		if (unp->unp_conn && (so = unp->unp_conn->unp_socket))
+			socantrcvmore(so);
+		break;
+	default:
+		break;
+	}
 }
 
 bool

Reply via email to