X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/2a9ead0d6b1d5a5210dd844bb0d26c56a61e91de..5c723b90ceb41c125105d2a818e372ee31f2e522:/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 24b00352f9..eaf7b9c9dd 100644 --- a/usr/src/sys/kern/vfs_xxx.c +++ b/usr/src/sys/kern/vfs_xxx.c @@ -1,36 +1,129 @@ -/* vfs_xxx.c 4.1 82/10/20 */ - -#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" +/* + * 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.1 (Berkeley) %G% + */ + +#include "param.h" +#include "systm.h" +#include "inode.h" +#include "fs.h" +#include "mount.h" +#include "dir.h" +#include "user.h" +#include "buf.h" +#include "conf.h" + +#ifdef COMPAT +#include "file.h" +#include "kernel.h" + +/* + * Oh, how backwards compatibility is ugly!!! + */ +struct ostat { + dev_t ost_dev; + u_short ost_ino; + u_short ost_mode; + short ost_nlink; + short ost_uid; + short ost_gid; + dev_t ost_rdev; + int ost_size; + int ost_atime; + int ost_mtime; + int ost_ctime; +}; + +/* + * The old fstat system call. + */ +ofstat() +{ + register struct file *fp; + register struct a { + int fd; + struct ostat *sb; + } *uap = (struct a *)u.u_ap; + extern struct file *getinode(); + + fp = getinode(uap->fd); + if (fp == NULL) + return; + ostat1((struct inode *)fp->f_data, uap->sb); +} /* - * Return the next character fromt the - * kernel string pointed at by dirp. + * Old stat system call. This version follows links. */ -schar() +ostat() { - return (*u.u_dirp++ & 0377); + register struct inode *ip; + register struct a { + char *fname; + struct ostat *sb; + } *uap = (struct a *)u.u_ap; + register struct nameidata *ndp = &u.u_nd; + + ndp->ni_nameiop = LOOKUP | FOLLOW; + ndp->ni_segflg = UIO_USERSPACE; + ndp->ni_dirp = uap->fname; + ip = namei(ndp); + if (ip == NULL) + return; + ostat1(ip, uap->sb); + iput(ip); +} + +ostat1(ip, ub) + register struct inode *ip; + struct ostat *ub; +{ + struct ostat ds; + + IUPDAT(ip, &time, &time, 0); + /* + * 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)); } /* - * Return the next character from the - * user string pointed at by dirp. + * Set IUPD and IACC times on file. + * Can't set ICHG. */ -uchar() +outime() { - register c; + register struct a { + char *fname; + time_t *tptr; + } *uap = (struct a *)u.u_ap; + register struct inode *ip; + time_t tv[2]; + struct timeval tv0, tv1; - c = fubyte(u.u_dirp++); - if (c == -1) { - u.u_error = EFAULT; - c = 0; + if ((ip = owner(uap->fname, FOLLOW)) == NULL) + return; + u.u_error = copyin((caddr_t)uap->tptr, (caddr_t)tv, sizeof (tv)); + if (u.u_error == 0) { + ip->i_flag |= IACC|IUPD|ICHG; + tv0.tv_sec = tv[0]; tv0.tv_usec = 0; + tv1.tv_sec = tv[1]; tv1.tv_usec = 0; + iupdat(ip, &tv0, &tv1, 0); } - return (c); + iput(ip); } +#endif