summaryrefslogtreecommitdiff
path: root/sys/compat/netbsd/netbsd_stat.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/compat/netbsd/netbsd_stat.c')
-rw-r--r--sys/compat/netbsd/netbsd_stat.c206
1 files changed, 206 insertions, 0 deletions
diff --git a/sys/compat/netbsd/netbsd_stat.c b/sys/compat/netbsd/netbsd_stat.c
new file mode 100644
index 00000000000..eb97d3e6bf1
--- /dev/null
+++ b/sys/compat/netbsd/netbsd_stat.c
@@ -0,0 +1,206 @@
+/* $OpenBSD: netbsd_stat.c,v 1.1 1999/09/12 14:15:16 kstailey Exp $ */
+/*
+ * Copyright (c) 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ * (c) UNIX System Laboratories, Inc.
+ * All or some portions of this file are derived from material licensed
+ * to the University of California by American Telephone and Telegraph
+ * Co. or Unix System Laboratories, Inc. and are reproduced herein with
+ * the permission of UNIX System Laboratories, Inc.
+ *
+ * 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 by the University of
+ * California, Berkeley and its contributors.
+ * 4. 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.
+ *
+ * @(#)vfs_syscalls.c 8.42 (Berkeley) 7/31/95
+ */
+
+#include <sys/param.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/namei.h>
+#include <sys/vnode.h>
+#include <compat/netbsd/netbsd_types.h>
+#include <compat/netbsd/netbsd_stat.h>
+#include <compat/netbsd/netbsd_syscallargs.h>
+
+static void openbsd_to_netbsd_stat __P((struct stat *, struct netbsd_stat *));
+
+static void
+openbsd_to_netbsd_stat(obst, nbst)
+ struct stat *obst;
+ struct netbsd_stat *nbst;
+{
+ bzero(nbst, sizeof(*nbst));
+ nbst->st_dev = obst->st_dev;
+ nbst->st_ino = obst->st_ino;
+ nbst->st_mode = obst->st_mode;
+ nbst->st_nlink = obst->st_nlink;
+ nbst->st_uid = obst->st_uid;
+ nbst->st_gid = obst->st_gid;
+ nbst->st_rdev = obst->st_rdev;
+#if !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)
+ nbst->st_atimespec.tv_sec = obst->st_atimespec.tv_sec;
+ nbst->st_atimespec.tv_nsec = obst->st_atimespec.tv_nsec;
+ nbst->st_mtimespec.tv_sec = obst->st_mtimespec.tv_sec;
+ nbst->st_mtimespec.tv_nsec = obst->st_mtimespec.tv_nsec;
+ nbst->st_ctimespec.tv_sec = obst->st_ctimespec.tv_sec;
+ nbst->st_ctimespec.tv_nsec = obst->st_ctimespec.tv_nsec;
+#else
+ nbst->st_atime = obst->st_atime;
+ nbst->st_atimensec = obst->st_atimensec;
+ nbst->st_mtime = obst->st_mtime;
+ nbst->st_mtimensec = obst->st_mtimensec;
+ nbst->st_ctime = obst->st_ctime;
+ nbst->st_ctimensec = obst->st_ctimensec;
+#endif
+ nbst->st_size = obst->st_size;
+ nbst->st_blocks = obst->st_blocks;
+ nbst->st_blksize = obst->st_blksize;
+ nbst->st_flags = obst->st_flags;
+ nbst->st_gen = obst->st_gen;
+ memcpy(nbst->st_qspare, obst->st_qspare, sizeof(nbst->st_qspare));
+}
+
+/*
+ * Get file status; this version follows links.
+ */
+/* ARGSUSED */
+int
+netbsd_sys___stat13(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ register struct netbsd_sys___stat13_args /* {
+ syscallarg(const char *) path;
+ syscallarg(struct netbsd_stat *) nsb;
+ } */ *uap = v;
+ struct netbsd_stat nsb;
+ struct stat sb;
+ int error;
+ struct nameidata nd;
+
+ NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE,
+ SCARG(uap, path), p);
+ if ((error = namei(&nd)) != 0)
+ return (error);
+ error = vn_stat(nd.ni_vp, &sb, p);
+ vput(nd.ni_vp);
+ if (error)
+ return (error);
+ /* Don't let non-root see generation numbers (for NFS security) */
+ if (suser(p->p_ucred, &p->p_acflag))
+ sb.st_gen = 0;
+ openbsd_to_netbsd_stat(&sb, &nsb);
+ error = copyout(&nsb, SCARG(uap, ub), sizeof(nsb));
+ return (error);
+}
+
+/*
+ * Get file status; this version does not follow links.
+ */
+/* ARGSUSED */
+int
+netbsd_sys___lstat13(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ register struct netbsd_sys___lstat13_args /* {
+ syscallarg(const char *) path;
+ syscallarg(struct netbsd_stat *) nsb;
+ } */ *uap = v;
+ struct netbsd_stat nsb;
+ struct stat sb;
+ int error;
+ struct nameidata nd;
+
+ NDINIT(&nd, LOOKUP, NOFOLLOW | LOCKLEAF, UIO_USERSPACE,
+ SCARG(uap, path), p);
+ if ((error = namei(&nd)) != 0)
+ return (error);
+ error = vn_stat(nd.ni_vp, &sb, p);
+ vput(nd.ni_vp);
+ if (error)
+ return (error);
+ /* Don't let non-root see generation numbers (for NFS security) */
+ if (suser(p->p_ucred, &p->p_acflag))
+ sb.st_gen = 0;
+ openbsd_to_netbsd_stat(&sb, &nsb);
+ error = copyout(&nsb, SCARG(uap, ub), sizeof(nsb));
+ return (error);
+}
+
+/*
+ * Return status information about a file descriptor.
+ */
+/* ARGSUSED */
+int
+netbsd_sys___fstat13(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ register struct netbsd_sys___fstat13_args /* {
+ syscallarg(int) fd;
+ syscallarg(struct netbsd_stat *) nsb;
+ } */ *uap = v;
+ int fd = SCARG(uap, fd);
+ register struct filedesc *fdp = p->p_fd;
+ register struct file *fp;
+ struct netbsd_stat nsb;
+ struct stat sb;
+ int error;
+
+ if ((u_int)fd >= fdp->fd_nfiles ||
+ (fp = fdp->fd_ofiles[fd]) == NULL)
+ return (EBADF);
+ switch (fp->f_type) {
+
+ case DTYPE_VNODE:
+ error = vn_stat((struct vnode *)fp->f_data, &sb, p);
+ break;
+
+ case DTYPE_SOCKET:
+ error = soo_stat((struct socket *)fp->f_data, &sb);
+ break;
+
+ default:
+ panic("fstat");
+ /*NOTREACHED*/
+ }
+ if (error)
+ return (error);
+ openbsd_to_netbsd_stat(&sb, &nsb);
+ error = copyout(&nsb, SCARG(uap, ub), sizeof(nsb));
+ return (error);
+}