summaryrefslogtreecommitdiff
path: root/sys/compat/netbsd
diff options
context:
space:
mode:
Diffstat (limited to 'sys/compat/netbsd')
-rw-r--r--sys/compat/netbsd/files.netbsd3
-rw-r--r--sys/compat/netbsd/netbsd_exec.c3
-rw-r--r--sys/compat/netbsd/netbsd_file.c726
-rw-r--r--sys/compat/netbsd/netbsd_stat.c81
-rw-r--r--sys/compat/netbsd/syscalls.master65
5 files changed, 838 insertions, 40 deletions
diff --git a/sys/compat/netbsd/files.netbsd b/sys/compat/netbsd/files.netbsd
index ad35c72c41b..2cc5ea32ba9 100644
--- a/sys/compat/netbsd/files.netbsd
+++ b/sys/compat/netbsd/files.netbsd
@@ -1,4 +1,4 @@
-# $OpenBSD: files.netbsd,v 1.5 1999/09/17 12:13:47 kstailey Exp $
+# $OpenBSD: files.netbsd,v 1.6 1999/09/17 22:14:08 kstailey Exp $
#
# Config.new file description for machine-independent NetBSD compat code.
# Included by ports that need it.
@@ -7,6 +7,7 @@
# own file lists.
file compat/netbsd/netbsd_exec.c compat_netbsd
+file compat/netbsd/netbsd_file.c compat_netbsd
file compat/netbsd/netbsd_getcwd.c compat_netbsd
file compat/netbsd/netbsd_getdents.c compat_netbsd
file compat/netbsd/netbsd_misc.c compat_netbsd
diff --git a/sys/compat/netbsd/netbsd_exec.c b/sys/compat/netbsd/netbsd_exec.c
index abac7f8e5a9..066e826538f 100644
--- a/sys/compat/netbsd/netbsd_exec.c
+++ b/sys/compat/netbsd/netbsd_exec.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: netbsd_exec.c,v 1.1 1999/09/12 14:15:16 kstailey Exp $ */
+/* $OpenBSD: netbsd_exec.c,v 1.2 1999/09/17 22:14:09 kstailey Exp $ */
/* $NetBSD: svr4_exec.c,v 1.16 1995/10/14 20:24:20 christos Exp $ */
/*
@@ -55,7 +55,6 @@
static void *netbsd_copyargs __P((struct exec_package *, struct ps_strings *,
void *, void *));
-const char netbsd_emul_path[] = "/emul/netbsd";
extern char sigcode[], esigcode[];
extern struct sysent netbsd_sysent[];
extern char *netbsd_syscallnames[];
diff --git a/sys/compat/netbsd/netbsd_file.c b/sys/compat/netbsd/netbsd_file.c
new file mode 100644
index 00000000000..5fe0988a34c
--- /dev/null
+++ b/sys/compat/netbsd/netbsd_file.c
@@ -0,0 +1,726 @@
+/* $OpenBSD: netbsd_file.c,v 1.1 1999/09/17 22:14:09 kstailey Exp $ */
+/* $NetBSD: freebsd_file.c,v 1.3 1996/05/03 17:03:09 christos Exp $ */
+
+/*
+ * Copyright (c) 1995 Frank van der Linden
+ * All rights reserved.
+ *
+ * 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed for the NetBSD Project
+ * by Frank van der Linden
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ *
+ * from: linux_file.c,v 1.3 1995/04/04 04:21:30 mycroft Exp
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/namei.h>
+#include <sys/proc.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/filedesc.h>
+#include <sys/ioctl.h>
+#include <sys/kernel.h>
+#include <sys/vnode.h>
+#include <sys/mount.h>
+#include <sys/malloc.h>
+
+#include <sys/syscallargs.h>
+
+#include <compat/netbsd/netbsd_types.h>
+#include <compat/netbsd/netbsd_stat.h>
+#include <compat/netbsd/netbsd_signal.h>
+#include <compat/netbsd/netbsd_syscallargs.h>
+#include <compat/netbsd/netbsd_util.h>
+
+#define ARRAY_LENGTH(array) (sizeof(array)/sizeof(array[0]))
+
+const char netbsd_emul_path[] = "/emul/netbsd";
+
+#if 0
+static char * convert_from_netbsd_mount_type __P((int));
+void statfs_to_netbsd_statfs __P((struct proc *, struct mount *,
+ struct statfs *, struct netbsd_statfs *));
+
+struct netbsd_statfs {
+ long f_spare2; /* placeholder */
+ long f_bsize; /* fundamental file system block size */
+ long f_iosize; /* optimal transfer block size */
+ long f_blocks; /* total data blocks in file system */
+ long f_bfree; /* free blocks in fs */
+ long f_bavail; /* free blocks avail to non-superuser */
+ long f_files; /* total file nodes in file system */
+ long f_ffree; /* free file nodes in fs */
+ fsid_t f_fsid; /* file system id */
+ uid_t f_owner; /* user that mounted the filesystem */
+ int f_type; /* type of filesystem */
+ int f_flags; /* copy of mount exported flags */
+ long f_syncwrites; /* count of sync writes since mount */
+ long f_asyncwrites; /* count of async writes since mount */
+ char f_fstypename[MFSNAMELEN]; /* fs type name */
+ char f_mntonname[MNAMELEN]; /* directory on which mounted */
+ char f_mntfromname[MNAMELEN];/* mounted filesystem */
+};
+
+static char *
+convert_from_netbsd_mount_type(type)
+ int type;
+{
+ static char *netbsd_mount_type[] = {
+ NULL, /* 0 = MOUNT_NONE */
+ "ffs", /* 1 = "Fast" Filesystem */
+ "nfs", /* 2 = Network Filesystem */
+ "mfs", /* 3 = Memory Filesystem */
+ "msdos", /* 4 = MSDOS Filesystem */
+ "lfs", /* 5 = Log-based Filesystem */
+ "lofs", /* 6 = Loopback filesystem */
+ "fdesc", /* 7 = File Descriptor Filesystem */
+ "portal", /* 8 = Portal Filesystem */
+ "null", /* 9 = Minimal Filesystem Layer */
+ "umap", /* 10 = User/Group Identifier Remapping Filesystem */
+ "kernfs", /* 11 = Kernel Information Filesystem */
+ "procfs", /* 12 = /proc Filesystem */
+ "afs", /* 13 = Andrew Filesystem */
+ "cd9660", /* 14 = ISO9660 (aka CDROM) Filesystem */
+ "union", /* 15 = Union (translucent) Filesystem */
+ NULL, /* 16 = "devfs" - existing device Filesystem */
+#if 0 /* These filesystems don't exist in Netbsd */
+ "adosfs", /* ?? = AmigaDOS Filesystem */
+#endif
+ };
+
+ if (type < 0 || type >= ARRAY_LENGTH(netbsd_mount_type))
+ return (NULL);
+ return (netbsd_mount_type[type]);
+}
+
+int
+netbsd_sys_mount(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_mount_args /* {
+ syscallarg(int) type;
+ syscallarg(char *) path;
+ syscallarg(int) flags;
+ syscallarg(caddr_t) data;
+ } */ *uap = v;
+ int error;
+ char *type, *s;
+ caddr_t sg = stackgap_init(p->p_emul);
+ struct sys_mount_args bma;
+
+ if ((type = convert_from_netbsd_mount_type(SCARG(uap, type))) == NULL)
+ return ENODEV;
+ s = stackgap_alloc(&sg, MFSNAMELEN + 1);
+ if ((error = copyout(type, s, strlen(type) + 1)) != 0)
+ return error;
+ SCARG(&bma, type) = s;
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ SCARG(&bma, path) = SCARG(uap, path);
+ SCARG(&bma, flags) = SCARG(uap, flags);
+ SCARG(&bma, data) = SCARG(uap, data);
+ return sys_mount(p, &bma, retval);
+}
+#endif /* 0 */
+
+/*
+ * The following syscalls are only here because of the alternate path check.
+ */
+
+/* XXX - UNIX domain: int netbsd_sys_bind(int s, caddr_t name, int namelen); */
+/* XXX - UNIX domain: int netbsd_sys_connect(int s, caddr_t name, int namelen); */
+
+
+int
+netbsd_sys_open(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_open_args /* {
+ syscallarg(char *) path;
+ syscallarg(int) flags;
+ syscallarg(int) mode;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ if (SCARG(uap, flags) & O_CREAT)
+ NETBSD_CHECK_ALT_CREAT(p, &sg, SCARG(uap, path));
+ else
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return sys_open(p, uap, retval);
+}
+
+int
+compat_43_netbsd_sys_creat(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct compat_43_netbsd_sys_creat_args /* {
+ syscallarg(char *) path;
+ syscallarg(int) mode;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_CREAT(p, &sg, SCARG(uap, path));
+ return compat_43_sys_creat(p, uap, retval);
+}
+
+int
+netbsd_sys_link(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_link_args /* {
+ syscallarg(char *) path;
+ syscallarg(char *) link;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ NETBSD_CHECK_ALT_CREAT(p, &sg, SCARG(uap, link));
+ return sys_link(p, uap, retval);
+}
+
+int
+netbsd_sys_unlink(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_unlink_args /* {
+ syscallarg(char *) path;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return sys_unlink(p, uap, retval);
+}
+
+int
+netbsd_sys_chdir(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_chdir_args /* {
+ syscallarg(char *) path;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return sys_chdir(p, uap, retval);
+}
+
+int
+netbsd_sys_mknod(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_mknod_args /* {
+ syscallarg(char *) path;
+ syscallarg(int) mode;
+ syscallarg(int) dev;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_CREAT(p, &sg, SCARG(uap, path));
+ return sys_mknod(p, uap, retval);
+}
+
+int
+netbsd_sys_chmod(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_chmod_args /* {
+ syscallarg(char *) path;
+ syscallarg(int) mode;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return sys_chmod(p, uap, retval);
+}
+
+int
+netbsd_sys_chown(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_chown_args /* {
+ syscallarg(char *) path;
+ syscallarg(int) uid;
+ syscallarg(int) gid;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return sys_chown(p, uap, retval);
+}
+
+int
+netbsd_sys_unmount(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_unmount_args /* {
+ syscallarg(char *) path;
+ syscallarg(int) flags;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return sys_unmount(p, uap, retval);
+}
+
+int
+netbsd_sys_access(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_access_args /* {
+ syscallarg(char *) path;
+ syscallarg(int) flags;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return sys_access(p, uap, retval);
+}
+
+int
+netbsd_sys_chflags(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_chflags_args /* {
+ syscallarg(char *) path;
+ syscallarg(int) flags;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return sys_chflags(p, uap, retval);
+}
+
+int
+netbsd_sys_revoke(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_revoke_args /* {
+ syscallarg(char *) path;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return sys_revoke(p, uap, retval);
+}
+
+int
+netbsd_sys_symlink(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_symlink_args /* {
+ syscallarg(char *) path;
+ syscallarg(char *) link;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ NETBSD_CHECK_ALT_CREAT(p, &sg, SCARG(uap, link));
+ return sys_symlink(p, uap, retval);
+}
+
+int
+netbsd_sys_readlink(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_readlink_args /* {
+ syscallarg(char *) path;
+ syscallarg(char *) buf;
+ syscallarg(int) count;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return sys_readlink(p, uap, retval);
+}
+
+int
+netbsd_sys_execve(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_execve_args /* {
+ syscallarg(char *) path;
+ syscallarg(char **) argp;
+ syscallarg(char **) envp;
+ } */ *uap = v;
+ struct sys_execve_args ap;
+ caddr_t sg;
+
+ sg = stackgap_init(p->p_emul);
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+
+ SCARG(&ap, path) = SCARG(uap, path);
+ SCARG(&ap, argp) = SCARG(uap, argp);
+ SCARG(&ap, envp) = SCARG(uap, envp);
+
+ return sys_execve(p, &ap, retval);
+}
+
+int
+netbsd_sys_chroot(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_chroot_args /* {
+ syscallarg(char *) path;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return sys_chroot(p, uap, retval);
+}
+
+int
+netbsd_sys_rename(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_rename_args /* {
+ syscallarg(char *) from;
+ syscallarg(char *) to;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, from));
+ NETBSD_CHECK_ALT_CREAT(p, &sg, SCARG(uap, to));
+ return sys_rename(p, uap, retval);
+}
+
+int
+compat_43_netbsd_sys_truncate(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct compat_43_netbsd_sys_truncate_args /* {
+ syscallarg(char *) path;
+ syscallarg(long) length;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return compat_43_sys_truncate(p, uap, retval);
+}
+
+int
+netbsd_sys_mkfifo(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_mkfifo_args /* {
+ syscallarg(char *) path;
+ syscallarg(int) mode;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_CREAT(p, &sg, SCARG(uap, path));
+ return sys_mkfifo(p, uap, retval);
+}
+
+int
+netbsd_sys_mkdir(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_mkdir_args /* {
+ syscallarg(char *) path;
+ syscallarg(int) mode;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_CREAT(p, &sg, SCARG(uap, path));
+ return sys_mkdir(p, uap, retval);
+}
+
+int
+netbsd_sys_rmdir(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_rmdir_args /* {
+ syscallarg(char *) path;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return sys_rmdir(p, uap, retval);
+}
+
+#if 0 /* XXX */
+/*
+ * Convert struct statfs -> struct netbsd_statfs
+ */
+void
+statfs_to_netbsd_statfs(p, mp, sp, fsp)
+ struct proc *p;
+ struct mount *mp;
+ struct statfs *sp;
+ struct netbsd_statfs *fsp;
+{
+ fsp->f_bsize = sp->f_bsize;
+ fsp->f_iosize = sp->f_iosize;
+ fsp->f_blocks = sp->f_blocks;
+ fsp->f_bfree = sp->f_bfree;
+ fsp->f_bavail = sp->f_bavail;
+ fsp->f_files = sp->f_files;
+ fsp->f_ffree = sp->f_ffree;
+ /* Don't let non-root see filesystem id (for NFS security) */
+ if (suser(p->p_ucred, &p->p_acflag))
+ fsp->f_fsid.val[0] = fsp->f_fsid.val[1] = 0;
+ else
+ bcopy(&sp->f_fsid, &fsp->f_fsid, sizeof(fsp->f_fsid));
+ fsp->f_owner = sp->f_owner;
+ fsp->f_type = mp->mnt_vfc->vfc_typenum;
+ fsp->f_flags = sp->f_flags;
+ fsp->f_syncwrites = sp->f_syncwrites;
+ fsp->f_asyncwrites = sp->f_asyncwrites;
+ bcopy(sp->f_fstypename, fsp->f_fstypename, MFSNAMELEN);
+ bcopy(sp->f_mntonname, fsp->f_mntonname, MNAMELEN);
+ bcopy(sp->f_mntfromname, fsp->f_mntfromname, MNAMELEN);
+}
+
+/*
+ * Get filesystem statistics.
+ */
+/* ARGSUSED */
+int
+netbsd_sys_statfs(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ register struct netbsd_sys_statfs_args /* {
+ syscallarg(char *) path;
+ syscallarg(struct netbsd_statfs *) buf;
+ } */ *uap = v;
+ register struct mount *mp;
+ register struct statfs *sp;
+ struct netbsd_statfs fsb;
+ int error;
+ struct nameidata nd;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
+ if ((error = namei(&nd)) != 0)
+ return (error);
+ mp = nd.ni_vp->v_mount;
+ sp = &mp->mnt_stat;
+ vrele(nd.ni_vp);
+ if ((error = VFS_STATFS(mp, sp, p)) != 0)
+ return (error);
+ sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
+
+ statfs_to_netbsd_statfs(p, mp, sp, &fsb);
+ return (copyout((caddr_t)&fsb, (caddr_t)SCARG(uap, buf), sizeof(fsb)));
+}
+
+/*
+ * Get filesystem statistics.
+ */
+/* ARGSUSED */
+int
+netbsd_sys_fstatfs(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ register struct netbsd_sys_fstatfs_args /* {
+ syscallarg(int) fd;
+ syscallarg(struct netbsd_statfs *) buf;
+ } */ *uap = v;
+ struct file *fp;
+ struct mount *mp;
+ register struct statfs *sp;
+ struct netbsd_statfs fsb;
+ int error;
+
+ if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
+ return (error);
+ mp = ((struct vnode *)fp->f_data)->v_mount;
+ sp = &mp->mnt_stat;
+ if ((error = VFS_STATFS(mp, sp, p)) != 0)
+ return (error);
+ sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
+
+ statfs_to_netbsd_statfs(p, mp, sp, &fsb);
+ return (copyout((caddr_t)&fsb, (caddr_t)SCARG(uap, buf), sizeof(fsb)));
+}
+
+/*
+ * Get statistics on all filesystems.
+ */
+int
+netbsd_sys_getfsstat(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ register struct netbsd_sys_getfsstat_args /* {
+ syscallarg(struct netbsd_statfs *) buf;
+ syscallarg(long) bufsize;
+ syscallarg(int) flags;
+ } */ *uap = v;
+ register struct mount *mp, *nmp;
+ register struct statfs *sp;
+ struct netbsd_statfs fsb;
+ caddr_t sfsp;
+ long count, maxcount;
+ int error, flags = SCARG(uap, flags);
+
+ maxcount = SCARG(uap, bufsize) / sizeof(struct netbsd_statfs);
+ sfsp = (caddr_t)SCARG(uap, buf);
+ count = 0;
+ simple_lock(&mountlist_slock);
+ for (mp = mountlist.cqh_first; mp != (void *)&mountlist; mp = nmp) {
+ if (vfs_busy(mp, LK_NOWAIT, &mountlist_slock, p)) {
+ nmp = mp->mnt_list.cqe_next;
+ continue;
+ }
+ if (sfsp && count < maxcount) {
+ sp = &mp->mnt_stat;
+
+ /* Refresh stats unless MNT_NOWAIT is specified */
+ if (flags != MNT_NOWAIT &&
+ flags != MNT_LAZY &&
+ (flags == MNT_WAIT ||
+ flags == 0) &&
+ (error = VFS_STATFS(mp, sp, p))) {
+ simple_lock(&mountlist_slock);
+ nmp = mp->mnt_list.cqe_next;
+ vfs_unbusy(mp, p);
+ continue;
+ }
+ sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
+
+ statfs_to_netbsd_statfs(p, mp, sp, &fsb);
+ error = copyout((caddr_t)&fsb, sfsp, sizeof(fsb));
+ if (error) {
+ vfs_unbusy(mp, p);
+ return (error);
+ }
+ sfsp += sizeof(fsb);
+ }
+ count++;
+ simple_lock(&mountlist_slock);
+ nmp = mp->mnt_list.cqe_next;
+ vfs_unbusy(mp, p);
+ }
+ simple_unlock(&mountlist_slock);
+ if (sfsp && count > maxcount)
+ *retval = maxcount;
+ else
+ *retval = count;
+ return (0);
+}
+
+#ifdef NFSCLIENT
+int
+netbsd_sys_getfh(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_getfh_args /* {
+ syscallarg(char *) fname;
+ syscallarg(fhandle_t *) fhp;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, fname));
+ return sys_getfh(p, uap, retval);
+}
+#endif /* NFSCLIENT */
+
+#endif /* 0 XXX */
+
+int
+netbsd_sys_pathconf(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_pathconf_args /* {
+ syscallarg(char *) path;
+ syscallarg(int) name;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return sys_pathconf(p, uap, retval);
+}
+
+int
+netbsd_sys_truncate(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_truncate_args /* {
+ syscallarg(char *) path;
+ syscallarg(int) pad;
+ syscallarg(off_t) length;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return sys_truncate(p, uap, retval);
+}
diff --git a/sys/compat/netbsd/netbsd_stat.c b/sys/compat/netbsd/netbsd_stat.c
index cdffe5a1d40..77acb9561c6 100644
--- a/sys/compat/netbsd/netbsd_stat.c
+++ b/sys/compat/netbsd/netbsd_stat.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: netbsd_stat.c,v 1.3 1999/09/17 12:13:47 kstailey Exp $ */
+/* $OpenBSD: netbsd_stat.c,v 1.4 1999/09/17 22:14:09 kstailey Exp $ */
/*
* Copyright (c) 1989, 1993
* The Regents of the University of California. All rights reserved.
@@ -40,18 +40,23 @@
*/
#include <sys/param.h>
+#include <sys/systm.h>
#include <sys/file.h>
#include <sys/filedesc.h>
#include <sys/proc.h>
#include <sys/socketvar.h>
#include <sys/stat.h>
-#include <sys/systm.h>
+#include <sys/mount.h>
#include <sys/namei.h>
#include <sys/vnode.h>
+
+#include <sys/syscallargs.h>
+
#include <compat/netbsd/netbsd_types.h>
#include <compat/netbsd/netbsd_stat.h>
#include <compat/netbsd/netbsd_signal.h>
#include <compat/netbsd/netbsd_syscallargs.h>
+#include <compat/netbsd/netbsd_util.h>
static void openbsd_to_netbsd_stat __P((struct stat *, struct netbsd_stat *));
@@ -102,14 +107,16 @@ netbsd_sys___stat13(p, v, retval)
register_t *retval;
{
register struct netbsd_sys___stat13_args /* {
- syscallarg(const char *) path;
+ syscallarg(char *) path;
syscallarg(struct netbsd_stat *) nsb;
} */ *uap = v;
struct netbsd_stat nsb;
struct stat sb;
int error;
struct nameidata nd;
+ caddr_t sg = stackgap_init(p->p_emul);
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE,
SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
@@ -137,14 +144,16 @@ netbsd_sys___lstat13(p, v, retval)
register_t *retval;
{
register struct netbsd_sys___lstat13_args /* {
- syscallarg(const char *) path;
+ syscallarg(char *) path;
syscallarg(struct netbsd_stat *) ub;
} */ *uap = v;
struct netbsd_stat nsb;
struct stat sb;
int error;
struct nameidata nd;
+ caddr_t sg = stackgap_init(p->p_emul);
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
NDINIT(&nd, LOOKUP, NOFOLLOW | LOCKLEAF, UIO_USERSPACE,
SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
@@ -205,3 +214,67 @@ netbsd_sys___fstat13(p, v, retval)
error = copyout(&nsb, SCARG(uap, ub), sizeof(nsb));
return (error);
}
+
+int
+compat_43_netbsd_sys_stat(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct compat_43_netbsd_sys_stat_args /* {
+ syscallarg(char *) path;
+ syscallarg(struct ostat *) ub;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return compat_43_sys_stat(p, uap, retval);
+}
+
+int
+compat_43_netbsd_sys_lstat(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct compat_43_netbsd_sys_lstat_args /* {
+ syscallarg(char *) path;
+ syscallarg(struct ostat *) ub;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return compat_43_sys_lstat(p, uap, retval);
+}
+
+int
+netbsd_sys_stat(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_stat_args /* {
+ syscallarg(char *) path;
+ syscallarg(struct stat *) ub;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return sys_stat(p, uap, retval);
+}
+
+int
+netbsd_sys_lstat(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct netbsd_sys_lstat_args /* {
+ syscallarg(char *) path;
+ syscallarg(struct stat *) ub;
+ } */ *uap = v;
+ caddr_t sg = stackgap_init(p->p_emul);
+
+ NETBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return sys_lstat(p, uap, retval);
+}
diff --git a/sys/compat/netbsd/syscalls.master b/sys/compat/netbsd/syscalls.master
index 43a6a2af343..7424874d49b 100644
--- a/sys/compat/netbsd/syscalls.master
+++ b/sys/compat/netbsd/syscalls.master
@@ -1,4 +1,4 @@
-; $OpenBSD: syscalls.master,v 1.8 1999/09/17 15:03:18 kstailey Exp $
+; $OpenBSD: syscalls.master,v 1.9 1999/09/17 22:14:09 kstailey Exp $
; @(#)syscalls.master 8.2 (Berkeley) 1/13/94
@@ -60,25 +60,25 @@
4 NOARGS { ssize_t sys_write(int fd, const void *buf, \
size_t nbyte); }
; XXX int mode vs. mode_t mode
-5 NOARGS { int sys_open(const char *path, \
+5 STD { int netbsd_sys_open(char *path, \
int flags, ... int mode); }
6 NOARGS { int sys_close(int fd); }
7 NOARGS { int sys_wait4(int pid, int *status, int options, \
struct rusage *rusage); }
; XXX int mode vs. mode_t mode
-8 NOARGS { int compat_43_sys_creat(char *path, \
+8 STD { int compat_43_netbsd_sys_creat(char *path, \
int mode); } ocreat
-9 NOARGS { int sys_link(const char *path, const char *link); }
-10 NOARGS { int sys_unlink(const char *path); }
+9 STD { int netbsd_sys_link(char *path, char *link); }
+10 STD { int netbsd_sys_unlink(char *path); }
11 OBSOL execv
-12 NOARGS { int sys_chdir(const char *path); }
+12 STD { int netbsd_sys_chdir(char *path); }
13 NOARGS { int sys_fchdir(int fd); }
; XXX int mode vs. mode_t mode
-14 NOARGS { int sys_mknod(const char *path, int mode, \
+14 STD { int netbsd_sys_mknod(char *path, int mode, \
dev_t dev); }
; XXX int mode vs. mode_t mode
-15 NOARGS { int sys_chmod(const char *path, int mode); }
-16 NOARGS { int sys_chown(const char *path, uid_t uid, \
+15 STD { int netbsd_sys_chmod(char *path, int mode); }
+16 STD { int netbsd_sys_chown(char *path, uid_t uid, \
gid_t gid); }
17 NOARGS { int sys_obreak(char *nsize); } break
18 NOARGS { int sys_ogetfsstat(struct statfs *buf, long bufsize, \
@@ -88,7 +88,7 @@
20 NOARGS { pid_t sys_getpid(void); }
21 NOARGS { int sys_mount(const char *type, const char *path, \
int flags, void *data); }
-22 NOARGS { int sys_unmount(const char *path, int flags); }
+22 STD { int netbsd_sys_unmount(char *path, int flags); }
23 NOARGS { int sys_setuid(uid_t uid); }
24 NOARGS { uid_t sys_getuid(void); }
25 NOARGS { uid_t sys_geteuid(void); }
@@ -110,19 +110,19 @@
int *alen); }
32 NOARGS { int sys_getsockname(int fdes, struct sockaddr *asa, \
socklen_t *alen); }
-33 NOARGS { int sys_access(const char *path, int flags); }
+33 STD { int netbsd_sys_access(char *path, int flags); }
; XXX u_long flags vs. u_int flags
-34 NOARGS { int sys_chflags(const char *path, u_int flags); }
+34 STD { int netbsd_sys_chflags(char *path, u_int flags); }
; XXX u_long flags vs. u_int flags
35 NOARGS { int sys_fchflags(int fd, u_int flags); }
36 NOARGS { void sys_sync(void); }
37 NOARGS { int sys_kill(int pid, int signum); }
; XXX struct stat43 *ub vs. struct ostat *ub
-38 NOARGS { int sys_stat(const char *path, struct ostat *ub); } \
- ostat
+38 STD { int compat_43_netbsd_sys_stat(char *path, \
+ struct ostat *ub); } ostat
39 NOARGS { pid_t sys_getppid(void); }
; XXX struct stat43 *ub vs. struct ostat *ub
-40 NOARGS { int sys_lstat(char *path, \
+40 STD { int compat_43_netbsd_sys_lstat(char *path, \
struct ostat *ub); } olstat
41 NOARGS { int sys_dup(int fd); }
42 NOARGS { int sys_opipe(void); }
@@ -149,15 +149,14 @@
54 NOARGS { int sys_ioctl(int fd, \
u_long com, ... void *data); }
55 NOARGS { int sys_reboot(int opt); }
-56 NOARGS { int sys_revoke(const char *path); }
-57 NOARGS { int sys_symlink(const char *path, \
- const char *link); }
-58 NOARGS { int sys_readlink(const char *path, char *buf, \
+56 STD { int netbsd_sys_revoke(char *path); }
+57 STD { int netbsd_sys_symlink(char *path, char *link); }
+58 STD { int netbsd_sys_readlink(char *path, char *buf, \
size_t count); }
-59 NOARGS { int sys_execve(const char *path, \
- char * const *argp, char * const *envp); }
+59 STD { int netbsd_sys_execve(char *path, \
+ char **argp, char **envp); }
60 NOARGS { int sys_umask(int newmask); }
-61 NOARGS { int sys_chroot(const char *path); }
+61 STD { int netbsd_sys_chroot(char *path); }
62 NOARGS { int sys_fstat(int fd, struct ostat *sb); } ofstat
63 NOARGS { int compat_43_sys_getkerninfo(int op, char *where, \
int *size, int arg); } ogetkerninfo
@@ -261,21 +260,21 @@
osetreuid
127 NOARGS { int compat_43_sys_setregid(int rgid, int egid); } \
osetregid
-128 NOARGS { int sys_rename(const char *from, const char *to); }
-129 NOARGS { int compat_43_sys_truncate(char *path, \
+128 STD { int netbsd_sys_rename(char *from, char *to); }
+129 STD { int compat_43_netbsd_sys_truncate(char *path, \
long length); } otruncate
130 NOARGS { int compat_43_sys_ftruncate(int fd, long length); } \
oftruncate
131 NOARGS { int sys_flock(int fd, int how); }
-132 NOARGS { int sys_mkfifo(const char *path, int mode); }
+132 STD { int netbsd_sys_mkfifo(char *path, int mode); }
133 NOARGS { ssize_t sys_sendto(int s, const void *buf, \
size_t len, int flags, const struct sockaddr *to, \
socklen_t tolen); }
134 NOARGS { int sys_shutdown(int s, int how); }
135 NOARGS { int sys_socketpair(int domain, int type, \
int protocol, int *rsv); }
-136 NOARGS { int sys_mkdir(const char *path, int mode); }
-137 NOARGS { int sys_rmdir(const char *path); }
+136 STD { int netbsd_sys_mkdir(char *path, int mode); }
+137 STD { int netbsd_sys_rmdir(char *path); }
138 NOARGS { int sys_utimes(const char *path, \
const struct timeval *tptr); }
139 OBSOL 4.2 sigreturn
@@ -388,10 +387,10 @@
186 UNIMPL
187 UNIMPL
#endif
-188 NOARGS { int sys_stat(const char *path, struct stat *ub); }
+188 STD { int netbsd_sys_stat(char *path, struct stat *ub); }
189 NOARGS { int sys_fstat(int fd, struct stat12 *sb); }
-190 NOARGS { int sys_lstat(const char *path, struct stat *ub); }
-191 NOARGS { long sys_pathconf(const char *path, int name); }
+190 STD { int netbsd_sys_lstat(char *path, struct stat *ub); }
+191 STD { long netbsd_sys_pathconf(char *path, int name); }
192 NOARGS { long sys_fpathconf(int fd, int name); }
193 NOARGS { int sys_swapctl(int cmd, const void *arg, int misc); }
194 NOARGS { int sys_getrlimit(int which, \
@@ -405,7 +404,7 @@
198 INDIR { quad_t sys___syscall(quad_t num, ...); }
199 NOARGS { off_t sys_lseek(int fd, int pad, off_t offset, \
int whence); }
-200 NOARGS { int sys_truncate(const char *path, int pad, \
+200 STD { int netbsd_sys_truncate(char *path, int pad, \
off_t length); }
201 NOARGS { int sys_ftruncate(int fd, int pad, off_t length); }
202 NOARGS { int sys___sysctl(int *name, u_int namelen, \
@@ -552,11 +551,11 @@
276 STD { int netbsd_sys_lutimes(const char *path, \
const struct timeval *tptr); }
277 NOARGS { int sys_msync(void *addr, size_t len, int flags); }
-278 STD { int netbsd_sys___stat13(const char *path, \
+278 STD { int netbsd_sys___stat13(char *path, \
struct netbsd_stat *ub); }
279 STD { int netbsd_sys___fstat13(int fd, \
struct netbsd_stat *ub); }
-280 STD { int netbsd_sys___lstat13(const char *path, \
+280 STD { int netbsd_sys___lstat13(char *path, \
struct netbsd_stat *ub); }
281 STD { int netbsd_sys___sigaltstack14( \
const struct netbsd_sigaltstack *nss, \