ibcs2_stat.c revision 11397
111394Sswallace/* 211394Sswallace * Copyright (c) 1995 Scott Bartram 311397Sswallace * Copyright (c) 1995 Steven Wallace 411394Sswallace * All rights reserved. 511394Sswallace * 611394Sswallace * Redistribution and use in source and binary forms, with or without 711394Sswallace * modification, are permitted provided that the following conditions 811394Sswallace * are met: 911394Sswallace * 1. Redistributions of source code must retain the above copyright 1011394Sswallace * notice, this list of conditions and the following disclaimer. 1111394Sswallace * 2. Redistributions in binary form must reproduce the above copyright 1211394Sswallace * notice, this list of conditions and the following disclaimer in the 1311394Sswallace * documentation and/or other materials provided with the distribution. 1411394Sswallace * 3. The name of the author may not be used to endorse or promote products 1511394Sswallace * derived from this software without specific prior written permission 1611394Sswallace * 1711394Sswallace * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1811394Sswallace * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1911394Sswallace * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2011394Sswallace * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2111394Sswallace * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2211394Sswallace * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311394Sswallace * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411394Sswallace * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511394Sswallace * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2611394Sswallace * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711394Sswallace */ 2811394Sswallace 2911394Sswallace#include <sys/param.h> 3011394Sswallace#include <sys/systm.h> 3111394Sswallace#include <sys/namei.h> 3211394Sswallace#include <sys/proc.h> 3311394Sswallace#include <sys/file.h> 3411394Sswallace#include <sys/stat.h> 3511394Sswallace#include <sys/filedesc.h> 3611394Sswallace#include <sys/ioctl.h> 3711394Sswallace#include <sys/kernel.h> 3811394Sswallace#include <sys/mount.h> 3911394Sswallace#include <sys/malloc.h> 4011394Sswallace#include <sys/vnode.h> 4111397Sswallace#include <sys/sysctl.h> 4211397Sswallace#include <sys/sysproto.h> 4311394Sswallace 4411394Sswallace#include <vm/vm.h> 4511394Sswallace 4611397Sswallace#include <i386/ibcs2/ibcs2_types.h> 4711397Sswallace#include <i386/ibcs2/ibcs2_fcntl.h> 4811397Sswallace#include <i386/ibcs2/ibcs2_signal.h> 4911397Sswallace#include <i386/ibcs2/ibcs2_stat.h> 5011397Sswallace#include <i386/ibcs2/ibcs2_statfs.h> 5111397Sswallace#include <i386/ibcs2/ibcs2_proto.h> 5211397Sswallace#include <i386/ibcs2/ibcs2_ustat.h> 5311397Sswallace#include <i386/ibcs2/ibcs2_util.h> 5411397Sswallace#include <i386/ibcs2/ibcs2_utsname.h> 5511394Sswallace 5611397Sswallacestatic void bsd_stat2ibcs_stat __P((struct stat *, struct ibcs2_stat *)); 5711397Sswallacestatic int cvt_statfs __P((struct statfs *, caddr_t, int)); 5811394Sswallace 5911394Sswallacestatic void 6011394Sswallacebsd_stat2ibcs_stat(st, st4) 6111397Sswallace struct stat *st; 6211394Sswallace struct ibcs2_stat *st4; 6311394Sswallace{ 6411394Sswallace bzero(st4, sizeof(*st4)); 6511397Sswallace st4->st_dev = (ibcs2_dev_t)st->st_dev; 6611397Sswallace st4->st_ino = (ibcs2_ino_t)st->st_ino; 6711394Sswallace st4->st_mode = (ibcs2_mode_t)st->st_mode; 6811397Sswallace st4->st_nlink= (ibcs2_nlink_t)st->st_nlink; 6911397Sswallace st4->st_uid = (ibcs2_uid_t)st->st_uid; 7011397Sswallace st4->st_gid = (ibcs2_gid_t)st->st_gid; 7111394Sswallace st4->st_rdev = (ibcs2_dev_t)st->st_rdev; 7211397Sswallace if (st->st_size < (quad_t)1 << 32) 7311397Sswallace st4->st_size = (ibcs2_off_t)st->st_size; 7411397Sswallace else 7511397Sswallace st4->st_size = -2; 7611394Sswallace st4->st_atim = (ibcs2_time_t)st->st_atime; 7711394Sswallace st4->st_mtim = (ibcs2_time_t)st->st_mtime; 7811394Sswallace st4->st_ctim = (ibcs2_time_t)st->st_ctime; 7911394Sswallace} 8011394Sswallace 8111394Sswallacestatic int 8211394Sswallacecvt_statfs(sp, buf, len) 8311394Sswallace struct statfs *sp; 8411394Sswallace caddr_t buf; 8511394Sswallace int len; 8611394Sswallace{ 8711394Sswallace struct ibcs2_statfs ssfs; 8811394Sswallace 8911394Sswallace bzero(&ssfs, sizeof ssfs); 9011394Sswallace ssfs.f_fstyp = 0; 9111394Sswallace ssfs.f_bsize = sp->f_bsize; 9211394Sswallace ssfs.f_frsize = 0; 9311394Sswallace ssfs.f_blocks = sp->f_blocks; 9411394Sswallace ssfs.f_bfree = sp->f_bfree; 9511394Sswallace ssfs.f_files = sp->f_files; 9611394Sswallace ssfs.f_ffree = sp->f_ffree; 9711394Sswallace ssfs.f_fname[0] = 0; 9811394Sswallace ssfs.f_fpack[0] = 0; 9911394Sswallace return copyout((caddr_t)&ssfs, buf, len); 10011394Sswallace} 10111394Sswallace 10211394Sswallaceint 10311394Sswallaceibcs2_statfs(p, uap, retval) 10411394Sswallace struct proc *p; 10511394Sswallace struct ibcs2_statfs_args *uap; 10611394Sswallace int *retval; 10711394Sswallace{ 10811394Sswallace register struct mount *mp; 10911394Sswallace register struct statfs *sp; 11011394Sswallace int error; 11111394Sswallace struct nameidata nd; 11211394Sswallace caddr_t sg = stackgap_init(); 11311394Sswallace 11411394Sswallace CHECKALTEXIST(p, &sg, SCARG(uap, path)); 11511394Sswallace NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p); 11611394Sswallace if (error = namei(&nd)) 11711394Sswallace return (error); 11811394Sswallace mp = nd.ni_vp->v_mount; 11911394Sswallace sp = &mp->mnt_stat; 12011394Sswallace vrele(nd.ni_vp); 12111394Sswallace if (error = VFS_STATFS(mp, sp, p)) 12211394Sswallace return (error); 12311394Sswallace sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK; 12411394Sswallace return cvt_statfs(sp, (caddr_t)SCARG(uap, buf), SCARG(uap, len)); 12511394Sswallace} 12611394Sswallace 12711394Sswallaceint 12811394Sswallaceibcs2_fstatfs(p, uap, retval) 12911394Sswallace struct proc *p; 13011394Sswallace struct ibcs2_fstatfs_args *uap; 13111394Sswallace int *retval; 13211394Sswallace{ 13311394Sswallace struct file *fp; 13411394Sswallace struct mount *mp; 13511394Sswallace register struct statfs *sp; 13611394Sswallace int error; 13711394Sswallace 13811394Sswallace if (error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) 13911394Sswallace return (error); 14011394Sswallace mp = ((struct vnode *)fp->f_data)->v_mount; 14111394Sswallace sp = &mp->mnt_stat; 14211394Sswallace if (error = VFS_STATFS(mp, sp, p)) 14311394Sswallace return (error); 14411394Sswallace sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK; 14511394Sswallace return cvt_statfs(sp, (caddr_t)SCARG(uap, buf), SCARG(uap, len)); 14611394Sswallace} 14711394Sswallace 14811394Sswallaceint 14911394Sswallaceibcs2_stat(p, uap, retval) 15011394Sswallace struct proc *p; 15111394Sswallace struct ibcs2_stat_args *uap; 15211394Sswallace int *retval; 15311394Sswallace{ 15411397Sswallace struct stat st; 15511394Sswallace struct ibcs2_stat ibcs2_st; 15611397Sswallace struct stat_args cup; 15711394Sswallace int error; 15811394Sswallace caddr_t sg = stackgap_init(); 15911394Sswallace 16011394Sswallace CHECKALTEXIST(p, &sg, SCARG(uap, path)); 16111394Sswallace SCARG(&cup, path) = SCARG(uap, path); 16211394Sswallace SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(st)); 16311397Sswallace 16411397Sswallace if (error = stat(p, &cup, retval)) 16511394Sswallace return error; 16611397Sswallace 16711394Sswallace if (error = copyin(SCARG(&cup, ub), &st, sizeof(st))) 16811394Sswallace return error; 16911394Sswallace bsd_stat2ibcs_stat(&st, &ibcs2_st); 17011394Sswallace return copyout((caddr_t)&ibcs2_st, (caddr_t)SCARG(uap, st), 17111394Sswallace ibcs2_stat_len); 17211394Sswallace} 17311394Sswallace 17411394Sswallaceint 17511394Sswallaceibcs2_lstat(p, uap, retval) 17611394Sswallace struct proc *p; 17711394Sswallace struct ibcs2_lstat_args *uap; 17811394Sswallace int *retval; 17911394Sswallace{ 18011397Sswallace struct stat st; 18111394Sswallace struct ibcs2_stat ibcs2_st; 18211397Sswallace struct lstat_args cup; 18311394Sswallace int error; 18411394Sswallace caddr_t sg = stackgap_init(); 18511394Sswallace 18611394Sswallace CHECKALTEXIST(p, &sg, SCARG(uap, path)); 18711394Sswallace SCARG(&cup, path) = SCARG(uap, path); 18811394Sswallace SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(st)); 18911397Sswallace 19011397Sswallace if (error = lstat(p, &cup, retval)) 19111394Sswallace return error; 19211397Sswallace 19311394Sswallace if (error = copyin(SCARG(&cup, ub), &st, sizeof(st))) 19411394Sswallace return error; 19511394Sswallace bsd_stat2ibcs_stat(&st, &ibcs2_st); 19611394Sswallace return copyout((caddr_t)&ibcs2_st, (caddr_t)SCARG(uap, st), 19711394Sswallace ibcs2_stat_len); 19811394Sswallace} 19911394Sswallace 20011394Sswallaceint 20111394Sswallaceibcs2_fstat(p, uap, retval) 20211394Sswallace struct proc *p; 20311394Sswallace struct ibcs2_fstat_args *uap; 20411394Sswallace int *retval; 20511394Sswallace{ 20611397Sswallace struct stat st; 20711394Sswallace struct ibcs2_stat ibcs2_st; 20811397Sswallace struct fstat_args cup; 20911394Sswallace int error; 21011394Sswallace caddr_t sg = stackgap_init(); 21111394Sswallace 21211394Sswallace SCARG(&cup, fd) = SCARG(uap, fd); 21311394Sswallace SCARG(&cup, sb) = stackgap_alloc(&sg, sizeof(st)); 21411397Sswallace 21511397Sswallace if (error = fstat(p, &cup, retval)) 21611394Sswallace return error; 21711397Sswallace 21811394Sswallace if (error = copyin(SCARG(&cup, sb), &st, sizeof(st))) 21911394Sswallace return error; 22011394Sswallace bsd_stat2ibcs_stat(&st, &ibcs2_st); 22111394Sswallace return copyout((caddr_t)&ibcs2_st, (caddr_t)SCARG(uap, st), 22211394Sswallace ibcs2_stat_len); 22311394Sswallace} 22411394Sswallace 22511394Sswallaceint 22611394Sswallaceibcs2_utssys(p, uap, retval) 22711394Sswallace struct proc *p; 22811394Sswallace struct ibcs2_utssys_args *uap; 22911394Sswallace int *retval; 23011394Sswallace{ 23111394Sswallace switch (SCARG(uap, flag)) { 23211394Sswallace case 0: /* uname(2) */ 23311394Sswallace { 23411394Sswallace struct ibcs2_utsname sut; 23511394Sswallace 23611394Sswallace bzero(&sut, ibcs2_utsname_len); 23711394Sswallace bcopy(ostype, sut.sysname, sizeof(sut.sysname) - 1); 23811394Sswallace bcopy(hostname, sut.nodename, sizeof(sut.nodename)); 23911394Sswallace sut.nodename[sizeof(sut.nodename)-1] = '\0'; 24011394Sswallace bcopy(osrelease, sut.release, sizeof(sut.release) - 1); 24111394Sswallace bcopy("1", sut.version, sizeof(sut.version) - 1); 24211394Sswallace bcopy(machine, sut.machine, sizeof(sut.machine) - 1); 24311394Sswallace 24411394Sswallace return copyout((caddr_t)&sut, (caddr_t)SCARG(uap, a1), 24511394Sswallace ibcs2_utsname_len); 24611394Sswallace } 24711394Sswallace 24811394Sswallace case 2: /* ustat(2) */ 24911394Sswallace { 25011394Sswallace return ENOSYS; /* XXX - TODO */ 25111394Sswallace } 25211394Sswallace 25311394Sswallace default: 25411394Sswallace return ENOSYS; 25511394Sswallace } 25611394Sswallace} 257