diff options
author | kstailey <kstailey@cvs.openbsd.org> | 1999-09-17 22:14:10 +0000 |
---|---|---|
committer | kstailey <kstailey@cvs.openbsd.org> | 1999-09-17 22:14:10 +0000 |
commit | b73e02c6501ca7ce2da7e605e5abce47c21de69f (patch) | |
tree | 0d3cba034885e8d9a295fa9a163bd8ac150d8482 /sys/compat | |
parent | 49e1ec736d24dfc9311de1cd6f573483fcb05f00 (diff) |
alternate path
Diffstat (limited to 'sys/compat')
-rw-r--r-- | sys/compat/netbsd/files.netbsd | 3 | ||||
-rw-r--r-- | sys/compat/netbsd/netbsd_exec.c | 3 | ||||
-rw-r--r-- | sys/compat/netbsd/netbsd_file.c | 726 | ||||
-rw-r--r-- | sys/compat/netbsd/netbsd_stat.c | 81 | ||||
-rw-r--r-- | sys/compat/netbsd/syscalls.master | 65 |
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, \ |