root/compat/ibcs2/ibcs2_stat.c

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

DEFINITIONS

This source file includes following definitions.
  1. bsd_stat2ibcs_stat
  2. cvt_statfs
  3. ibcs2_sys_statfs
  4. ibcs2_sys_fstatfs
  5. ibcs2_sys_stat
  6. ibcs2_sys_lstat
  7. ibcs2_sys_fstat
  8. ibcs2_sys_utssys

    1 /*      $OpenBSD: ibcs2_stat.c,v 1.13 2004/07/09 23:52:02 millert Exp $ */
    2 /*      $NetBSD: ibcs2_stat.c,v 1.5 1996/05/03 17:05:32 christos Exp $  */
    3 
    4 /*
    5  * Copyright (c) 1995 Scott Bartram
    6  * All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  * 3. The name of the author may not be used to endorse or promote products
   17  *    derived from this software without specific prior written permission
   18  *
   19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   20  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   21  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   22  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   23  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   24  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   28  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   29  */
   30 
   31 #include <sys/param.h>
   32 #include <sys/systm.h>
   33 #include <sys/namei.h>
   34 #include <sys/proc.h>
   35 #include <sys/file.h>
   36 #include <sys/stat.h>
   37 #include <sys/filedesc.h>
   38 #include <sys/ioctl.h>
   39 #include <sys/kernel.h>
   40 #include <sys/mount.h>
   41 #include <sys/malloc.h>
   42 #include <sys/vnode.h>
   43 #include <sys/syscallargs.h>
   44 
   45 #include <uvm/uvm_extern.h>
   46 
   47 #include <compat/ibcs2/ibcs2_types.h>
   48 #include <compat/ibcs2/ibcs2_fcntl.h>
   49 #include <compat/ibcs2/ibcs2_signal.h>
   50 #include <compat/ibcs2/ibcs2_stat.h>
   51 #include <compat/ibcs2/ibcs2_statfs.h>
   52 #include <compat/ibcs2/ibcs2_syscallargs.h>
   53 #include <compat/ibcs2/ibcs2_ustat.h>
   54 #include <compat/ibcs2/ibcs2_util.h>
   55 #include <compat/ibcs2/ibcs2_utsname.h>
   56 
   57 static void bsd_stat2ibcs_stat(struct stat43 *, struct ibcs2_stat *);
   58 static int cvt_statfs(struct statfs *, caddr_t, int);
   59 
   60 static void
   61 bsd_stat2ibcs_stat(st, st4)
   62         struct stat43 *st;
   63         struct ibcs2_stat *st4;
   64 {
   65         bzero(st4, sizeof(*st4));
   66         st4->st_dev = (ibcs2_dev_t)st->st_dev;
   67         st4->st_ino = (ibcs2_ino_t)st->st_ino;
   68         st4->st_mode = (ibcs2_mode_t)st->st_mode;
   69         st4->st_nlink = (ibcs2_nlink_t)st->st_nlink;
   70         st4->st_uid = (ibcs2_uid_t)st->st_uid;
   71         st4->st_gid = (ibcs2_gid_t)st->st_gid;
   72         st4->st_rdev = (ibcs2_dev_t)st->st_rdev;
   73         st4->st_size = (ibcs2_off_t)st->st_size;
   74         st4->st_atim = (ibcs2_time_t)st->st_atime;
   75         st4->st_mtim = (ibcs2_time_t)st->st_mtime;
   76         st4->st_ctim = (ibcs2_time_t)st->st_ctime;
   77 }
   78 
   79 static int
   80 cvt_statfs(sp, buf, len)
   81         struct statfs *sp;
   82         caddr_t buf;
   83         int len;
   84 {
   85         struct ibcs2_statfs ssfs;
   86 
   87         if (len < 0)
   88                 return (EINVAL);
   89         if (len > sizeof(ssfs))
   90                 len = sizeof(ssfs);
   91 
   92         bzero(&ssfs, sizeof ssfs);
   93         ssfs.f_fstyp = 0;
   94         ssfs.f_bsize = sp->f_bsize;
   95         ssfs.f_frsize = 0;
   96         ssfs.f_blocks = sp->f_blocks;
   97         ssfs.f_bfree = sp->f_bfree;
   98         ssfs.f_files = sp->f_files;
   99         ssfs.f_ffree = sp->f_ffree;
  100         ssfs.f_fname[0] = 0;
  101         ssfs.f_fpack[0] = 0;
  102         return copyout((caddr_t)&ssfs, buf, len);
  103 }       
  104 
  105 int
  106 ibcs2_sys_statfs(p, v, retval)
  107         struct proc *p;
  108         void *v;
  109         register_t *retval;
  110 {
  111         struct ibcs2_sys_statfs_args /* {
  112                 syscallarg(char *) path;
  113                 syscallarg(struct ibcs2_statfs *) buf;
  114                 syscallarg(int) len;
  115                 syscallarg(int) fstype;
  116         } */ *uap = v;
  117         register struct mount *mp;
  118         register struct statfs *sp;
  119         int error;
  120         struct nameidata nd;
  121         caddr_t sg = stackgap_init(p->p_emul);
  122 
  123         IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
  124         NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
  125         if ((error = namei(&nd)) != 0)
  126                 return (error);
  127         mp = nd.ni_vp->v_mount;
  128         sp = &mp->mnt_stat;
  129         vrele(nd.ni_vp);
  130         if ((error = VFS_STATFS(mp, sp, p)) != 0)
  131                 return (error);
  132         sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
  133         return cvt_statfs(sp, (caddr_t)SCARG(uap, buf), SCARG(uap, len));
  134 }
  135 
  136 int
  137 ibcs2_sys_fstatfs(p, v, retval)
  138         struct proc *p;
  139         void *v;
  140         register_t *retval;
  141 {
  142         struct ibcs2_sys_fstatfs_args /* {
  143                 syscallarg(int) fd;
  144                 syscallarg(struct ibcs2_statfs *) buf;
  145                 syscallarg(int) len;
  146                 syscallarg(int) fstype;
  147         } */ *uap = v;
  148         struct file *fp;
  149         struct mount *mp;
  150         register struct statfs *sp;
  151         int error;
  152 
  153         if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
  154                 return (error);
  155         mp = ((struct vnode *)fp->f_data)->v_mount;
  156         sp = &mp->mnt_stat;
  157         error = VFS_STATFS(mp, sp, p);
  158         FRELE(fp);
  159         if (error)
  160                 return (error);
  161         sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
  162         return cvt_statfs(sp, (caddr_t)SCARG(uap, buf), SCARG(uap, len));
  163 }
  164 
  165 int
  166 ibcs2_sys_stat(p, v, retval)
  167         struct proc *p;
  168         void *v;
  169         register_t *retval;
  170 {
  171         struct ibcs2_sys_stat_args /* {
  172                 syscallarg(char *) path;
  173                 syscallarg(struct ibcs2_stat *) st;
  174         } */ *uap = v;
  175         struct stat43 st;
  176         struct ibcs2_stat ibcs2_st;
  177         struct compat_43_sys_stat_args cup;
  178         int error;
  179         caddr_t sg = stackgap_init(p->p_emul);
  180 
  181         SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(st));
  182         IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
  183         SCARG(&cup, path) = SCARG(uap, path);
  184 
  185         if ((error = compat_43_sys_stat(p, &cup, retval)) != 0)
  186                 return error;
  187         if ((error = copyin(SCARG(&cup, ub), &st, sizeof(st))) != 0)
  188                 return error;
  189         bsd_stat2ibcs_stat(&st, &ibcs2_st);
  190         return copyout((caddr_t)&ibcs2_st, (caddr_t)SCARG(uap, st),
  191                        ibcs2_stat_len);
  192 }
  193 
  194 int
  195 ibcs2_sys_lstat(p, v, retval)
  196         struct proc *p;
  197         void *v;
  198         register_t *retval;
  199 {
  200         struct ibcs2_sys_lstat_args /* {
  201                 syscallarg(char *) path;
  202                 syscallarg(struct ibcs2_stat *) st;
  203         } */ *uap = v;
  204         struct stat43 st;
  205         struct ibcs2_stat ibcs2_st;
  206         struct compat_43_sys_lstat_args cup;
  207         int error;
  208         caddr_t sg = stackgap_init(p->p_emul);
  209 
  210         SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(st));
  211         IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
  212         SCARG(&cup, path) = SCARG(uap, path);
  213 
  214         if ((error = compat_43_sys_lstat(p, &cup, retval)) != 0)
  215                 return error;
  216         if ((error = copyin(SCARG(&cup, ub), &st, sizeof(st))) != 0)
  217                 return error;
  218         bsd_stat2ibcs_stat(&st, &ibcs2_st);
  219         return copyout((caddr_t)&ibcs2_st, (caddr_t)SCARG(uap, st),
  220                        ibcs2_stat_len);
  221 }
  222 
  223 int
  224 ibcs2_sys_fstat(p, v, retval)
  225         struct proc *p;
  226         void *v;
  227         register_t *retval;
  228 {
  229         struct ibcs2_sys_fstat_args /* {
  230                 syscallarg(int) fd;
  231                 syscallarg(struct ibcs2_stat *) st;
  232         } */ *uap = v;
  233         struct stat43 st;
  234         struct ibcs2_stat ibcs2_st;
  235         struct compat_43_sys_fstat_args cup;
  236         int error;
  237         caddr_t sg = stackgap_init(p->p_emul);
  238 
  239         SCARG(&cup, fd) = SCARG(uap, fd);
  240         SCARG(&cup, sb) = stackgap_alloc(&sg, sizeof(st));
  241         if ((error = compat_43_sys_fstat(p, &cup, retval)) != 0)
  242                 return error;
  243         if ((error = copyin(SCARG(&cup, sb), &st, sizeof(st))) != 0)
  244                 return error;
  245         bsd_stat2ibcs_stat(&st, &ibcs2_st);
  246         return copyout((caddr_t)&ibcs2_st, (caddr_t)SCARG(uap, st),
  247                        ibcs2_stat_len);
  248 }
  249 
  250 int
  251 ibcs2_sys_utssys(p, v, retval)
  252         struct proc *p;
  253         void *v;
  254         register_t *retval;
  255 {
  256         struct ibcs2_sys_utssys_args /* {
  257                 syscallarg(int) a1;
  258                 syscallarg(int) a2;
  259                 syscallarg(int) flag;
  260         } */ *uap = v;
  261 
  262         switch (SCARG(uap, flag)) {
  263         case 0:                 /* uname(2) */
  264         {
  265                 struct ibcs2_utsname sut;
  266                 extern char machine[];
  267 
  268                 bzero(&sut, ibcs2_utsname_len);
  269                 bcopy(ostype, sut.sysname, sizeof(sut.sysname) - 1);
  270                 bcopy(hostname, sut.nodename, sizeof(sut.nodename));
  271                 sut.nodename[sizeof(sut.nodename)-1] = '\0';
  272                 bcopy(osrelease, sut.release, sizeof(sut.release) - 1);
  273                 strlcpy(sut.version, "1", sizeof(sut.version));
  274                 bcopy(machine, sut.machine, sizeof(sut.machine) - 1);
  275 
  276                 return copyout((caddr_t)&sut, (caddr_t)SCARG(uap, a1),
  277                                ibcs2_utsname_len);
  278         }
  279 
  280         case 2:                 /* ustat(2) */
  281         {
  282                 return ENOSYS;  /* XXX - TODO */
  283         }
  284 
  285         default:
  286                 return ENOSYS;
  287         }
  288 }

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