summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/nfs/nfs_nfssvc.c
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2021-07-29 13:35:16 +1000
committerChris Johns <chrisj@rtems.org>2021-08-28 10:25:46 +1000
commit6138f242be4f9d989a4052be71f1b116bd806e44 (patch)
tree3f6e5d1b280a1dd2bbd0916f334c76da2705ca20 /freebsd/sys/nfs/nfs_nfssvc.c
parentkern/sys: Add the kernel RPC and XDR support (diff)
downloadrtems-libbsd-6138f242be4f9d989a4052be71f1b116bd806e44.tar.bz2
kern/sys: Import NFS and NFS file system client
Update #4475
Diffstat (limited to 'freebsd/sys/nfs/nfs_nfssvc.c')
-rw-r--r--freebsd/sys/nfs/nfs_nfssvc.c154
1 files changed, 154 insertions, 0 deletions
diff --git a/freebsd/sys/nfs/nfs_nfssvc.c b/freebsd/sys/nfs/nfs_nfssvc.c
new file mode 100644
index 00000000..19ac16a9
--- /dev/null
+++ b/freebsd/sys/nfs/nfs_nfssvc.c
@@ -0,0 +1,154 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Rick Macklem at The University of Guelph.
+ *
+ * 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.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_nfs.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/sysproto.h>
+#include <sys/kernel.h>
+#include <sys/sysctl.h>
+#include <sys/priv.h>
+#include <sys/proc.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/module.h>
+#include <sys/sysent.h>
+#include <sys/syscall.h>
+#include <sys/sysproto.h>
+
+#include <security/audit/audit.h>
+
+#include <nfs/nfssvc.h>
+
+static struct syscall_helper_data nfssvc_syscalls[] = {
+ SYSCALL_INIT_HELPER(nfssvc),
+ SYSCALL_INIT_LAST
+};
+
+/*
+ * This tiny module simply handles the nfssvc() system call. The other
+ * nfs modules that use the system call register themselves by setting
+ * the nfsd_call_xxx function pointers non-NULL.
+ */
+
+int (*nfsd_call_nfsserver)(struct thread *, struct nfssvc_args *) = NULL;
+int (*nfsd_call_nfscommon)(struct thread *, struct nfssvc_args *) = NULL;
+int (*nfsd_call_nfscl)(struct thread *, struct nfssvc_args *) = NULL;
+int (*nfsd_call_nfsd)(struct thread *, struct nfssvc_args *) = NULL;
+
+/*
+ * Nfs server pseudo system call for the nfsd's
+ */
+int
+sys_nfssvc(struct thread *td, struct nfssvc_args *uap)
+{
+ int error;
+
+ KASSERT(!mtx_owned(&Giant), ("nfssvc(): called with Giant"));
+
+ AUDIT_ARG_CMD(uap->flag);
+
+ /* Allow anyone to get the stats. */
+ if ((uap->flag & ~NFSSVC_GETSTATS) != 0) {
+ error = priv_check(td, PRIV_NFS_DAEMON);
+ if (error != 0)
+ return (error);
+ }
+ error = EINVAL;
+ if ((uap->flag & (NFSSVC_ADDSOCK | NFSSVC_OLDNFSD | NFSSVC_NFSD)) &&
+ nfsd_call_nfsserver != NULL)
+ error = (*nfsd_call_nfsserver)(td, uap);
+ else if ((uap->flag & (NFSSVC_CBADDSOCK | NFSSVC_NFSCBD |
+ NFSSVC_DUMPMNTOPTS | NFSSVC_FORCEDISM)) && nfsd_call_nfscl != NULL)
+ error = (*nfsd_call_nfscl)(td, uap);
+ else if ((uap->flag & (NFSSVC_IDNAME | NFSSVC_GETSTATS |
+ NFSSVC_GSSDADDPORT | NFSSVC_GSSDADDFIRST | NFSSVC_GSSDDELETEALL |
+ NFSSVC_NFSUSERDPORT | NFSSVC_NFSUSERDDELPORT)) &&
+ nfsd_call_nfscommon != NULL)
+ error = (*nfsd_call_nfscommon)(td, uap);
+ else if ((uap->flag & (NFSSVC_NFSDNFSD | NFSSVC_NFSDADDSOCK |
+ NFSSVC_PUBLICFH | NFSSVC_V4ROOTEXPORT | NFSSVC_NOPUBLICFH |
+ NFSSVC_STABLERESTART | NFSSVC_ADMINREVOKE |
+ NFSSVC_DUMPCLIENTS | NFSSVC_DUMPLOCKS | NFSSVC_BACKUPSTABLE |
+ NFSSVC_SUSPENDNFSD | NFSSVC_RESUMENFSD | NFSSVC_PNFSDS)) &&
+ nfsd_call_nfsd != NULL)
+ error = (*nfsd_call_nfsd)(td, uap);
+ if (error == EINTR || error == ERESTART)
+ error = 0;
+ return (error);
+}
+
+/*
+ * Called once to initialize data structures...
+ */
+static int
+nfssvc_modevent(module_t mod, int type, void *data)
+{
+ int error = 0;
+
+ switch (type) {
+ case MOD_LOAD:
+ error = syscall_helper_register(nfssvc_syscalls,
+ SY_THR_STATIC_KLD);
+ break;
+
+ case MOD_UNLOAD:
+ if (nfsd_call_nfsserver != NULL || nfsd_call_nfscommon != NULL
+ || nfsd_call_nfscl != NULL || nfsd_call_nfsd != NULL) {
+ error = EBUSY;
+ break;
+ }
+ syscall_helper_unregister(nfssvc_syscalls);
+ break;
+ default:
+ error = EOPNOTSUPP;
+ break;
+ }
+ return error;
+}
+static moduledata_t nfssvc_mod = {
+ "nfssvc",
+ nfssvc_modevent,
+ NULL,
+};
+DECLARE_MODULE(nfssvc, nfssvc_mod, SI_SUB_VFS, SI_ORDER_ANY);
+
+/* So that loader and kldload(2) can find us, wherever we are.. */
+MODULE_VERSION(nfssvc, 1);
+