avoid null pointer on machine check printf's
[unix-history] / usr / src / sys / kern / vfs_xxx.c
index 24b0035..c38c9b2 100644 (file)
-/*     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.2 (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