X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/127f7d76e6fc650e9450bf325ab8231bb31f61ec..fccd027da655d674c3552702cd6424e0be14bf8d:/usr/src/sys/kern/vfs_xxx.c diff --git a/usr/src/sys/kern/vfs_xxx.c b/usr/src/sys/kern/vfs_xxx.c index 21b271f904..1ea802db0b 100644 --- a/usr/src/sys/kern/vfs_xxx.c +++ b/usr/src/sys/kern/vfs_xxx.c @@ -1,45 +1,16 @@ -/* vfs_xxx.c 4.4 82/12/28 */ - -#include "../h/param.h" -#include "../h/systm.h" -#include "../h/inode.h" -#include "../h/fs.h" -#include "../h/mount.h" -#include "../h/dir.h" -#include "../h/user.h" -#include "../h/buf.h" -#include "../h/conf.h" - -/* - * Return the next character fromt the - * kernel string pointed at by dirp. - */ -schar() -{ - return (*u.u_dirp++ & 0377); -} - /* - * Return the next character from the - * user string pointed at by dirp. + * Copyright (c) 1982, 1986 Regents of the University of California. + * All rights reserved. The Berkeley software License Agreement + * specifies the terms and conditions for redistribution. + * + * @(#)vfs_xxx.c 7.3 (Berkeley) %G% */ -uchar() -{ - register c; - - c = fubyte(u.u_dirp++); - if (c == -1) { - u.u_error = EFAULT; - c = 0; - } - return (c); -} -#ifndef NOCOMPAT -#include "../h/file.h" -#include "../h/nami.h" -#include "../h/descrip.h" -#include "../h/kernel.h" +#ifdef COMPAT +#include "param.h" +#include "user.h" +#include "vnode.h" +#include "file.h" /* * Oh, how backwards compatibility is ugly!!! @@ -63,23 +34,16 @@ struct ostat { */ ofstat() { - register struct file *fp; + struct file *fp; register struct a { int fd; struct ostat *sb; - } *uap; + } *uap = (struct a *)u.u_ap; - uap = (struct a *)u.u_ap; - fp = getf(uap->fd); - if (fp == NULL) + u.u_error = getvnode(uap->fd, &fp); + if (u.u_error) return; - if (fp->f_type == DTYPE_SOCKET) { - struct ostat ub; - - bzero((caddr_t)&ub, sizeof (ub)); - (void) copyout((caddr_t)&ub, (caddr_t)uap->sb, sizeof (ub)); - } else - ostat1(fp->f_inode, uap->sb); + u.u_error = ostat1((struct inode *)fp->f_data, uap->sb); } /* @@ -87,41 +51,71 @@ ofstat() */ ostat() { - register struct inode *ip; + register struct vnode *vp; register struct a { char *fname; struct ostat *sb; - } *uap; + } *uap = (struct a *)u.u_ap; + register struct nameidata *ndp = &u.u_nd; - uap = (struct a *)u.u_ap; - ip = namei(uchar, LOOKUP, 1); - if (ip == NULL) + ndp->ni_nameiop = LOOKUP | FOLLOW; + ndp->ni_segflg = UIO_USERSPACE; + ndp->ni_dirp = uap->fname; + if (u.u_error = namei(ndp)) return; - ostat1(ip, uap->sb); - iput(ip); + ostat1(ndp->ni_vp, uap->sb); + vrele(ndp->ni_vp); } -ostat1(ip, ub) - register struct inode *ip; +ostat1(vp, ub) + register struct vnode *vp; struct ostat *ub; { struct ostat ds; + struct vattr vattr; + int error; - IUPDAT(ip, &time, &time, 0); + error = VOP_GETATTR(vp, &vattr, u.u_cred); + if (error) + return(error); /* * Copy from inode table */ - ds.ost_dev = ip->i_dev; - ds.ost_ino = (short)ip->i_number; - ds.ost_mode = (u_short)ip->i_mode; - ds.ost_nlink = ip->i_nlink; - ds.ost_uid = (short)ip->i_uid; - ds.ost_gid = (short)ip->i_gid; - ds.ost_rdev = (dev_t)ip->i_rdev; - ds.ost_size = (int)ip->i_size; - ds.ost_atime = (int)ip->i_atime; - ds.ost_mtime = (int)ip->i_mtime; - ds.ost_ctime = (int)ip->i_ctime; - u.u_error = copyout((caddr_t)&ds, (caddr_t)ub, sizeof(ds)); + ds.ost_dev = vattr.va_fsid; + ds.ost_ino = (short)vattr.va_fileid; + ds.ost_mode = (u_short)vattr.va_mode; + ds.ost_nlink = vattr.va_nlink; + ds.ost_uid = (short)vattr.va_uid; + ds.ost_gid = (short)vattr.va_gid; + ds.ost_rdev = (dev_t)vattr.va_rdev; + ds.ost_size = (int)vattr.va_size; + ds.ost_atime = (int)vattr.va_atime.tv_sec; + ds.ost_mtime = (int)vattr.va_mtime.tv_sec; + ds.ost_ctime = (int)vattr.va_atime.tv_sec; + return (copyout((caddr_t)&ds, (caddr_t)ub, sizeof(ds))); +} + +/* + * Set IUPD and IACC times on file. + * Can't set ICHG. + */ +outime() +{ + register struct a { + char *fname; + time_t *tptr; + } *uap = (struct a *)u.u_ap; + struct vattr vattr; + time_t tv[2]; + + u.u_error = copyin((caddr_t)uap->tptr, (caddr_t)tv, sizeof (tv)); + if (u.u_error) + return; + vattr_null(&vattr); + vattr.va_atime.tv_sec = tv[0]; + vattr.va_atime.tv_usec = 0; + vattr.va_mtime.tv_sec = tv[1]; + vattr.va_mtime.tv_usec = 0; + u.u_error = namesetattr(uap->fname, FOLLOW, &vattr); } #endif