root/compat/common/vfs_syscalls_35.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. cvtstat
  2. compat_35_sys_stat
  3. compat_35_sys_lstat
  4. compat_35_sys_fstat
  5. compat_35_sys_fhstat

    1 /*      $OpenBSD: vfs_syscalls_35.c,v 1.3 2004/07/14 18:57:57 millert Exp $     */
    2 
    3 /*
    4  * Copyright (c) 1989, 1993
    5  *      The Regents of the University of California.  All rights reserved.
    6  * (c) UNIX System Laboratories, Inc.
    7  * All or some portions of this file are derived from material licensed
    8  * to the University of California by American Telephone and Telegraph
    9  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
   10  * the permission of UNIX System Laboratories, Inc.
   11  *
   12  * Redistribution and use in source and binary forms, with or without
   13  * modification, are permitted provided that the following conditions
   14  * are met:
   15  * 1. Redistributions of source code must retain the above copyright
   16  *    notice, this list of conditions and the following disclaimer.
   17  * 2. Redistributions in binary form must reproduce the above copyright
   18  *    notice, this list of conditions and the following disclaimer in the
   19  *    documentation and/or other materials provided with the distribution.
   20  * 3. Neither the name of the University nor the names of its contributors
   21  *    may be used to endorse or promote products derived from this software
   22  *    without specific prior written permission.
   23  *
   24  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   27  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   34  * SUCH DAMAGE.
   35  *
   36  *      @(#)vfs_syscalls.c      8.28 (Berkeley) 12/10/94
   37  */
   38 
   39 #include <sys/param.h>
   40 #include <sys/systm.h>
   41 #include <sys/filedesc.h>
   42 #include <sys/kernel.h>
   43 #include <sys/proc.h>
   44 #include <sys/file.h>
   45 #include <sys/vnode.h>
   46 #include <sys/namei.h>
   47 #include <sys/dirent.h>
   48 #include <sys/socket.h>
   49 #include <sys/socketvar.h>
   50 #include <sys/stat.h>
   51 
   52 #include <sys/mount.h>
   53 #include <sys/syscallargs.h>
   54 
   55 static void cvtstat(struct stat *, struct stat35 *);
   56 
   57 /*
   58  * Convert from a new to an old stat structure.
   59  */
   60 static void
   61 cvtstat(struct stat *st, struct stat35 *ost)
   62 {
   63 
   64         ost->st_dev = st->st_dev;
   65         ost->st_ino = st->st_ino;
   66         ost->st_mode = st->st_mode & 0xffff;
   67         ost->st_nlink = st->st_nlink & 0xffff;
   68         ost->st_uid = st->st_uid;
   69         ost->st_gid = st->st_gid;
   70         ost->st_rdev = st->st_rdev;
   71         ost->st_atimespec = st->st_atimespec;
   72         ost->st_mtimespec = st->st_mtimespec;
   73         ost->st_ctimespec = st->st_ctimespec;
   74         ost->st_size = st->st_size;
   75         ost->st_blocks = st->st_blocks;
   76         ost->st_blksize = st->st_blksize;
   77         ost->st_flags = st->st_flags;
   78         ost->st_gen = st->st_gen;
   79 }
   80 
   81 /*
   82  * Get file status; this version follows links.
   83  */
   84 /* ARGSUSED */
   85 int
   86 compat_35_sys_stat(struct proc *p, void *v, register_t *retval)
   87 {
   88         struct compat_35_sys_stat_args /* {
   89                 syscallarg(char *) path;
   90                 syscallarg(struct stat35 *) ub;
   91         } */ *uap = v;
   92         struct stat sb;
   93         struct stat35 osb;
   94         int error;
   95         struct nameidata nd;
   96 
   97         NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE,
   98             SCARG(uap, path), p);
   99         if ((error = namei(&nd)) != 0)
  100                 return (error);
  101         error = vn_stat(nd.ni_vp, &sb, p);
  102         vput(nd.ni_vp);
  103         if (error)
  104                 return (error);
  105         /* Don't let non-root see generation numbers (for NFS security) */
  106         if (suser(p, 0))
  107                 sb.st_gen = 0;
  108         cvtstat(&sb, &osb);
  109         error = copyout(&osb, SCARG(uap, ub), sizeof(osb));
  110         return (error);
  111 }
  112 
  113 /*
  114  * Get file status; this version does not follow links.
  115  */
  116 /* ARGSUSED */
  117 int
  118 compat_35_sys_lstat(struct proc *p, void *v, register_t *retval)
  119 {
  120         struct compat_35_sys_lstat_args /* {
  121                 syscallarg(char *) path;
  122                 syscallarg(struct stat35 *) ub;
  123         } */ *uap = v;
  124         struct stat sb;
  125         struct stat35 osb;
  126         int error;
  127         struct nameidata nd;
  128 
  129         NDINIT(&nd, LOOKUP, NOFOLLOW | LOCKLEAF, UIO_USERSPACE,
  130             SCARG(uap, path), p);
  131         if ((error = namei(&nd)) != 0)
  132                 return (error);
  133         error = vn_stat(nd.ni_vp, &sb, p);
  134         vput(nd.ni_vp);
  135         if (error)
  136                 return (error);
  137         /* Don't let non-root see generation numbers (for NFS security) */
  138         if (suser(p, 0))
  139                 sb.st_gen = 0;
  140         cvtstat(&sb, &osb);
  141         error = copyout(&osb, SCARG(uap, ub), sizeof(osb));
  142         return (error);
  143 }
  144 
  145 /*
  146  * Return status information about a file descriptor.
  147  */
  148 /* ARGSUSED */
  149 int
  150 compat_35_sys_fstat(struct proc *p, void *v, register_t *retval)
  151 {
  152         struct compat_35_sys_fstat_args /* {
  153                 syscallarg(int) fd;
  154                 syscallarg(struct stat35 *) sb;
  155         } */ *uap = v;
  156         int fd = SCARG(uap, fd);
  157         struct filedesc *fdp = p->p_fd;
  158         struct file *fp;
  159         struct stat ub;
  160         struct stat35 oub;
  161         int error;
  162 
  163         if ((fp = fd_getfile(fdp, fd)) == NULL)
  164                 return (EBADF);
  165         FREF(fp);
  166         error = (*fp->f_ops->fo_stat)(fp, &ub, p);
  167         FRELE(fp);
  168         if (error == 0) {
  169                 /* Don't let non-root see generation numbers
  170                    (for NFS security) */
  171                 if (suser(p, 0))
  172                         ub.st_gen = 0;
  173                 cvtstat(&ub, &oub);
  174                 error = copyout(&oub, SCARG(uap, sb), sizeof(oub));
  175         }
  176         return (error);
  177 }
  178 
  179 /* ARGSUSED */
  180 int
  181 compat_35_sys_fhstat(struct proc *p, void *v, register_t *retval)
  182 {
  183         struct sys_fhstat_args /* {
  184                 syscallarg(const fhandle_t *) fhp;
  185                 syscallarg(struct stat35 *) sb;
  186         } */ *uap = v;
  187         struct stat ub;
  188         struct stat35 oub;
  189         int error;
  190         fhandle_t fh;
  191         struct mount *mp;
  192         struct vnode *vp;
  193 
  194         /*
  195          * Must be super user
  196          */
  197         if ((error = suser(p, 0)))
  198                 return (error);
  199 
  200         if ((error = copyin(SCARG(uap, fhp), &fh, sizeof(fhandle_t))) != 0)
  201                 return (error);
  202 
  203         if ((mp = vfs_getvfs(&fh.fh_fsid)) == NULL)
  204                 return (ESTALE);
  205         if ((error = VFS_FHTOVP(mp, &fh.fh_fid, &vp)))
  206                 return (error);
  207         error = vn_stat(vp, &ub, p);
  208         vput(vp);
  209         if (error)
  210                 return (error);
  211         cvtstat(&ub, &oub);
  212         error = copyout(&oub, SCARG(uap, sb), sizeof(oub));
  213         return (error);
  214 }

/* [<][>][^][v][top][bottom][index][help] */