Commit | Line | Data |
---|---|---|
02c45551 | 1 | /* vfs_xxx.c 4.6 83/05/31 */ |
2a9ead0d BJ |
2 | |
3 | #include "../h/param.h" | |
4 | #include "../h/systm.h" | |
5 | #include "../h/inode.h" | |
6 | #include "../h/fs.h" | |
7 | #include "../h/mount.h" | |
8 | #include "../h/dir.h" | |
9 | #include "../h/user.h" | |
10 | #include "../h/buf.h" | |
11 | #include "../h/conf.h" | |
12 | ||
13 | /* | |
14 | * Return the next character fromt the | |
15 | * kernel string pointed at by dirp. | |
16 | */ | |
17 | schar() | |
18 | { | |
19 | return (*u.u_dirp++ & 0377); | |
20 | } | |
21 | ||
22 | /* | |
23 | * Return the next character from the | |
24 | * user string pointed at by dirp. | |
25 | */ | |
26 | uchar() | |
27 | { | |
28 | register c; | |
29 | ||
30 | c = fubyte(u.u_dirp++); | |
31 | if (c == -1) { | |
32 | u.u_error = EFAULT; | |
33 | c = 0; | |
34 | } | |
35 | return (c); | |
36 | } | |
1139f919 SL |
37 | |
38 | #ifndef NOCOMPAT | |
39 | #include "../h/file.h" | |
40 | #include "../h/nami.h" | |
1139f919 SL |
41 | #include "../h/kernel.h" |
42 | ||
43 | /* | |
44 | * Oh, how backwards compatibility is ugly!!! | |
45 | */ | |
46 | struct ostat { | |
47 | dev_t ost_dev; | |
6a056086 | 48 | u_short ost_ino; |
1139f919 SL |
49 | u_short ost_mode; |
50 | short ost_nlink; | |
51 | short ost_uid; | |
52 | short ost_gid; | |
53 | dev_t ost_rdev; | |
54 | int ost_size; | |
55 | int ost_atime; | |
56 | int ost_mtime; | |
57 | int ost_ctime; | |
58 | }; | |
59 | ||
60 | /* | |
61 | * The old fstat system call. | |
62 | */ | |
63 | ofstat() | |
64 | { | |
65 | register struct file *fp; | |
66 | register struct a { | |
67 | int fd; | |
68 | struct ostat *sb; | |
88a7a62a SL |
69 | } *uap = (struct a *)u.u_ap; |
70 | extern struct file *getinode(); | |
1139f919 | 71 | |
88a7a62a | 72 | fp = getinode(uap->fd); |
1139f919 SL |
73 | if (fp == NULL) |
74 | return; | |
88a7a62a | 75 | ostat1((struct inode *)fp->f_data, uap->sb); |
1139f919 SL |
76 | } |
77 | ||
78 | /* | |
79 | * Old stat system call. This version follows links. | |
80 | */ | |
81 | ostat() | |
82 | { | |
83 | register struct inode *ip; | |
84 | register struct a { | |
85 | char *fname; | |
86 | struct ostat *sb; | |
87 | } *uap; | |
88 | ||
89 | uap = (struct a *)u.u_ap; | |
90 | ip = namei(uchar, LOOKUP, 1); | |
91 | if (ip == NULL) | |
92 | return; | |
93 | ostat1(ip, uap->sb); | |
94 | iput(ip); | |
95 | } | |
96 | ||
97 | ostat1(ip, ub) | |
98 | register struct inode *ip; | |
99 | struct ostat *ub; | |
100 | { | |
101 | struct ostat ds; | |
102 | ||
103 | IUPDAT(ip, &time, &time, 0); | |
104 | /* | |
105 | * Copy from inode table | |
106 | */ | |
107 | ds.ost_dev = ip->i_dev; | |
108 | ds.ost_ino = (short)ip->i_number; | |
109 | ds.ost_mode = (u_short)ip->i_mode; | |
110 | ds.ost_nlink = ip->i_nlink; | |
111 | ds.ost_uid = (short)ip->i_uid; | |
112 | ds.ost_gid = (short)ip->i_gid; | |
113 | ds.ost_rdev = (dev_t)ip->i_rdev; | |
114 | ds.ost_size = (int)ip->i_size; | |
115 | ds.ost_atime = (int)ip->i_atime; | |
116 | ds.ost_mtime = (int)ip->i_mtime; | |
117 | ds.ost_ctime = (int)ip->i_ctime; | |
127f7d76 | 118 | u.u_error = copyout((caddr_t)&ds, (caddr_t)ub, sizeof(ds)); |
1139f919 | 119 | } |
02c45551 SL |
120 | |
121 | /* | |
122 | * Set IUPD and IACC times on file. | |
123 | * Can't set ICHG. | |
124 | */ | |
125 | outime() | |
126 | { | |
127 | register struct a { | |
128 | char *fname; | |
129 | time_t *tptr; | |
130 | } *uap = (struct a *)u.u_ap; | |
131 | register struct inode *ip; | |
132 | time_t tv[2]; | |
133 | struct timeval tv0, tv1; | |
134 | ||
135 | if ((ip = owner(1)) == NULL) | |
136 | return; | |
137 | u.u_error = copyin((caddr_t)uap->tptr, (caddr_t)tv, sizeof (tv)); | |
138 | if (u.u_error == 0) { | |
139 | ip->i_flag |= IACC|IUPD|ICHG; | |
140 | tv0.tv_sec = tv[0]; tv0.tv_usec = 0; | |
141 | tv1.tv_sec = tv[1]; tv1.tv_usec = 0; | |
142 | iupdat(ip, &tv0, &tv1, 0); | |
143 | } | |
144 | iput(ip); | |
145 | } | |
1139f919 | 146 | #endif |