xref: /original-bsd/sys/kern/vfs_xxx.c (revision f82e54c4)
1 /*	vfs_xxx.c	6.3	84/08/29	*/
2 
3 #include "param.h"
4 #include "systm.h"
5 #include "inode.h"
6 #include "fs.h"
7 #include "mount.h"
8 #include "dir.h"
9 #include "user.h"
10 #include "buf.h"
11 #include "conf.h"
12 
13 #ifdef COMPAT
14 #include "file.h"
15 #include "kernel.h"
16 
17 /*
18  * Oh, how backwards compatibility is ugly!!!
19  */
20 struct	ostat {
21 	dev_t	ost_dev;
22 	u_short	ost_ino;
23 	u_short ost_mode;
24 	short  	ost_nlink;
25 	short  	ost_uid;
26 	short  	ost_gid;
27 	dev_t	ost_rdev;
28 	int	ost_size;
29 	int	ost_atime;
30 	int	ost_mtime;
31 	int	ost_ctime;
32 };
33 
34 /*
35  * The old fstat system call.
36  */
37 ofstat()
38 {
39 	register struct file *fp;
40 	register struct a {
41 		int	fd;
42 		struct ostat *sb;
43 	} *uap = (struct a *)u.u_ap;
44 	extern struct file *getinode();
45 
46 	fp = getinode(uap->fd);
47 	if (fp == NULL)
48 		return;
49 	ostat1((struct inode *)fp->f_data, uap->sb);
50 }
51 
52 /*
53  * Old stat system call.  This version follows links.
54  */
55 ostat()
56 {
57 	register struct inode *ip;
58 	register struct a {
59 		char	*fname;
60 		struct ostat *sb;
61 	} *uap = (struct a *)u.u_ap;
62 	register struct nameidata *ndp = &u.u_nd;
63 
64 	ndp->ni_nameiop = LOOKUP | FOLLOW;
65 	ndp->ni_segflg = UIO_USERSPACE;
66 	ndp->ni_dirp = uap->fname;
67 	ip = namei(ndp);
68 	if (ip == NULL)
69 		return;
70 	ostat1(ip, uap->sb);
71 	iput(ip);
72 }
73 
74 ostat1(ip, ub)
75 	register struct inode *ip;
76 	struct ostat *ub;
77 {
78 	struct ostat ds;
79 
80 	IUPDAT(ip, &time, &time, 0);
81 	/*
82 	 * Copy from inode table
83 	 */
84 	ds.ost_dev = ip->i_dev;
85 	ds.ost_ino = (short)ip->i_number;
86 	ds.ost_mode = (u_short)ip->i_mode;
87 	ds.ost_nlink = ip->i_nlink;
88 	ds.ost_uid = (short)ip->i_uid;
89 	ds.ost_gid = (short)ip->i_gid;
90 	ds.ost_rdev = (dev_t)ip->i_rdev;
91 	ds.ost_size = (int)ip->i_size;
92 	ds.ost_atime = (int)ip->i_atime;
93 	ds.ost_mtime = (int)ip->i_mtime;
94 	ds.ost_ctime = (int)ip->i_ctime;
95 	u.u_error = copyout((caddr_t)&ds, (caddr_t)ub, sizeof(ds));
96 }
97 
98 /*
99  * Set IUPD and IACC times on file.
100  * Can't set ICHG.
101  */
102 outime()
103 {
104 	register struct a {
105 		char	*fname;
106 		time_t	*tptr;
107 	} *uap = (struct a *)u.u_ap;
108 	register struct inode *ip;
109 	time_t tv[2];
110 	struct timeval tv0, tv1;
111 
112 	if ((ip = owner(uap->fname, FOLLOW)) == NULL)
113 		return;
114 	u.u_error = copyin((caddr_t)uap->tptr, (caddr_t)tv, sizeof (tv));
115 	if (u.u_error == 0) {
116 		ip->i_flag |= IACC|IUPD|ICHG;
117 		tv0.tv_sec = tv[0]; tv0.tv_usec = 0;
118 		tv1.tv_sec = tv[1]; tv1.tv_usec = 0;
119 		iupdat(ip, &tv0, &tv1, 0);
120 	}
121 	iput(ip);
122 }
123 #endif
124