From fbff813c00a7060f12765cc0b65ba3c7a40fa8db Mon Sep 17 00:00:00 2001
From: Sascha Wildner <saw@online.de>
Date: Sat, 19 Nov 2016 10:57:36 +0100
Subject: [PATCH] WIP portalfs removal

---
 Makefile_upgrade.inc               |   4 +
 etc/defaults/rc.conf               |   2 +-
 etc/mtree/BSD.usr.dist             |   2 -
 sbin/Makefile                      |   1 -
 sbin/mount/mount.8                 |   1 -
 sbin/mount_portal/Makefile         |  14 -
 sbin/mount_portal/activate.c       | 198 -------------
 sbin/mount_portal/conf.c           | 327 ---------------------
 sbin/mount_portal/mount_portal.8   | 148 ----------
 sbin/mount_portal/mount_portal.c   | 278 ------------------
 sbin/mount_portal/pathnames.h      |  41 ---
 sbin/mount_portal/portal.conf      |   8 -
 sbin/mount_portal/portald.h        |  81 ------
 sbin/mount_portal/pt_conf.c        |  49 ----
 sbin/mount_portal/pt_exec.c        |  51 ----
 sbin/mount_portal/pt_file.c        | 100 -------
 sbin/mount_portal/pt_tcp.c         | 157 ----------
 sbin/mount_portal/pt_tcplisten.c   | 199 -------------
 sbin/mount_ufs/mount_ufs.8         |   1 -
 share/examples/portal/README       |  64 ----
 share/examples/portal/portal.conf  |   3 -
 sys/boot/dloader/loader-bootp.conf |   1 -
 sys/boot/dloader/loader.conf       |   1 -
 sys/conf/files                     |   2 -
 sys/conf/options                   |   1 -
 sys/config/LINT64                  |   6 -
 sys/sys/vfscache.h                 |   2 +-
 sys/vfs/Makefile                   |   2 +-
 sys/vfs/portal/Makefile            |   7 -
 sys/vfs/portal/portal.h            |  67 -----
 sys/vfs/portal/portal_vfsops.c     | 233 ---------------
 sys/vfs/portal/portal_vnops.c      | 580 -------------------------------------
 32 files changed, 7 insertions(+), 2624 deletions(-)
 delete mode 100644 sbin/mount_portal/Makefile
 delete mode 100644 sbin/mount_portal/activate.c
 delete mode 100644 sbin/mount_portal/conf.c
 delete mode 100644 sbin/mount_portal/mount_portal.8
 delete mode 100644 sbin/mount_portal/mount_portal.c
 delete mode 100644 sbin/mount_portal/pathnames.h
 delete mode 100644 sbin/mount_portal/portal.conf
 delete mode 100644 sbin/mount_portal/portald.h
 delete mode 100644 sbin/mount_portal/pt_conf.c
 delete mode 100644 sbin/mount_portal/pt_exec.c
 delete mode 100644 sbin/mount_portal/pt_file.c
 delete mode 100644 sbin/mount_portal/pt_tcp.c
 delete mode 100644 sbin/mount_portal/pt_tcplisten.c
 delete mode 100644 share/examples/portal/README
 delete mode 100644 share/examples/portal/portal.conf
 delete mode 100644 sys/vfs/portal/Makefile
 delete mode 100644 sys/vfs/portal/portal.h
 delete mode 100644 sys/vfs/portal/portal_vfsops.c
 delete mode 100644 sys/vfs/portal/portal_vnops.c

diff --git a/Makefile_upgrade.inc b/Makefile_upgrade.inc
index ea50aaa..9deb94a 100644
--- a/Makefile_upgrade.inc
+++ b/Makefile_upgrade.inc
@@ -3149,6 +3149,10 @@ TO_REMOVE+=/usr/include/ncurses_dll.h
 TO_REMOVE+=/usr/include/termcap.h
 TO_REMOVE+=/usr/include/term.h
 TO_REMOVE+=/usr/include/unctrl.h
+TO_REMOVE+=/boot/kernel/portal.ko
+TO_REMOVE+=/sbin/mount_portal
+TO_REMOVE+=/usr/share/examples/portal
+TO_REMOVE+=/usr/share/man/man8/mount_portal.8.gz
 
 .if !defined(WANT_INSTALLER)
 TO_REMOVE+=/usr/sbin/dfuibe_installer
diff --git a/etc/defaults/rc.conf b/etc/defaults/rc.conf
index eb3d8e9..cb71682 100644
--- a/etc/defaults/rc.conf
+++ b/etc/defaults/rc.conf
@@ -38,7 +38,7 @@ local_startup="/usr/local/etc/rc.d /usr/pkg/etc/rc.d"
 script_name_sep=" "	# Change if your startup scripts' names contain spaces
 rc_conf_files="/etc/rc.conf /etc/rc.conf.local"
 fsck_y_enable="NO"	# Set to YES to do fsck -y if the initial preen fails.
-netfs_types="nfs:NFS smbfs:SMB portalfs:PORTAL" # Net filesystems.
+netfs_types="nfs:NFS smbfs:SMB" # Net filesystems.
 extra_netfs_types="NO"	# List of network extra filesystem types for delayed
 			# mount at startup (or NO).
 devfs_config_files="/etc/defaults/devfs.conf /etc/devfs.conf"
diff --git a/etc/mtree/BSD.usr.dist b/etc/mtree/BSD.usr.dist
index e8a612f..d3319d8 100644
--- a/etc/mtree/BSD.usr.dist
+++ b/etc/mtree/BSD.usr.dist
@@ -207,8 +207,6 @@
             ..
             pf
             ..
-            portal
-            ..
             ppi
             ..
             ppp
diff --git a/sbin/Makefile b/sbin/Makefile
index 2f61751..0ccc54c 100644
--- a/sbin/Makefile
+++ b/sbin/Makefile
@@ -59,7 +59,6 @@ SUBDIR=	adjkerntz \
 	mount_nfs \
 	mount_ntfs \
 	mount_null \
-	mount_portal \
 	mount_std \
 	mount_tmpfs \
 	mount_udf \
diff --git a/sbin/mount/mount.8 b/sbin/mount/mount.8
index 0a4ec0b..fc6b4e5 100644
--- a/sbin/mount/mount.8
+++ b/sbin/mount/mount.8
@@ -413,7 +413,6 @@ have permission to load the module.
 .Xr mount_nfs 8 ,
 .Xr mount_ntfs 8 ,
 .Xr mount_null 8 ,
-.Xr mount_portal 8 ,
 .Xr mount_procfs 8 ,
 .Xr mount_smbfs 8 ,
 .Xr mount_std 8 ,
