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