From: Sascha Wildner Date: Wed, 4 Jan 2017 07:39:55 +0000 (+0100) Subject: Remove portal file system, mount_portal and examples. X-Git-Tag: v4.8.0rc~301 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/be813d7ae46e054d6de20889ee1e2388afc5e6cb Remove portal file system, mount_portal and examples. It has been broken for a long time I think. Approved-by: dillon --- diff --git a/Makefile_upgrade.inc b/Makefile_upgrade.inc index f5c20985e8..2be2362f54 100644 --- a/Makefile_upgrade.inc +++ b/Makefile_upgrade.inc @@ -3178,6 +3178,10 @@ TO_REMOVE+=/usr/share/man/man2/sigvec.2.gz TO_REMOVE+=/usr/share/man/man3/efi_set_variables_supported.3.gz TO_REMOVE+=/usr/share/man/man9/cpumask.9.gz TO_REMOVE+=/usr/share/man/man9/nlookup_set_cred.9.gz +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/UPDATING b/UPDATING index 6d5748dcff..00f8242484 100644 --- a/UPDATING +++ b/UPDATING @@ -12,6 +12,11 @@ + UPGRADING DRAGONFLY FROM 4.6 TO LATER VERSIONS + +-----------------------------------------------------------------------+ +PORTAL FILE SYSTEM REMOVED +-------------------------- + +It has been broken for a long time now. + BINUTILS 2.27 REPLACES 2.24, PRIMARY ------------------------------------ diff --git a/etc/defaults/rc.conf b/etc/defaults/rc.conf index eb3d8e9f32..cb71682a31 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 4612adeaf4..68c657f259 100644 --- a/etc/mtree/BSD.usr.dist +++ b/etc/mtree/BSD.usr.dist @@ -209,8 +209,6 @@ .. pf .. - portal - .. ppi .. ppp diff --git a/sbin/Makefile b/sbin/Makefile index 2f61751cc0..0ccc54c3ab 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 e412eeab4c..94066f4798 100644 --- a/sbin/mount/mount.8 +++ b/sbin/mount/mount.8 @@ -416,7 +416,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 e4c102932c..0000000000 --- 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 diff --git a/sbin/mount_portal/activate.c b/sbin/mount_portal/activate.c deleted file mode 100644 index 68a9be60e2..0000000000 --- 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 -#include -#include -#include -#include -#include -#include -#include - -#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 d73def5766..0000000000 --- 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#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 e01ba0da5b..0000000000 --- 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 625463db90..0000000000 --- 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 -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#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 9d4ee1763c..0000000000 --- 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 - -#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 6677780498..0000000000 --- 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 af6d48fdc8..0000000000 --- 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 -#include - -/* - * 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 b59698d739..0000000000 --- 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 -#include -#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 e12750d833..0000000000 --- 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 -#include -#include - -#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 5aaa0d6473..0000000000 --- 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 -#include -#include -#include -#include -#include -#include - -#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 */ - 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 48c6dcd3dc..0000000000 --- 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#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 e039be9392..0000000000 --- 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#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 f47676c656..b0bc398c8f 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 f3a26909d3..0000000000 --- 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 aa7e282d59..0000000000 --- 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 7322230f27..07e0f5ba36 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 d85319ff85..c3cbcaa9a2 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 b368f771c9..d4738ae21d 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -1275,8 +1275,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 820b624a5a..5d0a8eb2ad 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 84c3d90fa2..d8e1a7fbf5 100644 --- a/sys/config/LINT64 +++ b/sys/config/LINT64 @@ -478,11 +478,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 @@ -498,7 +493,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 42d294c000..c0ec5375be 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 882f93395a..9438062237 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 08a8a3bb5a..0000000000 --- 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 diff --git a/sys/vfs/portal/portal.h b/sys/vfs/portal/portal.h deleted file mode 100644 index 7d6508a651..0000000000 --- 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 73618a9449..0000000000 --- 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#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 1ab16c5c5a..0000000000 --- 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "portal.h" - -#include - -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 -}; -