diff --git a/sbin/mount_portal/Makefile b/sbin/mount_portal/Makefile
deleted file mode 100644
index e4c1029..0000000
--- a/sbin/mount_portal/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-#	From: @(#)Makefile	8.3 (Berkeley) 3/27/94
-# $FreeBSD: src/sbin/mount_portal/Makefile,v 1.10.2.1 2001/04/25 10:58:39 ru Exp $
-
-PROG=	mount_portal
-SRCS=	mount_portal.c activate.c conf.c pt_conf.c \
-	pt_exec.c pt_file.c pt_tcp.c pt_tcplisten.c
-MAN=	mount_portal.8
-
-LDADD=	-lutil
-DPADD=	${LIBUTIL}
-
-CFLAGS+=-I${.CURDIR}/../../sys
-
-.include <bsd.prog.mk>
diff --git a/sbin/mount_portal/activate.c b/sbin/mount_portal/activate.c
deleted file mode 100644
index 68a9be6..0000000
--- a/sbin/mount_portal/activate.c
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (c) 1992, 1993
- *	The Regents of the University of California.  All rights reserved.
- * All rights reserved.
- *
- * This code is derived from software donated to Berkeley by
- * Jan-Simon Pendry.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)activate.c	8.3 (Berkeley) 4/28/95
- *
- * $FreeBSD: src/sbin/mount_portal/activate.c,v 1.7 1999/08/28 00:13:35 peter Exp $
- * $DragonFly: src/sbin/mount_portal/activate.c,v 1.6 2007/05/18 17:05:12 dillon Exp $
- */
-
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/syslog.h>
-#include <sys/uio.h>
-
-#include "portald.h"
-
-/*
- * Scan the providers list and call the
- * appropriate function.
- */
-static int
-activate_argv(struct portal_cred *pcr, char *key, char **v, int so, int *fdp)
-{
-	provider *pr;
-
-	for (pr = providers; pr->pr_match; pr++)
-		if (strcmp(v[0], pr->pr_match) == 0)
-			return ((*pr->pr_func)(pcr, key, v, so, fdp));
-
-	return (ENOENT);
-}
-
-static int
-get_request(int so, struct portal_cred *pcr, char *key, int klen)
-{
-	struct iovec iov[2];
-	struct msghdr msg;
-	int n;
-
-	iov[0].iov_base = (caddr_t) pcr;
-	iov[0].iov_len = sizeof(*pcr);
-	iov[1].iov_base = key;
-	iov[1].iov_len = klen;
-
-	memset(&msg, 0, sizeof(msg));
-	msg.msg_iov = iov;
-	msg.msg_iovlen = 2;
-
-	n = recvmsg(so, &msg, 0);
-	if (n < 0)
-		return (errno);
-
-	if ((size_t)n <= sizeof(*pcr))
-		return (EINVAL);
-
-	n -= sizeof(*pcr);
-	key[n] = '\0';
-
-	return (0);
-}
-
-static void
-send_reply(int so, int fd, int error)
-{
-	int n;
-	struct iovec iov;
-	struct msghdr msg;
-	struct {
-		struct cmsghdr cmsg;
-		int fd;
-	} ctl;
-
-	/*
-	 * Line up error code.  Don't worry about byte ordering
-	 * because we must be sending to the local machine.
-	 */
-	iov.iov_base = (caddr_t) &error;
-	iov.iov_len = sizeof(error);
-
-	/*
-	 * Build a msghdr
-	 */
-	memset(&msg, 0, sizeof(msg));
-	msg.msg_iov = &iov;
-	msg.msg_iovlen = 1;
-
-	/*
-	 * If there is a file descriptor to send then
-	 * construct a suitable rights control message.
-	 */
-	if (fd >= 0) {
-		ctl.fd = fd;
-		ctl.cmsg.cmsg_len = sizeof(ctl);
-		ctl.cmsg.cmsg_level = SOL_SOCKET;
-		ctl.cmsg.cmsg_type = SCM_RIGHTS;
-		msg.msg_control = (caddr_t) &ctl;
-		msg.msg_controllen = ctl.cmsg.cmsg_len;
-	}
-
-	/*
-	 * Send to kernel...
-	 */
-	if ((n = sendmsg(so, &msg, 0)) < 0)
-		syslog(LOG_ERR, "send: %s", strerror(errno));
-#ifdef DEBUG
-	fprintf(stderr, "sent %d bytes\n", n);
-#endif
-	sleep(1);	/*XXX*/
-#ifdef notdef
-	if (shutdown(so, SHUT_RDWR) < 0)
-		syslog(LOG_ERR, "shutdown: %s", strerror(errno));
-#endif
-	/*
-	 * Throw away the open file descriptor
-	 */
-	close(fd);
-}
-
-void
-activate(qelem *q, int so)
-{
-	struct portal_cred pcred;
-	char key[MAXPATHLEN+1];
-	int error;
-	char **v;
-	int fd = -1;
-
-	/*
-	 * Read the key from the socket
-	 */
-	error = get_request(so, &pcred, key, sizeof(key));
-	if (error) {
-		syslog(LOG_ERR, "activate: recvmsg: %s", strerror(error));
-		goto drop;
-	}
-
-#ifdef DEBUG
-	fprintf(stderr, "lookup key %s\n", key);
-#endif
-
-	/*
-	 * Find a match in the configuration file
-	 */
-	v = conf_match(q, key);
-
-	/*
-	 * If a match existed, then find an appropriate portal
-	 * otherwise simply return ENOENT.
-	 */
-	if (v) {
-		error = activate_argv(&pcred, key, v, so, &fd);
-		if (error)
-			fd = -1;
-		else if (fd < 0)
-			error = -1;
-	} else {
-		error = ENOENT;
-	}
-
-	if (error >= 0)
-		send_reply(so, fd, error);
-
-drop:;
-	close(so);
-}
diff --git a/sbin/mount_portal/conf.c b/sbin/mount_portal/conf.c
deleted file mode 100644
index d73def5..0000000
--- a/sbin/mount_portal/conf.c
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * Copyright (c) 1992, 1993
- *	The Regents of the University of California.  All rights reserved.
- * All rights reserved.
- *
- * This code is derived from software donated to Berkeley by
- * Jan-Simon Pendry.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)conf.c	8.2 (Berkeley) 3/27/94
- *
- * $FreeBSD: src/sbin/mount_portal/conf.c,v 1.8 1999/08/28 00:13:35 peter Exp $
- */
-
-#include <errno.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <regex.h>
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/syslog.h>
-
-#include "portald.h"
-
-#define	ALLOC(ty)	(xmalloc(sizeof(ty)))
-
-typedef struct path path;
-struct path {
-	qelem p_q;		/* 2-way linked list */
-	int p_lno;		/* Line number of this record */
-	char *p_args;		/* copy of arg string (malloc) */
-	char *p_key;		/* Pathname to match (also p_argv[0]) */
-	regex_t p_rx;		/* RE to match against pathname () */
-	int p_rxvalid;		/* non-zero if valid regular expression */
-	int p_argc;		/* number of elements in arg string */
-	char **p_argv;		/* argv[] pointers into arg string (malloc) */
-};
-
-static char *conf_file;		/* XXX for regerror */
-static path *curp;		/* XXX for regerror */
-
-/*
- * Add an element to a 2-way list,
- * just after (pred)
- */
-static void
-ins_que(qelem *elem, qelem *pred)
-{
-	qelem *p = pred->q_forw;
-	elem->q_back = pred;
-	elem->q_forw = p;
-	pred->q_forw = elem;
-	p->q_back = elem;
-}
-
-/*
- * Remove an element from a 2-way list
- */
-static void
-rem_que(qelem *elem)
-{
-	qelem *p = elem->q_forw;
-	qelem *p2 = elem->q_back;
-	p2->q_forw = p;
-	p->q_back = p2;
-}
-
-/*
- * Error checking malloc
- */
-static void *
-xmalloc(unsigned siz)
-{
-	void *p = malloc(siz);
-	if (p)
-		return (p);
-	syslog(LOG_ALERT, "malloc: failed to get %d bytes", siz);
-	exit(1);
-}
-
-/*
- * Insert the path in the list.
- * If there is already an element with the same key then
- * the *second* one is ignored (return 0).  If the key is
- * not found then the path is added to the end of the list
- * and 1 is returned.
- */
-static int
-pinsert(path *p0, qelem *q0)
-{
-	qelem *q;
-
-	if (p0->p_argc == 0)
-		return (0);
-
-	for (q = q0->q_forw; q != q0; q = q->q_forw) {
-		path *p = (path *) q;
-		if (strcmp(p->p_key, p0->p_key) == 0)
-			return (0);
-	}
-	ins_que(&p0->p_q, q0->q_back);
-	return (1);
-
-}
-
-static path *
-palloc(char *cline, int lno)
-{
-	int c;
-	char *s;
-	char *key;
-	path *p;
-	char **ap;
-
-	/*
-	 * Implement comment chars
-	 */
-	s = strchr(cline, '#');
-	if (s)
-		*s = 0;
-
-	/*
-	 * Do a pass through the string to count the number
-	 * of arguments
-	 */
-	c = 0;
-	key = strdup(cline);
-	for (s = key; s != NULL; ) {
-		char *val;
-		while ((val = strsep(&s, " \t\n")) != NULL && *val == '\0')
-			;
-		if (val)
-			c++;
-	}
-	c++;
-	free(key);
-
-	if (c <= 1)
-		return (0);
-
-	/*
-	 * Now do another pass and generate a new path structure
-	 */
-	p = ALLOC(path);
-	p->p_argc = 0;
-	p->p_argv = xmalloc(c * sizeof(char *));
-	p->p_args = strdup(cline);
-	ap = p->p_argv;
-	for (s = p->p_args; s != NULL; ) {
-		char *val;
-		while ((val = strsep(&s, " \t\n")) != NULL && *val == '\0')
-			;
-		if (val) {
-			*ap++ = val;
-			p->p_argc++;
-		}
-	}
-	*ap = NULL;
-
-#ifdef DEBUG
-	for (c = 0; c < p->p_argc; c++)
-		printf("%sv[%d] = %s\n", c?"\t":"", c, p->p_argv[c]);
-#endif
-
-	p->p_key = p->p_argv[0];
-	if (strpbrk(p->p_key, RE_CHARS)) {
-		int val;
-
-		curp = p;			/* XXX */
-		val = regcomp(&p->p_rx, p->p_key, REG_EXTENDED | REG_NOSUB);
-		if (val) {
-			char errbuf[_POSIX2_LINE_MAX];
-			regerror(val, &p->p_rx, errbuf, sizeof errbuf);
-			syslog(LOG_ERR, "%s:%d: regcomp %s: %s",
-			       conf_file, curp->p_lno, curp->p_key, errbuf);
-			regfree(&p->p_rx);
-			p->p_rxvalid = 0;
-		} else {
-			p->p_rxvalid = 1;
-		}
-		curp = NULL;			/* XXX */
-	} else {
-		p->p_rxvalid = 0;
-	}
-	p->p_lno = lno;
-
-	return (p);
-}
-
-/*
- * Free a path structure
- */
-static void
-pfree(path *p)
-{
-	free(p->p_args);
-	if (p->p_rxvalid) {
-		regfree(&p->p_rx);
-	}
-	free((char *) p->p_argv);
-	free((char *) p);
-}
-
-/*
- * Discard all currently held path structures on q0.
- * and add all the ones on xq.
- */
-static void
-preplace(qelem *q0, qelem *xq)
-{
-	/*
-	 * While the list is not empty,
-	 * take the first element off the list
-	 * and free it.
-	 */
-	while (q0->q_forw != q0) {
-		qelem *q = q0->q_forw;
-		rem_que(q);
-		pfree((path *) q);
-	}
-	while (xq->q_forw != xq) {
-		qelem *q = xq->q_forw;
-		rem_que(q);
-		ins_que(q, q0);
-	}
-}
-
-/*
- * Read the lines from the configuration file and
- * add them to the list of paths.
- */
-static void
-readfp(qelem *q0, FILE *fp)
-{
-	char cline[LINE_MAX];
-	int nread = 0;
-	qelem q;
-
-	/*
-	 * Make a new empty list.
-	 */
-	q.q_forw = q.q_back = &q;
-
-	/*
-	 * Read the lines from the configuration file.
-	 */
-	while (fgets(cline, sizeof(cline), fp)) {
-		path *p = palloc(cline, nread+1);
-		if (p && !pinsert(p, &q))
-			pfree(p);
-		nread++;
-	}
-
-	/*
-	 * If some records were read, then throw
-	 * away the old list and replace with the
-	 * new one.
-	 */
-	if (nread)
-		preplace(q0, &q);
-}
-
-/*
- * Read the configuration file (conf) and replace
- * the existing path list with the new version.
- * If the file is not readable, then no changes take place
- */
-void
-conf_read(qelem *q, char *conf)
-{
-	FILE *fp = fopen(conf, "r");
-	if (fp) {
-		conf_file = conf;		/* XXX */
-		readfp(q, fp);
-		conf_file = NULL;		/* XXX */
-		fclose(fp);
-	} else {
-		syslog(LOG_ERR, "open config file \"%s\": %s", conf, strerror(errno));
-	}
-}
-
-
-char **
-conf_match(qelem *q0, char *key)
-{
-	qelem *q;
-
-	for (q = q0->q_forw; q != q0; q = q->q_forw) {
-		path *p = (path *) q;
-		if (p->p_rxvalid) {
-			if (!regexec(&p->p_rx, key, 0, 0, 0)) {
-				return p->p_argv + 1;
-			}
-		} else {
-			if (strncmp(p->p_key, key, strlen(p->p_key)) == 0)
-				return (p->p_argv+1);
-		}
-	}
-
-	return (0);
-}
diff --git a/sbin/mount_portal/mount_portal.8 b/sbin/mount_portal/mount_portal.8
deleted file mode 100644
index e01ba0d..0000000
--- a/sbin/mount_portal/mount_portal.8
+++ /dev/null
@@ -1,148 +0,0 @@
-.\"
-.\" Copyright (c) 1993, 1994
-.\"	The Regents of the University of California.  All rights reserved.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software donated to Berkeley by
-.\" Jan-Simon Pendry.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in the
-.\"    documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of the University nor the names of its contributors
-.\"    may be used to endorse or promote products derived from this software
-.\"    without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\"	@(#)mount_portal.8	8.3 (Berkeley) 3/27/94
-.\" $FreeBSD: src/sbin/mount_portal/mount_portal.8,v 1.8.2.2 2001/12/20 16:41:47 ru Exp $
-.\"
-.Dd March 27, 1994
-.Dt MOUNT_PORTAL 8
-.Os
-.Sh NAME
-.Nm mount_portal
-.Nd mount the portal daemon
-.Sh SYNOPSIS
-.Nm
-.Op Fl o Ar options
-.Ar /etc/portal.conf
-.Ar mount_point
-.Sh DESCRIPTION
-The
-.Nm
-command attaches an instance of the portal daemon
-to the global filesystem namespace.
-The conventional mount point is
-.Pa /p .
-.\" .PA /dev .
-This command is normally executed by
-.Xr mount 8
-at boot time.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl o
-Options are specified with a
-.Fl o
-flag followed by a comma separated string of options.
-See the
-.Xr mount 8
-man page for possible options and their meanings.
-.El
-.Pp
-The portal daemon provides an
-.Em open
-service.
-Objects opened under the portal mount point are
-dynamically created by the portal daemon according
-to rules specified in the named configuration file.
-Using this mechanism allows descriptors such as sockets
-to be made available in the filesystem namespace.
-.Pp
-The portal daemon works by being passed the full pathname
-of the object being opened.
-The daemon creates an appropriate descriptor according
-to the rules in the configuration file, and then passes the descriptor back
-to the calling process as the result of the open system call.
-.Sh NAMESPACE
-By convention, the portal daemon divides the namespace into sub-namespaces,
-each of which handles objects of a particular type.
-.Pp
-The following sub-namespaces are currently implemented:
-.Pa tcplisten ,
-.Pa tcp
-and
-.Pa fs .
-The
-.Pa tcplisten
-namespace takes a slash separated hostname and port and creates a TCP/IP
-socket bound to the given hostname-port pair.
-The hostname may be
-specified as "ANY" to allow any other host to connect to the socket.
-A
-port number of 0 will dynamically allocate a port, this can be
-discovered by calling
-.Xr getsockname 2
-with the returned file descriptor.
-Privileged ports can only be bound to
-by the super-user.
-The
-.Pa tcp
-namespace takes a hostname and a port (slash separated) and
-creates an open TCP/IP connection.
-The
-.Pa fs
-namespace opens the named file, starting back at the root directory.
-This can be used to provide a controlled escape path from
-a chrooted environment.
-.Sh CONFIGURATION FILE
-The configuration file contains a list of rules.
-Each rule takes one line and consists of two or more
-whitespace separated fields.
-A hash (``#'') character causes the remainder of a line to
-be ignored.  Blank lines are ignored.
-.Pp
-The first field is a pathname prefix to match
-against the requested pathname.
-If a match is found, the second field
-tells the daemon what type of object to create.
-Subsequent fields are passed to the creation function.
-.Bd -literal
-# @(#)portal.conf	5.1 (Berkeley) 7/13/92
-tcplisten/	tcplisten tcplisten/
-tcp/		tcp tcp/
-fs/		file fs/
-.Ed
-.Sh FILES
-.Bl -tag -width /p/* -compact
-.It Pa /p/*
-.El
-.Sh SEE ALSO
-.Xr mount 2 ,
-.Xr unmount 2 ,
-.Xr fstab 5 ,
-.Xr mount 8
-.Sh HISTORY
-The
-.Nm
-utility first appeared in
-.Bx 4.4 .
-.Sh CAVEATS
-This filesystem may not be NFS-exported.
diff --git a/sbin/mount_portal/mount_portal.c b/sbin/mount_portal/mount_portal.c
deleted file mode 100644
index 625463d..0000000
--- a/sbin/mount_portal/mount_portal.c
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Copyright (c) 1992, 1993, 1994
- *	The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software donated to Berkeley by
- * Jan-Simon Pendry.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#) Copyright (c) 1992, 1993, 1994 The Regents of the University of California.  All rights reserved.
- * @(#)mount_portal.c	8.6 (Berkeley) 4/26/95
- * $FreeBSD: src/sbin/mount_portal/mount_portal.c,v 1.16 1999/10/09 11:54:11 phk Exp $
- */
-
-#include <sys/param.h>
-#include <sys/wait.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/stat.h>
-#include <sys/syslog.h>
-#include <sys/mount.h>
-
-#include <err.h>
-#include <errno.h>
-#include <mntopts.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysexits.h>
-#include <unistd.h>
-
-#include "pathnames.h"
-#include "portald.h"
-
-struct mntopt mopts[] = {
-	MOPT_STDOPTS,
-	{ NULL, 0, 0, 0 }
-};
-
-static void usage(void) __dead2;
-
-static sig_atomic_t readcf;	/* Set when SIGHUP received */
-
-static void
-sighup(int sig __unused)
-{
-	readcf ++;
-}
-
-static void
-sigchld(int sig __unused)
-{
-	pid_t pid;
-
-	while ((pid = waitpid((pid_t) -1, NULL, WNOHANG)) > 0)
-		;
-	/* wrtp - waitpid _doesn't_ return 0 when no children! */
-#ifdef notdef
-	if (pid < 0 && errno != ECHILD)
-		syslog(LOG_WARNING, "waitpid: %s", strerror(errno));
-#endif
-}
-
-int
-main(int argc, char **argv)
-{
-	struct portal_args args;
-	struct sockaddr_un un;
-	char *conf;
-	char mountpt[MAXPATHLEN];
-	int mntflags = 0;
-	char tag[32];
-	struct vfsconf vfc;
-	mode_t um;
-
-	qelem q;
-	int rc;
-	int so;
-	int error = 0;
-
-	/*
-	 * Crack command line args
-	 */
-	int ch;
-
-	while ((ch = getopt(argc, argv, "o:")) != -1) {
-		switch (ch) {
-		case 'o':
-			getmntopts(optarg, mopts, &mntflags, 0);
-			break;
-		default:
-			error = 1;
-			break;
-		}
-	}
-
-	if (optind != (argc - 2))
-		error = 1;
-
-	if (error)
-		usage();
-
-	/*
-	 * Get config file and mount point
-	 */
-	conf = argv[optind];
-
-	/* resolve the mountpoint with realpath(3) */
-	checkpath(argv[optind+1], mountpt);
-
-	/*
-	 * Construct the listening socket
-	 */
-	un.sun_family = AF_UNIX;
-	if (sizeof(_PATH_TMPPORTAL) >= sizeof(un.sun_path)) {
-		errx(EX_SOFTWARE, "portal socket name too long");
-	}
-	strcpy(un.sun_path, _PATH_TMPPORTAL);
-	mktemp(un.sun_path);
-	un.sun_len = strlen(un.sun_path);
-
-	so = socket(AF_UNIX, SOCK_STREAM, 0);
-	if (so < 0) {
-		err(EX_OSERR, "socket");
-	}
-	um = umask(077);
-	unlink(un.sun_path);
-	if (bind(so, (struct sockaddr *) &un, sizeof(un)) < 0)
-		err(1, NULL);
-
-	unlink(un.sun_path);
-	umask(um);
-
-	listen(so, 5);
-
-	args.pa_socket = so;
-	sprintf(tag, "portal:%d", getpid());
-	args.pa_config = tag;
-
-	error = getvfsbyname("portal", &vfc);
-	if (error && vfsisloadable("portal")) {
-		if (vfsload("portal"))
-			err(EX_OSERR, "vfsload(portal)");
-		endvfsent();
-		error = getvfsbyname("portal", &vfc);
-	}
-	if (error)
-		errx(EX_OSERR, "portal filesystem is not available");
-
-	rc = mount(vfc.vfc_name, mountpt, mntflags, &args);
-	if (rc < 0)
-		err(1, NULL);
-
-	/*
-	 * Everything is ready to go - now is a good time to fork
-	 */
-#ifndef DEBUG
-	daemon(0, 0);
-#endif
-
-	/*
-	 * Start logging (and change name)
-	 */
-	openlog("portald", LOG_CONS|LOG_PID, LOG_DAEMON);
-
-	q.q_forw = q.q_back = &q;
-	readcf = 1;
-
-	signal(SIGCHLD, sigchld);
-	signal(SIGHUP, sighup);
-
-	/*
-	 * Just loop waiting for new connections and activating them
-	 */
-	for (;;) {
-		struct sockaddr_un un2;
-		socklen_t len2 = sizeof(un2);
-		int so2;
-		pid_t pid;
-		fd_set fdset;
-
-		/*
-		 * Check whether we need to re-read the configuration file
-		 */
-		if (readcf) {
-#ifdef DEBUG
-			printf ("re-reading configuration file\n");
-#endif
-			readcf = 0;
-			conf_read(&q, conf);
-			continue;
-		}
-
-		/*
-		 * Accept a new connection
-		 * Will get EINTR if a signal has arrived, so just
-		 * ignore that error code
-		 */
-		FD_ZERO(&fdset);
-		FD_SET(so, &fdset);
-		rc = select(so+1, &fdset, NULL, NULL, NULL);
-		if (rc < 0) {
-			if (errno == EINTR)
-				continue;
-			syslog(LOG_ERR, "select: %s", strerror(errno));
-			exit(EX_OSERR);
-		}
-		if (rc == 0)
-			break;
-		so2 = accept(so, (struct sockaddr *) &un2, &len2);
-		if (so2 < 0) {
-			/*
-			 * The unmount function does a shutdown on the socket
-			 * which will generated ECONNABORTED on the accept.
-			 */
-			if (errno == ECONNABORTED)
-				break;
-			if (errno != EINTR) {
-				syslog(LOG_ERR, "accept: %s", strerror(errno));
-				exit(EX_OSERR);
-			}
-			continue;
-		}
-
-		/*
-		 * Now fork a new child to deal with the connection
-		 */
-	eagain:;
-		switch (pid = fork()) {
-		case -1:
-			if (errno == EAGAIN) {
-				sleep(1);
-				goto eagain;
-			}
-			syslog(LOG_ERR, "fork: %s", strerror(errno));
-			break;
-		case 0:
-			close(so);
-			activate(&q, so2);
-			exit(0);
-		default:
-			close(so2);
-			break;
-		}
-	}
-	syslog(LOG_INFO, "%s unmounted", mountpt);
-	exit(0);
-}
-
-static void
-usage(void)
-{
-	fprintf(stderr,
-	    "usage: mount_portal [-o options] config mount-point\n");
-	exit(EX_USAGE);
-}
diff --git a/sbin/mount_portal/pathnames.h b/sbin/mount_portal/pathnames.h
deleted file mode 100644
index 9d4ee17..0000000
--- a/sbin/mount_portal/pathnames.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 1992, 1993
- *	The Regents of the University of California.  All rights reserved.
- * All rights reserved.
- *
- * This code is derived from software donated to Berkeley by
- * Jan-Simon Pendry.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)pathnames.h	8.1 (Berkeley) 6/5/93
- *
- * $FreeBSD: src/sbin/mount_portal/pathnames.h,v 1.5 2000/01/10 09:33:37 kris Exp $
- * $DragonFly: src/sbin/mount_portal/pathnames.h,v 1.2 2003/06/17 04:27:33 dillon Exp $
- */
-
-#include <paths.h>
-
-#define	_PATH_TMPPORTAL	 "/tmp/portalXXXXXXXXXX"	/* Scratch socket name */
diff --git a/sbin/mount_portal/portal.conf b/sbin/mount_portal/portal.conf
deleted file mode 100644
index 6677780..0000000
--- a/sbin/mount_portal/portal.conf
+++ /dev/null
@@ -1,8 +0,0 @@
-# @(#)portal.conf	8.1 (Berkeley) 6/5/93
-# $FreeBSD: src/sbin/mount_portal/portal.conf,v 1.4 1999/08/28 00:13:37 peter Exp $
-# $DragonFly: src/sbin/mount_portal/portal.conf,v 1.2 2003/06/17 04:27:33 dillon Exp $
-tcplisten/	tcplisten tcplisten/
-tcp/		tcp tcp/
-fs/		file fs/
-pipe/		pipe
-foo/		exec ./bar bar baz
diff --git a/sbin/mount_portal/portald.h b/sbin/mount_portal/portald.h
deleted file mode 100644
index af6d48f..0000000
--- a/sbin/mount_portal/portald.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 1992, 1993
- *	The Regents of the University of California.  All rights reserved.
- * All rights reserved.
- *
- * This code is derived from software donated to Berkeley by
- * Jan-Simon Pendry.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)portald.h	8.1 (Berkeley) 6/5/93
- *
- * $FreeBSD: src/sbin/mount_portal/portald.h,v 1.5 1999/08/28 00:13:37 peter Exp $
- * $DragonFly: src/sbin/mount_portal/portald.h,v 1.5 2003/11/03 19:51:05 eirikn Exp $
- */
-
-#include <sys/cdefs.h>
-#include <vfs/portal/portal.h>
-
-/*
- * Meta-chars in an RE.  Paths in the config file containing
- * any of these characters will be matched using regexec, other
- * paths will be prefix-matched.
- */
-#define RE_CHARS ".|()[]*+?\\^$"
-
-typedef struct qelem qelem;
-
-struct qelem {
-	qelem *q_forw;
-	qelem *q_back;
-};
-
-typedef struct provider provider;
-struct provider {
-	const char *pr_match;
-	int (*pr_func)(struct portal_cred *,
-				char *key, char **v, int so, int *fdp);
-};
-extern provider providers[];
-
-/*
- * Portal providers
- */
-extern int portal_exec(struct portal_cred *,
-				char *key, char **v, int so, int *fdp);
-extern int portal_file(struct portal_cred *,
-				char *key, char **v, int so, int *fdp);
-extern int portal_tcp(struct portal_cred *,
-				char *key, char **v, int so, int *fdp);
-extern int portal_tcplisten(struct portal_cred *,
-				char *key, char **v, int so, int *fdp);
-
-/*
- * Global functions
- */
-extern void activate(qelem *q, int so);
-extern char **conf_match(qelem *q, char *key);
-extern void conf_read(qelem *q, char *conf);
diff --git a/sbin/mount_portal/pt_conf.c b/sbin/mount_portal/pt_conf.c
deleted file mode 100644
index b59698d..0000000
--- a/sbin/mount_portal/pt_conf.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 1992, 1993
- *	The Regents of the University of California.  All rights reserved.
- * All rights reserved.
- *
- * This code is derived from software donated to Berkeley by
- * Jan-Simon Pendry.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)pt_conf.c	8.1 (Berkeley) 6/5/93
- *
- * $FreeBSD: src/sbin/mount_portal/pt_conf.c,v 1.6 1999/08/28 00:13:37 peter Exp $
- * $DragonFly: src/sbin/mount_portal/pt_conf.c,v 1.2 2003/06/17 04:27:33 dillon Exp $
- */
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include "portald.h"
-
-provider providers[] = {
-	{ "exec",	portal_exec },
-	{ "file",	portal_file },
-	{ "tcp",	portal_tcp },
-	{ "tcplisten",	portal_tcplisten },
-	{ 0, 0 }
-};
diff --git a/sbin/mount_portal/pt_exec.c b/sbin/mount_portal/pt_exec.c
deleted file mode 100644
index e12750d..0000000
--- a/sbin/mount_portal/pt_exec.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 1992, 1993
- *	The Regents of the University of California.  All rights reserved.
- * All rights reserved.
- *
- * This code is derived from software donated to Berkeley by
- * Jan-Simon Pendry.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)pt_exec.c	8.1 (Berkeley) 6/5/93
- *
- * $FreeBSD: src/sbin/mount_portal/pt_exec.c,v 1.5 1999/08/28 00:13:37 peter Exp $
- * $DragonFly: src/sbin/mount_portal/pt_exec.c,v 1.4 2005/11/06 12:36:40 swildner Exp $
- */
-
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/param.h>
-
-#include "portald.h"
-
-int
-portal_exec(struct portal_cred *pcr __unused, char *key __unused,
-    char **v __unused, int so __unused, int *fdp __unused)
-{
-	return (ENOEXEC);
-}
-
diff --git a/sbin/mount_portal/pt_file.c b/sbin/mount_portal/pt_file.c
deleted file mode 100644
index 5aaa0d6..0000000
--- a/sbin/mount_portal/pt_file.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 1992, 1993
- *	The Regents of the University of California.  All rights reserved.
- * All rights reserved.
- *
- * This code is derived from software donated to Berkeley by
- * Jan-Simon Pendry.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)pt_file.c	8.3 (Berkeley) 7/3/94
- *
- * $FreeBSD: src/sbin/mount_portal/pt_file.c,v 1.8 1999/08/28 00:13:38 peter Exp $
- * $DragonFly: src/sbin/mount_portal/pt_file.c,v 1.5 2005/11/06 12:36:40 swildner Exp $
- */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/syslog.h>
-
-#include "portald.h"
-
-int
-portal_file(struct portal_cred *pcr, char *key, char **v, int so __unused,
-    int *fdp)
-{
-	int fd;
-	char pbuf[MAXPATHLEN];
-	int error;
-	gid_t gidset[NGROUPS];
-	int i;
-
-	pbuf[0] = '/';
-	strcpy(pbuf+1, key + (v[1] ? strlen(v[1]) : 0));
-
-#ifdef DEBUG
-	printf("path = %s, uid = %d, gid = %d\n", pbuf, pcr->pcr_uid, pcr->pcr_groups[0]);
-	printf ("fflag = %x, oflag = %x\n", pcr->pcr_flag, (pcr->pcr_flag)-1);
-#endif
-
-	for (i = 0; i < pcr->pcr_ngroups; i++)
-		gidset[i] = pcr->pcr_groups[i];
-
-	if (setgroups(pcr->pcr_ngroups, gidset) < 0)
-		return (errno);
-
-	if (seteuid(pcr->pcr_uid) < 0)
-		return (errno);
-
-	/* dmb convert kernel flags to oflags, see <fcntl.h> */
-	fd = open(pbuf, (pcr->pcr_flag)-1, 0777);
-	if (fd < 0)
-		error = errno;
-	else
-		error = 0;
-
-	if (seteuid((uid_t) 0) < 0) {	/* XXX - should reset gidset too */
-		error = errno;
-		syslog(LOG_ERR, "setcred: %s", strerror(error));
-		if (fd >= 0) {
-			close(fd);
-			fd = -1;
-		}
-	}
-
-	if (error == 0)
-		*fdp = fd;
-
-#ifdef DEBUG
-	fprintf(stderr, "pt_file returns *fdp = %d, error = %d\n", *fdp, error);
-#endif
-
-	return (error);
-}
diff --git a/sbin/mount_portal/pt_tcp.c b/sbin/mount_portal/pt_tcp.c
deleted file mode 100644
index 48c6dcd..0000000
--- a/sbin/mount_portal/pt_tcp.c
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (c) 1992, 1993, 1994
- *	The Regents of the University of California.  All rights reserved.
- * All rights reserved.
- *
- * This code is derived from software donated to Berkeley by
- * Jan-Simon Pendry.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)pt_tcp.c	8.5 (Berkeley) 4/28/95
- *
- * $FreeBSD: src/sbin/mount_portal/pt_tcp.c,v 1.9 1999/08/28 00:13:38 peter Exp $
- */
-
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/syslog.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-
-#include "portald.h"
-
-/*
- * Key will be tcp/host/port[/"priv"]
- * Create a TCP socket connected to the
- * requested host and port.
- * Some trailing suffix values have special meanings.
- * An unrecognized suffix is an error.
- */
-int
-portal_tcp(struct portal_cred *pcr, char *key, char **v, int kso __unused,
-    int *fdp)
-{
-	char host[MAXHOSTNAMELEN];
-	char port[MAXHOSTNAMELEN];
-	char *p = key + (v[1] ? strlen(v[1]) : 0);
-	char *q;
-	struct hostent *hp;
-	struct servent *sp;
-	struct in_addr **ipp;
-	struct in_addr *ip[2];
-	struct in_addr ina;
-	u_short s_port;
-	int priv = 0;
-	struct sockaddr_in sain;
-
-	q = strchr(p, '/');
-	if (q == NULL || (size_t)(q - p) >= sizeof(host))
-		return (EINVAL);
-	*q = '\0';
-	strcpy(host, p);
-	p = q + 1;
-
-	q = strchr(p, '/');
-	if (q)
-		*q = '\0';
-	if (strlen(p) >= sizeof(port))
-		return (EINVAL);
-	strcpy(port, p);
-	if (q) {
-		p = q + 1;
-		if (strcmp(p, "priv") == 0) {
-			if (pcr->pcr_uid == 0)
-				priv = 1;
-			else
-				return (EPERM);
-		} else {
-			return (EINVAL);
-		}
-	}
-
-	hp = gethostbyname(host);
-	if (hp != NULL) {
-		ipp = (struct in_addr **) hp->h_addr_list;
-	} else {
-		ina.s_addr = inet_addr(host);
-		if (ina.s_addr == INADDR_NONE)
-			return (EINVAL);
-		ip[0] = &ina;
-		ip[1] = NULL;
-		ipp = ip;
-	}
-#ifdef DEBUG
-	printf ("inet address for %s is %s\n", host, inet_ntoa(*ipp[0]));
-#endif
-
-	sp = getservbyname(port, "tcp");
-	if (sp != NULL) {
-		s_port = (u_short)sp->s_port;
-	} else {
-		s_port = strtoul(port, &p, 0);
-		if (s_port == 0 || *p != '\0')
-			return (EINVAL);
-		s_port = htons(s_port);
-	}
-#ifdef DEBUG
-	printf ("port number for %s is %d\n", port, (int)ntohs(s_port));
-#endif
-
-	memset(&sain, 0, sizeof(sain));
-	sain.sin_len = sizeof(sain);
-	sain.sin_family = AF_INET;
-	sain.sin_port = s_port;
-
-	while (ipp[0]) {
-		int so;
-
-		if (priv)
-			so = rresvport(NULL);
-		else
-			so = socket(AF_INET, SOCK_STREAM, 0);
-		if (so < 0) {
-			syslog(LOG_ERR, "socket: %m");
-			return (errno);
-		}
-
-		sain.sin_addr = *ipp[0];
-		if (connect(so, (struct sockaddr *) &sain, sizeof(sain)) == 0) {
-			*fdp = so;
-			return (0);
-		}
-		close(so);
-
-		ipp++;
-	}
-
-	return (errno);
-}
diff --git a/sbin/mount_portal/pt_tcplisten.c b/sbin/mount_portal/pt_tcplisten.c
deleted file mode 100644
index e039be9..0000000
--- a/sbin/mount_portal/pt_tcplisten.c
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (c) 1992, 1993
- *  The Regents of the University of California.  All rights reserved.
- * All rights reserved.
- *
- * This code is derived from software donated to Berkeley by
- * Jan-Simon Pendry.
- *
- * Modified by Duncan Barclay.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *  @(#)pt_tcp.c  8.3 (Berkeley) 3/27/94
- *
- * pt_tcp.c,v 1.1.1.1 1994/05/26 06:34:34 rgrimes Exp
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/syslog.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-
-#include "portald.h"
-
-/*
- * Key will be tcplisten/host/port
- *
- * Create a TCP socket bound to the requested host and port.
- * If the host is "ANY" the receving address will be set to INADDR_ANY.
- * If the port is 0 the caller must find out the returned port number
- * using a call to getsockname.
- *
- * XXX!  The owner of the socket will be root rather then the user.  This
- * 	 may cause remote auth (identd) to return unexpected results.
- *
- */
-int
-portal_tcplisten(struct portal_cred *pcr, char *key, char **v,
-    int kso __unused, int *fdp)
-{
-       char host[MAXHOSTNAMELEN];
-       char port[MAXHOSTNAMELEN];
-       char *p = key + (v[1] ? strlen(v[1]) : 0);
-       char *q;
-       struct hostent *hp;
-       struct servent *sp;
-       struct in_addr **ipp = NULL;
-       struct in_addr *ip[2];
-       struct in_addr ina;
-       u_short s_port;
-       int any = 0;
-       struct sockaddr_in sain;
-
-       q = strchr(p, '/');
-       if (q == NULL || (size_t)(q - p) >= sizeof(host))
-               return (EINVAL);
-       *q = '\0';
-       snprintf(host, sizeof(host), "%s", p);
-       p = q + 1;
-
-       q = strchr(p, '/');
-       if (q)
-               *q = '\0';
-       if (strlen(p) >= sizeof(port))
-               return (EINVAL);
-       snprintf(port, sizeof(port), "%s", p);
-
-       if (strcmp(host, "ANY") == 0) {
-               any = 1;
-       } else {
-               hp = gethostbyname(host);
-               if (hp != NULL) {
-                       ipp = (struct in_addr **) hp->h_addr_list;
-               } else {
-                       ina.s_addr = inet_addr(host);
-                       if (ina.s_addr == INADDR_NONE)
-                               return (EINVAL);
-                       ip[0] = &ina;
-                       ip[1] = NULL;
-                       ipp = ip;
-               }
-       }
-#ifdef DEBUG
-       if (any)
-               printf("INADDR_ANY to be used for hostname\n");
-       else
-               printf("inet address for %s is %s\n", host, inet_ntoa(*ipp[0]));
-#endif
-
-       sp = getservbyname(port, "tcp");
-       if (sp != NULL) {
-               s_port = (u_short) sp->s_port;
-        } else {
-               s_port = strtoul(port, &p, 0);
-               if (*p != '\0')
-                       return (EINVAL);
-               s_port = htons(s_port);
-       }
-       if ((ntohs(s_port) != 0) &&
-           (ntohs(s_port) <= IPPORT_RESERVED) &&
-           (pcr->pcr_uid != 0))
-               return (EPERM);
-#ifdef DEBUG
-       printf("port number for %s is %d\n", port, ntohs(s_port));
-#endif
-
-       memset(&sain, 0, sizeof(sain));
-       sain.sin_len = sizeof(sain);
-       sain.sin_family = AF_INET;
-       sain.sin_port = s_port;
-
-       if (any) {
-               int so;
-               int sock;
-
-               so = socket(AF_INET, SOCK_STREAM, 0);
-               if (so < 0) {
-                       syslog(LOG_ERR, "socket: %m");
-                       return (errno);
-               }
-
-               sain.sin_addr.s_addr = INADDR_ANY;
-               if (bind(so, (struct sockaddr *) &sain, sizeof(sain)) == 0) {
-                       listen(so, 1);
-                       if ((sock = accept(so, NULL, NULL)) == -1) {
-                               syslog(LOG_ERR, "accept: %m");
-                               close(so);
-                               return (errno);
-                       }
-                       *fdp = sock;
-                       close(so);
-                       return (0);
-               }
-               syslog(LOG_ERR, "bind: %m");
-               close(so);
-               return (errno);
-       }
-
-       while (ipp[0]) {
-               int so;
-               int sock;
-
-               so = socket(AF_INET, SOCK_STREAM, 0);
-               if (so < 0) {
-                       syslog(LOG_ERR, "socket: %m");
-                       return (errno);
-               }
-
-               sain.sin_addr = *ipp[0];
-               if (bind(so, (struct sockaddr *) &sain, sizeof(sain)) == 0) {
-                       listen(so, 1);
-                       if ((sock = accept(so, NULL, NULL)) == -1) {
-                               syslog(LOG_ERR, "accept: %m");
-                               close(so);
-                               return (errno);
-                       }
-                       *fdp = sock;
-                       close(so);
-                       return (0);
-               }
-               close(so);
-
-               ipp++;
-       }
-
-       syslog(LOG_ERR, "bind: %m");
-       return (errno);
-
-}
diff --git a/sbin/mount_ufs/mount_ufs.8 b/sbin/mount_ufs/mount_ufs.8
index f47676c..b0bc398 100644
--- a/sbin/mount_ufs/mount_ufs.8
+++ b/sbin/mount_ufs/mount_ufs.8
@@ -408,7 +408,6 @@ have permission to load the module.
 .Xr mount_nfs 8 ,
 .Xr mount_ntfs 8 ,
 .Xr mount_null 8 ,
-.Xr mount_portal 8 ,
 .Xr mount_procfs 8 ,
 .Xr mount_smbfs 8 ,
 .Xr mount_std 8 ,
diff --git a/share/examples/portal/README b/share/examples/portal/README
deleted file mode 100644
index f3a2690..0000000
--- a/share/examples/portal/README
+++ /dev/null
@@ -1,64 +0,0 @@
-
-This contains a couple of examples for using the portal filing system.
-
-The portal file system provides a way of obtaining a file descriptor
-to a filesystem object (i.e. something that is accessed by open(2),
-pipe(2), socket(2) or socketpair(2)) via the filesystem namespace.
-At present the only file descriptor supported are TCP sockets and
-files.
-
-NOTE!!!! The portal file system is experimental in nature and should
-not be considered secure, use with caution.
-
-First off mount the filesystem using something like:
-
-# mount_portal /usr/share/examples/portal/portal.conf /p
-
-Then you should be able to do things like
-# cat /p/tcp/localhost/daytime
-Sun Nov 22 17:50:09 1998
-(assuming inetd is running the daytime service, by default it is off)
-
-Welcome to FreeBSD!
-
-# mkdir -p /tmp/root
-# cd /tmp/root
-# mkdir bin p
-# cp /bin/sh /bin/cat bin
-# mount_portal /usr/share/examples/portal/portal.conf /tmp/root/p
-# chroot /tmp/root
-# pwd
-/
-# echo *
-bin p
-# cat /etc/motd
-cat: /etc/motd: No such file or directory
-# cat /p/fs/etc/motd
-FreeBSD 2.2.6-RELEASE (COMPUTER) #0: Sat Aug 22 17:11:37 BST 1998
-
-Welcome to FreeBSD!
-
-Finally, a very simple example of the listening server is available,
-fire up two xterms. In the first
-
-xterm-1$ cat /p/tcplisten/ANY/6666
-(the ANY is a wildcard just like using INADDR_ANY, any resolvable host
-can be used).
-
-In the second xterm
-xterm-2$ echo "hello there" >/p/tcp/localhost/6666
-
-You should see the "hello there" string appear on the first terminal.
-
-Unprivilged users can't create servers on privalged ports.
-xterm-1$ cat /p/tcplisten/ANY/666
-cat: /p/tcplisten/ANY/666: Operation not permitted
-
-but root can
-xterm-1# cat /p/tcplisten/ANY/666
-
-In the second
-xterm-2$ echo "hello there" >/p/tcp/localhost/666
-should produce the expected response.
-
-You can also swap the client/server read and write commands etc.
diff --git a/share/examples/portal/portal.conf b/share/examples/portal/portal.conf
deleted file mode 100644
index aa7e282..0000000
--- a/share/examples/portal/portal.conf
+++ /dev/null
@@ -1,3 +0,0 @@
-tcp/           tcp tcp/
-tcplisten/     tcplisten tcplisten/
-fs/            file fs/
diff --git a/sys/boot/dloader/loader-bootp.conf b/sys/boot/dloader/loader-bootp.conf
index 7322230..07e0f5b 100644
--- a/sys/boot/dloader/loader-bootp.conf
+++ b/sys/boot/dloader/loader-bootp.conf
@@ -108,7 +108,6 @@ msdos_load="NO"			# FAT-12/16/32
 nfs_load="NO"			# NFS
 ntfs_load="NO"			# NTFS
 null_load="NO"			# Null filesystem
-portal_load="NO"		# Portal filesystem
 procfs_load="NO"		# Process filesystem
 smbfs_load="NO"			# SMB/CIFS
 udf_load="NO"			# UDF filesystem
diff --git a/sys/boot/dloader/loader.conf b/sys/boot/dloader/loader.conf
index d85319f..c3cbcaa 100644
--- a/sys/boot/dloader/loader.conf
+++ b/sys/boot/dloader/loader.conf
@@ -116,7 +116,6 @@ msdos_load="NO"			# FAT-12/16/32
 nfs_load="NO"			# NFS
 ntfs_load="NO"			# NTFS
 null_load="NO"			# Null filesystem
-portal_load="NO"		# Portal filesystem
 procfs_load="NO"		# Process filesystem
 smbfs_load="NO"			# SMB/CIFS
 udf_load="NO"			# UDF filesystem
diff --git a/sys/conf/files b/sys/conf/files
index 61ef4a3..5de4e1f 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -1274,8 +1274,6 @@ vfs/deadfs/dead_vnops.c	standard
 vfs/fifofs/fifo_vnops.c	standard
 vfs/nullfs/null_vfsops.c	optional nullfs
 vfs/nullfs/null_vnops.c	optional nullfs
-vfs/portal/portal_vfsops.c	optional portal
-vfs/portal/portal_vnops.c	optional portal
 vfs/procfs/procfs_ctl.c	optional procfs
 vfs/procfs/procfs_dbregs.c	standard
 vfs/procfs/procfs_fpregs.c	standard
diff --git a/sys/conf/options b/sys/conf/options
index e2cffe0..9cf5370 100644
--- a/sys/conf/options
+++ b/sys/conf/options
@@ -127,7 +127,6 @@ MFS		opt_dontuse.h
 MSDOSFS		opt_dontuse.h
 NTFS		opt_dontuse.h
 NULLFS		opt_dontuse.h
-PORTAL		opt_dontuse.h
 PROCFS		opt_dontuse.h
 PUFFS		opt_dontuse.h
 SMBFS		opt_dontuse.h
diff --git a/sys/config/LINT64 b/sys/config/LINT64
index 3c3582e..180e2d5 100644
--- a/sys/config/LINT64
+++ b/sys/config/LINT64
@@ -480,11 +480,6 @@ options		IFPOLL_ENABLE
 # cannot currently be demand-loaded.)  Some people still prefer
 # to statically compile other filesystems as well.
 #
-# NB: The PORTAL filesystem is known to be
-# buggy, and WILL panic your system if you attempt to do anything with
-# it.  It is included here as an incentive for some enterprising
-# soul to sit down and fix it.
-#
 
 # One of these is mandatory:
 options 	FFS			#Fast filesystem
@@ -500,7 +495,6 @@ options 	HPFS			#OS/2 File system
 options 	MSDOSFS			#MS DOS filesystem
 options 	NTFS			#NT filesystem
 options 	NULLFS			#NULL filesystem
-options 	PORTAL			#Portal filesystem
 options 	PROCFS			#Process filesystem
 options		PUFFS			#Userspace file systems (e.g. ntfs-3g & sshfs)
 options 	SMBFS			#SMB/CIFS filesystem
diff --git a/sys/sys/vfscache.h b/sys/sys/vfscache.h
index 42d294c..c0ec537 100644
--- a/sys/sys/vfscache.h
+++ b/sys/sys/vfscache.h
@@ -105,7 +105,7 @@ enum vtype	{ VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VBAD,
  */
 enum vtagtype	{
 	VT_NON, VT_UFS, VT_NFS, VT_MFS, VT_PC, VT_LFS, VT_LOFS, VT_UNUSED7,
-	VT_PORTAL, VT_NULL, VT_UNUSED10, VT_KERNFS, VT_PROCFS, VT_AFS,
+	VT_UNUSED8, VT_NULL, VT_UNUSED10, VT_KERNFS, VT_PROCFS, VT_AFS,
 	VT_ISOFS, VT_UNUSED15, VT_MSDOSFS, VT_TFS, VT_VFS, VT_CODA, VT_NTFS,
 	VT_HPFS, VT_SMBFS, VT_UDF, VT_EXT2FS, VT_SYNTH,
 	VT_HAMMER, VT_HAMMER2, VT_DEVFS, VT_TMPFS, VT_AUTOFS
diff --git a/sys/vfs/Makefile b/sys/vfs/Makefile
index 882f933..9438062 100644
--- a/sys/vfs/Makefile
+++ b/sys/vfs/Makefile
@@ -1,7 +1,7 @@
 # Makefile for vfs modules
 #
 
-SUBDIR=fifofs msdosfs portal nfs procfs puffs \
+SUBDIR=fifofs msdosfs nfs procfs puffs \
 	hpfs ntfs smbfs isofs mfs udf \
 	nullfs hammer tmpfs autofs
 
diff --git a/sys/vfs/portal/Makefile b/sys/vfs/portal/Makefile
deleted file mode 100644
index 08a8a3b..0000000
--- a/sys/vfs/portal/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# $FreeBSD: src/sys/modules/portal/Makefile,v 1.7 1999/12/12 20:34:09 peter Exp $
-# $DragonFly: src/sys/vfs/portal/Makefile,v 1.4 2004/08/13 17:51:12 dillon Exp $
-
-KMOD=	portal
-SRCS=	portal_vfsops.c portal_vnops.c
-
-.include <bsd.kmod.mk>
diff --git a/sys/vfs/portal/portal.h b/sys/vfs/portal/portal.h
deleted file mode 100644
index 7d6508a..0000000
--- a/sys/vfs/portal/portal.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 1992, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software donated to Berkeley by
- * Jan-Simon Pendry.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)portal.h	8.4 (Berkeley) 1/21/94
- *
- * $FreeBSD: src/sys/miscfs/portal/portal.h,v 1.7 1999/12/29 04:54:45 peter Exp $
- * $DragonFly: src/sys/vfs/portal/portal.h,v 1.4 2004/08/17 18:57:35 dillon Exp $
- */
-
-struct portal_args {
-	char		*pa_config;	/* Config file */
-	int		pa_socket;	/* Socket to server */
-};
-
-struct portal_cred {
-	int		pcr_flag;		/* File open mode */
-	uid_t		pcr_uid;		/* From ucred */
-	short		pcr_ngroups;		/* From ucred */
-	gid_t		pcr_groups[NGROUPS];	/* From ucred */
-};
-
-#ifdef _KERNEL
-struct portalmount {
-	struct vnode	*pm_root;	/* Root node */
-	struct file	*pm_server;	/* Held reference to server socket */
-};
-
-struct portalnode {
-	int		pt_size;	/* Length of Arg */
-	char		*pt_arg;	/* Arg to send to server */
-	int		pt_fileid;	/* cookie */
-};
-
-#define VFSTOPORTAL(mp)	((struct portalmount *)((mp)->mnt_data))
-#define	VTOPORTAL(vp) ((struct portalnode *)(vp)->v_data)
-
-#define PORTAL_ROOTFILEID	2
-
-#endif /* _KERNEL */
diff --git a/sys/vfs/portal/portal_vfsops.c b/sys/vfs/portal/portal_vfsops.c
deleted file mode 100644
index 73618a9..0000000
--- a/sys/vfs/portal/portal_vfsops.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright (c) 1992, 1993, 1995
- *	The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software donated to Berkeley by
- * Jan-Simon Pendry.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)portal_vfsops.c	8.11 (Berkeley) 5/14/95
- *
- * $FreeBSD: src/sys/miscfs/portal/portal_vfsops.c,v 1.26.2.2 2001/07/26 20:37:16 iedowse Exp $
- */
-
-/*
- * Portal Filesystem
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/proc.h>
-#include <sys/filedesc.h>
-#include <sys/file.h>
-#include <sys/vnode.h>
-#include <sys/mount.h>
-#include <sys/malloc.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/protosw.h>
-#include <sys/domain.h>
-#include "portal.h"
-
-extern struct vop_ops portal_vnode_vops;
-
-static MALLOC_DEFINE(M_PORTALFSMNT, "PORTAL mount", "PORTAL mount structure");
-
-static int	portal_mount (struct mount *mp, char *path, caddr_t data,
-				  struct ucred *cred);
-static int	portal_unmount (struct mount *mp, int mntflags);
-static int	portal_root (struct mount *mp, struct vnode **vpp);
-static int	portal_statfs (struct mount *mp, struct statfs *sbp,
-				struct ucred *);
-
-/*
- * Mount the per-process file descriptors (/dev/fd)
- */
-static int
-portal_mount(struct mount *mp, char *path, caddr_t data, struct ucred *cred)
-{
-	struct file *fp;
-	struct portal_args args;
-	struct portalmount *fmp;
-	struct socket *so;
-	struct vnode *rvp;
-	struct portalnode *pn;
-	size_t size;
-	int error;
-
-	/*
-	 * Update is a no-op
-	 */
-	if (mp->mnt_flag & MNT_UPDATE)
-		return (EOPNOTSUPP);
-
-	error = copyin(data, (caddr_t) &args, sizeof(struct portal_args));
-	if (error)
-		return (error);
-
-	KKASSERT(curproc != NULL);
-	error = holdsock(curproc->p_fd, args.pa_socket, &fp);
-	if (error)
-		return (error);
-	so = (struct socket *) fp->f_data;
-	if (so->so_proto->pr_domain->dom_family != AF_UNIX) {
-		fdrop(fp);
-		return (ESOCKTNOSUPPORT);
-	}
-
-	pn = kmalloc(sizeof(struct portalnode), M_TEMP, M_WAITOK);
-
-	fmp = kmalloc(sizeof(struct portalmount), M_PORTALFSMNT, M_WAITOK);	/* XXX */
-
-	 
-	vfs_add_vnodeops(mp, &portal_vnode_vops, &mp->mnt_vn_norm_ops);
-
-	error = getnewvnode(VT_PORTAL, mp, &rvp, 0, 0);
-	if (error) {
-		kfree(fmp, M_PORTALFSMNT);
-		kfree(pn, M_TEMP);
-		fdrop(fp);
-		return (error);
-	}
-
-	rvp->v_data = pn;
-	rvp->v_type = VDIR;
-	vsetflags(rvp, VROOT);
-	VTOPORTAL(rvp)->pt_arg = 0;
-	VTOPORTAL(rvp)->pt_size = 0;
-	VTOPORTAL(rvp)->pt_fileid = PORTAL_ROOTFILEID;
-	fmp->pm_root = rvp;
-	fmp->pm_server = fp;
-	fhold(fp);
-
-	mp->mnt_flag |= MNT_LOCAL;
-	mp->mnt_data = (qaddr_t) fmp;
-	vfs_getnewfsid(mp);
-
-	(void)copyinstr(args.pa_config,
-	    mp->mnt_stat.f_mntfromname, MNAMELEN - 1, &size);
-	bzero(mp->mnt_stat.f_mntfromname + size, MNAMELEN - size);
-
-#ifdef notdef
-	bzero(mp->mnt_stat.f_mntfromname, MNAMELEN);
-	bcopy("portal", mp->mnt_stat.f_mntfromname, sizeof("portal"));
-#endif
-	vx_unlock(rvp);
-
-	(void)portal_statfs(mp, &mp->mnt_stat, cred);
-	fdrop(fp);
-	return (0);
-}
-
-static int
-portal_unmount(struct mount *mp, int mntflags)
-{
-	int error, flags = 0;
-
-
-	if (mntflags & MNT_FORCE)
-		flags |= FORCECLOSE;
-
-	/*
-	 * Clear out buffer cache.  I don't think we
-	 * ever get anything cached at this level at the
-	 * moment, but who knows...
-	 */
-#ifdef notyet
-	mntflushbuf(mp, 0);
-	if (mntinvalbuf(mp, 1))
-		return (EBUSY);
-#endif
-	/* There is 1 extra root vnode reference (pm_root). */
-	error = vflush(mp, 1, flags);
-	if (error)
-		return (error);
-
-	/*
-	 * Shutdown the socket.  This will cause the select in the
-	 * daemon to wake up, and then the accept will get ECONNABORTED
-	 * which it interprets as a request to go and bury itself.
-	 */
-	soshutdown((struct socket *) VFSTOPORTAL(mp)->pm_server->f_data,
-		SHUT_RDWR);
-	/*
-	 * Discard reference to underlying file.  Must call closef because
-	 * this may be the last reference.
-	 */
-	closef(VFSTOPORTAL(mp)->pm_server, NULL);
-	/*
-	 * Finally, throw away the portalmount structure
-	 */
-	kfree(mp->mnt_data, M_PORTALFSMNT);	/* XXX */
-	mp->mnt_data = 0;
-	return (0);
-}
-
-static int
-portal_root(struct mount *mp, struct vnode **vpp)
-{
-	struct vnode *vp;
-	int error;
-
-	/*
-	 * Return locked reference to root.
-	 */
-	vp = VFSTOPORTAL(mp)->pm_root;
-	error = vget(vp, LK_EXCLUSIVE | LK_RETRY);
-	if (error == 0)
-		*vpp = vp;
-	return (error);
-}
-
-static int
-portal_statfs(struct mount *mp, struct statfs *sbp, struct ucred *cred)
-{
-	sbp->f_flags = 0;
-	sbp->f_bsize = DEV_BSIZE;
-	sbp->f_iosize = DEV_BSIZE;
-	sbp->f_blocks = 2;		/* 1K to keep df happy */
-	sbp->f_bfree = 0;
-	sbp->f_bavail = 0;
-	sbp->f_files = 1;		/* Allow for "." */
-	sbp->f_ffree = 0;		/* See comments above */
-	if (sbp != &mp->mnt_stat) {
-		sbp->f_type = mp->mnt_vfc->vfc_typenum;
-		bcopy(&mp->mnt_stat.f_fsid, &sbp->f_fsid, sizeof(sbp->f_fsid));
-		bcopy(mp->mnt_stat.f_mntfromname, sbp->f_mntfromname, MNAMELEN);
-	}
-	return (0);
-}
-
-static struct vfsops portal_vfsops = {
-	.vfs_mount =    	portal_mount,
-	.vfs_unmount =  	portal_unmount,
-	.vfs_root =     	portal_root,
-	.vfs_statfs =   	portal_statfs,
-};
-
-VFS_SET(portal_vfsops, portal, VFCF_SYNTHETIC);
-MODULE_VERSION(portal, 1);
diff --git a/sys/vfs/portal/portal_vnops.c b/sys/vfs/portal/portal_vnops.c
deleted file mode 100644
index 1ab16c5..0000000
--- a/sys/vfs/portal/portal_vnops.c
+++ /dev/null
@@ -1,580 +0,0 @@
-/*
- * Copyright (c) 1992, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software donated to Berkeley by
- * Jan-Simon Pendry.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)portal_vnops.c	8.14 (Berkeley) 5/21/95
- *
- * $FreeBSD: src/sys/miscfs/portal/portal_vnops.c,v 1.38 1999/12/21 06:29:00 chris Exp $
- */
-
-/*
- * Portal Filesystem
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/sysproto.h>
-#include <sys/kernel.h>
-#include <sys/time.h>
-#include <sys/proc.h>
-#include <sys/filedesc.h>
-#include <sys/vnode.h>
-#include <sys/fcntl.h>
-#include <sys/file.h>
-#include <sys/stat.h>
-#include <sys/mount.h>
-#include <sys/malloc.h>
-#include <sys/namei.h>
-#include <sys/mbuf.h>
-#include <sys/resourcevar.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/un.h>
-#include <sys/unpcb.h>
-#include "portal.h"
-
-#include <sys/thread2.h>
-
-static int portal_fileid = PORTAL_ROOTFILEID+1;
-
-static int	portal_badop (void);
-static void	portal_closefd (struct thread *td, int fd);
-static int	portal_connect (struct socket *so, struct socket *so2);
-static int	portal_getattr (struct vop_getattr_args *ap);
-static int	portal_inactive (struct vop_inactive_args *ap);
-static int	portal_lookup (struct vop_old_lookup_args *ap);
-static int	portal_open (struct vop_open_args *ap);
-static int	portal_print (struct vop_print_args *ap);
-static int	portal_readdir (struct vop_readdir_args *ap);
-static int	portal_reclaim (struct vop_reclaim_args *ap);
-static int	portal_setattr (struct vop_setattr_args *ap);
-
-static void
-portal_closefd(struct thread *td, int fd)
-{
-	int error;
-	struct close_args ua;
-
-	ua.fd = fd;
-	error = sys_close(&ua);
-	/*
-	 * We should never get an error, and there isn't anything
-	 * we could do if we got one, so just print a message.
-	 */
-	if (error)
-		kprintf("portal_closefd: error = %d\n", error);
-}
-
-/*
- * vp is the current namei directory
- * cnp is the name to locate in that directory...
- *
- * portal_lookup(struct vnode *a_dvp, struct vnode **a_vpp,
- *		 struct componentname *a_cnp)
- */
-static int
-portal_lookup(struct vop_old_lookup_args *ap)
-{
-	struct componentname *cnp = ap->a_cnp;
-	struct vnode **vpp = ap->a_vpp;
-	struct vnode *dvp = ap->a_dvp;
-	char *pname = cnp->cn_nameptr;
-	struct portalnode *pt;
-	int error;
-	struct vnode *fvp = NULL;
-	char *path;
-	int size;
-
-	*vpp = NULLVP;
-
-	if (cnp->cn_nameiop == NAMEI_DELETE || cnp->cn_nameiop == NAMEI_RENAME)
-		return (EROFS);
-
-	if (cnp->cn_namelen == 1 && *pname == '.') {
-		*vpp = dvp;
-		vref(dvp);
-		return (0);
-	}
-
-	/*
-	 * Do the MALLOC before the getnewvnode since doing so afterward
-	 * might cause a bogus v_data pointer to get dereferenced
-	 * elsewhere if MALLOC should block.
-	 */
-	pt = kmalloc(sizeof(struct portalnode), M_TEMP, M_WAITOK);
-
-	error = getnewvnode(VT_PORTAL, dvp->v_mount, &fvp, 0, 0);
-	if (error) {
-		kfree(pt, M_TEMP);
-		goto bad;
-	}
-	fvp->v_type = VREG;
-	fvp->v_data = pt;
-
-	/*
-	 * Save all of the remaining pathname and
-	 * advance the namei next pointer to the end
-	 * of the string.
-	 */
-	for (size = 0, path = pname; *path; path++)
-		size++;
-	cnp->cn_consume = size - cnp->cn_namelen;
-
-	pt->pt_arg = kmalloc(size+1, M_TEMP, M_WAITOK);
-	pt->pt_size = size+1;
-	bcopy(pname, pt->pt_arg, pt->pt_size);
-	pt->pt_fileid = portal_fileid++;
-
-	*vpp = fvp;
-	vx_unlock(fvp);
-	return (0);
-
-bad:;
-	if (fvp)
-		vrele(fvp);
-	return (error);
-}
-
-static int
-portal_connect(struct socket *so, struct socket *so2)
-{
-	/* from unp_connect, bypassing the namei stuff... */
-	struct socket *so3;
-	struct unpcb *unp2;
-	struct unpcb *unp3;
-
-	if (so2 == NULL)
-		return (ECONNREFUSED);
-
-	if (so->so_type != so2->so_type)
-		return (EPROTOTYPE);
-
-	if ((so2->so_options & SO_ACCEPTCONN) == 0)
-		return (ECONNREFUSED);
-
-	if ((so3 = sonewconn(so2, 0)) == NULL)
-		return (ECONNREFUSED);
-
-	unp2 = so2->so_pcb;
-	unp3 = so3->so_pcb;
-	if (unp2->unp_addr)
-		unp3->unp_addr = (struct sockaddr_un *)
-			dup_sockaddr((struct sockaddr *)unp2->unp_addr);
-	so2 = so3;
-
-	return (unp_connect2(so, so2));
-}
-
-/*
- * portal_open(struct vnode *a_vp, int a_mode, struct ucred *a_cred,
- *	       struct file *a_fp)
- */
-static int
-portal_open(struct vop_open_args *ap)
-{
-	struct socket *so = NULL;
-	struct portalnode *pt;
-	struct thread *td = curthread;
-	struct vnode *vp = ap->a_vp;
-	struct uio auio;
-	struct iovec aiov[2];
-	struct sockbuf sio;
-	int res;
-	struct mbuf *cm = NULL;
-	struct cmsghdr *cmsg;
-	int newfds;
-	int *ip;
-	int fd;
-	int error;
-	int len;
-	struct portalmount *fmp;
-	struct file *fp;
-	struct portal_cred pcred;
-
-	/*
-	 * Nothing to do when opening the root node.
-	 */
-	if (vp->v_flag & VROOT)
-		return (vop_stdopen(ap));
-
-	/*
-	 * Can't be opened unless the caller is set up
-	 * to deal with the side effects.  Check for this
-	 * by testing whether the p_dupfd has been set.
-	 */
-	KKASSERT(td->td_proc);
-	if (td->td_lwp->lwp_dupfd >= 0)
-		return (ENODEV);
-
-	pt = VTOPORTAL(vp);
-	fmp = VFSTOPORTAL(vp->v_mount);
-
-	/*
-	 * Create a new socket.
-	 */
-	error = socreate(AF_UNIX, &so, SOCK_STREAM, 0, td);
-	if (error)
-		goto bad;
-
-	/*
-	 * Reserve some buffer space
-	 */
-	res = pt->pt_size + sizeof(pcred) + 512;	/* XXX */
-	error = soreserve(so, res, res, &td->td_proc->p_rlimit[RLIMIT_SBSIZE]);
-	if (error)
-		goto bad;
-
-	/*
-	 * Kick off connection
-	 */
-	error = portal_connect(so, (struct socket *)fmp->pm_server->f_data);
-	if (error)
-		goto bad;
-
-	/*
-	 * Wait for connection to complete
-	 */
-	/*
-	 * XXX: Since the mount point is holding a reference on the
-	 * underlying server socket, it is not easy to find out whether
-	 * the server process is still running.  To handle this problem
-	 * we loop waiting for the new socket to be connected (something
-	 * which will only happen if the server is still running) or for
-	 * the reference count on the server socket to drop to 1, which
-	 * will happen if the server dies.  Sleep for 5 second intervals
-	 * and keep polling the reference count.   XXX.
-	 */
-	crit_enter();
-	while ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) {
-		if (fmp->pm_server->f_count == 1) {
-			error = ECONNREFUSED;
-			crit_exit();
-			goto bad;
-		}
-		(void) tsleep((caddr_t) &so->so_timeo, 0, "portalcon", 5 * hz);
-	}
-	crit_exit();
-
-	if (so->so_error) {
-		error = so->so_error;
-		goto bad;
-	}
-
-	/*
-	 * Set miscellaneous flags
-	 */
-	so->so_rcv.ssb_timeo = 0;
-	so->so_snd.ssb_timeo = 0;
-	atomic_set_int(&so->so_rcv.ssb_flags, SSB_NOINTR);
-	atomic_set_int(&so->so_snd.ssb_flags, SSB_NOINTR);
-
-
-	pcred.pcr_flag = ap->a_mode;
-	pcred.pcr_uid = ap->a_cred->cr_uid;
-	pcred.pcr_ngroups = ap->a_cred->cr_ngroups;
-	bcopy(ap->a_cred->cr_groups, pcred.pcr_groups, NGROUPS * sizeof(gid_t));
-	aiov[0].iov_base = (caddr_t) &pcred;
-	aiov[0].iov_len = sizeof(pcred);
-	aiov[1].iov_base = pt->pt_arg;
-	aiov[1].iov_len = pt->pt_size;
-	auio.uio_iov = aiov;
-	auio.uio_iovcnt = 2;
-	auio.uio_rw = UIO_WRITE;
-	auio.uio_segflg = UIO_SYSSPACE;
-	auio.uio_td = td;
-	auio.uio_offset = 0;
-	auio.uio_resid = aiov[0].iov_len + aiov[1].iov_len;
-
-	error = sosend(so, NULL, &auio, NULL, NULL, 0, td);
-	if (error)
-		goto bad;
-
-	len = sizeof(int);
-	sbinit(&sio, len);
-	do {
-		struct mbuf *m;
-		int flags;
-
-		flags = MSG_WAITALL;
-		error = soreceive(so, NULL, NULL, &sio, &cm, &flags);
-		if (error)
-			goto bad;
-
-		/*
-		 * Grab an error code from the mbuf.
-		 */
-		if ((m = sio.sb_mb) != NULL) {
-			m = m_pullup(m, sizeof(int));	/* Needed? */
-			if (m) {
-				error = *(mtod(m, int *));
-				m_freem(m);
-			} else {
-				error = EINVAL;
-			}
-		} else {
-			if (cm == NULL) {
-				error = ECONNRESET;	 /* XXX */
-#ifdef notdef
-				break;
-#endif
-			}
-		}
-	} while (cm == NULL && sio.sb_cc == 0 && !error);
-
-	if (cm == NULL)
-		goto bad;
-
-	if (auio.uio_resid) {
-		error = 0;
-#ifdef notdef
-		error = EMSGSIZE;
-		goto bad;
-#endif
-	}
-
-	/*
-	 * XXX: Break apart the control message, and retrieve the
-	 * received file descriptor.  Note that more than one descriptor
-	 * may have been received, or that the rights chain may have more
-	 * than a single mbuf in it.  What to do?
-	 */
-	cmsg = mtod(cm, struct cmsghdr *);
-	newfds = (cmsg->cmsg_len - sizeof(*cmsg)) / sizeof (int);
-	if (newfds == 0) {
-		error = ECONNREFUSED;
-		goto bad;
-	}
-	/*
-	 * At this point the rights message consists of a control message
-	 * header, followed by a data region containing a vector of
-	 * integer file descriptors.  The fds were allocated by the action
-	 * of receiving the control message.
-	 */
-	ip = (int *) (cmsg + 1);
-	fd = *ip++;
-	if (newfds > 1) {
-		/*
-		 * Close extra fds.
-		 */
-		int i;
-		kprintf("portal_open: %d extra fds\n", newfds - 1);
-		for (i = 1; i < newfds; i++) {
-			portal_closefd(td, *ip);
-			ip++;
-		}
-	}
-
-	/*
-	 * Check that the mode the file is being opened for is a subset
-	 * of the mode of the existing descriptor.
-	 */
-	KKASSERT(td->td_proc);
- 	fp = td->td_proc->p_fd->fd_files[fd].fp;
-	if (((ap->a_mode & (FREAD|FWRITE)) | fp->f_flag) != fp->f_flag) {
-		portal_closefd(td, fd);
-		error = EACCES;
-		goto bad;
-	}
-
-	/*
-	 * Save the dup fd in the proc structure then return the
-	 * special error code (ENXIO) which causes magic things to
-	 * happen in vn_open.  The whole concept is, well, hmmm.
-	 */
-	td->td_lwp->lwp_dupfd = fd;
-	vop_stdopen(ap);
-	error = ENXIO;
-
-bad:;
-	/*
-	 * And discard the control message.
-	 */
-	if (cm) {
-		m_freem(cm);
-	}
-
-	if (so) {
-		soshutdown(so, SHUT_RDWR);
-		soclose(so, FNONBLOCK);
-	}
-	return (error);
-}
-
-/*
- * portal_getattr(struct vnode *a_vp, struct vattr *a_vap)
- */
-static int
-portal_getattr(struct vop_getattr_args *ap)
-{
-	struct vnode *vp = ap->a_vp;
-	struct vattr *vap = ap->a_vap;
-
-	bzero(vap, sizeof(*vap));
-	vattr_null(vap);
-	vap->va_uid = 0;
-	vap->va_gid = 0;
-	vap->va_size = DEV_BSIZE;
-	vap->va_blocksize = DEV_BSIZE;
-	nanotime(&vap->va_atime);
-	vap->va_mtime = vap->va_atime;
-	vap->va_ctime = vap->va_mtime;
-	vap->va_gen = 0;
-	vap->va_flags = 0;
-	vap->va_rmajor = VNOVAL;
-	vap->va_rminor = VNOVAL;
-	/* vap->va_qbytes = 0; */
-	vap->va_bytes = 0;
-	/* vap->va_qsize = 0; */
-	if (vp->v_flag & VROOT) {
-		vap->va_type = VDIR;
-		vap->va_mode = S_IRUSR|S_IWUSR|S_IXUSR|
-				S_IRGRP|S_IWGRP|S_IXGRP|
-				S_IROTH|S_IWOTH|S_IXOTH;
-		vap->va_nlink = 2;
-		vap->va_fileid = 2;
-	} else {
-		vap->va_type = VREG;
-		vap->va_mode = S_IRUSR|S_IWUSR|
-				S_IRGRP|S_IWGRP|
-				S_IROTH|S_IWOTH;
-		vap->va_nlink = 1;
-		vap->va_fileid = VTOPORTAL(vp)->pt_fileid;
-	}
-	return (0);
-}
-
-/*
- * portal_setattr(struct vnode *a_vp, struct vattr *a_vap,
- *		  struct ucred *a_cred)
- */
-static int
-portal_setattr(struct vop_setattr_args *ap)
-{
-	/*
-	 * Can't mess with the root vnode
-	 */
-	if (ap->a_vp->v_flag & VROOT)
-		return (EACCES);
-
-	if (ap->a_vap->va_flags != VNOVAL)
-		return (EOPNOTSUPP);
-
-	return (0);
-}
-
-/*
- * Fake readdir, just return empty directory.
- * It is hard to deal with '.' and '..' so don't bother.
- *
- * portal_readdir(struct vnode *a_vp, struct uio *a_uio,
- *		  struct ucred *a_cred, int *a_eofflag,
- *		  off_t *a_cookies, int a_ncookies)
- */
-static int
-portal_readdir(struct vop_readdir_args *ap)
-{
-	/*
-	 * We don't allow exporting portal mounts, and currently local
-	 * requests do not need cookies.
-	 */
-	if (ap->a_ncookies)
-		panic("portal_readdir: not hungry");
-
-	return (0);
-}
-
-/*
- * portal_inactive(struct vnode *a_vp)
- */
-static int
-portal_inactive(struct vop_inactive_args *ap)
-{
-	return (0);
-}
-
-/*
- * portal_reclaim(struct vnode *a_vp)
- */
-static int
-portal_reclaim(struct vop_reclaim_args *ap)
-{
-	struct portalnode *pt = VTOPORTAL(ap->a_vp);
-
-	if (pt->pt_arg) {
-		kfree((caddr_t) pt->pt_arg, M_TEMP);
-		pt->pt_arg = 0;
-	}
-	kfree(ap->a_vp->v_data, M_TEMP);
-	ap->a_vp->v_data = 0;
-
-	return (0);
-}
-
-
-/*
- * Print out the contents of a Portal vnode.
- *
- * portal_print(struct vnode *a_vp)
- */
-/* ARGSUSED */
-static int
-portal_print(struct vop_print_args *ap)
-{
-	kprintf("tag VT_PORTAL, portal vnode\n");
-	return (0);
-}
-
-
-/*
- * Portal "should never get here" operation
- */
-static int
-portal_badop(void)
-{
-
-	panic("portal: bad op");
-	/* NOTREACHED */
-}
-
-struct vop_ops portal_vnode_vops = {
-	.vop_default =		vop_defaultop,
-	.vop_access =		(void *)vop_null,
-	.vop_bmap =		(void *)portal_badop,
-	.vop_getattr =		portal_getattr,
-	.vop_inactive =		portal_inactive,
-	.vop_old_lookup =	portal_lookup,
-	.vop_open =		portal_open,
-	.vop_pathconf =		vop_stdpathconf,
-	.vop_print =		portal_print,
-	.vop_readdir =		portal_readdir,
-	.vop_reclaim =		portal_reclaim,
-	.vop_setattr =		portal_setattr
-};
-
-- 
2.9.2

