Research V4 development
[unix-history] / sys / ken / sys2.c
CommitLineData
23055b9b
KT
1#include "/sys/nsys/param.h"
2#include "/sys/nsys/systm.h"
3#include "/sys/nsys/user.h"
4#include "/sys/nsys/reg.h"
5#include "/sys/nsys/file.h"
6#include "/sys/nsys/inode.h"
7
8read()
9{
10 extern readi;
11
12 rdwr(&readi, FREAD);
13}
14
15write()
16{
17 extern writei;
18
19 rdwr(&writei, FWRITE);
20}
21
22rdwr(fun, mode)
23int (*fun)();
24{
25 int *fp;
26
27 fp = getf(u.u_ar0[R0]);
28 if(fp == NULL)
29 return;
30 if((fp->f_flag&mode) == 0) {
31 u.u_error = EBADF;
32 return;
33 }
34 u.u_base = u.u_arg[0];
35 u.u_count = u.u_arg[1];
36 u.u_offset[1] = fp->f_offset[1];
37 u.u_offset[0] = fp->f_offset[0];
38 u.u_segflg = 0;
39 (*fun)(fp->f_inode);
40 u.u_ar0[R0] = u.u_arg[1]-u.u_count;
41 dpadd(fp->f_offset, u.u_ar0[R0]);
42}
43
44open()
45{
46 int *ip;
47 extern uchar;
48
49 ip = namei(&uchar, 0);
50 if(ip == NULL)
51 return;
52 u.u_arg[1]++;
53 open1(ip, u.u_arg[1], 0);
54}
55
56creat()
57{
58 int *ip;
59 extern uchar;
60
61 ip = namei(&uchar, 1);
62 if(ip == NULL) {
63 if(u.u_error)
64 return;
65 ip = maknode(u.u_arg[1]&07777);
66 open1(ip, FWRITE, 2);
67 } else
68 open1(ip, FWRITE, 1);
69}
70
71open1(ip, mode, trf)
72int *ip;
73{
74 struct file *fp;
75
76 if(trf != 2) {
77 if(mode&FREAD)
78 access(ip, IREAD);
79 if(mode&FWRITE) {
80 access(ip, IWRITE);
81 if((ip->i_mode&IFMT) == IFDIR)
82 u.u_error = EISDIR;
83 }
84 }
85 ip->i_flag =& ~ILOCK;
86 if(u.u_error == 0)
87 openi(ip, mode&FWRITE);
88 if(u.u_error) {
89 iput(ip);
90 return;
91 }
92 if(trf)
93 itrunc(ip);
94 if ((fp = falloc()) == NULL) {
95 iput(ip);
96 return;
97 }
98 fp->f_flag = mode&(FREAD|FWRITE);
99 fp->f_inode = ip;
100 fp->f_offset[1] = 0;
101 fp->f_offset[0] = 0;
102}
103
104close()
105{
106 register *fp;
107
108 fp = getf(u.u_ar0[R0]);
109 if(fp == NULL)
110 return;
111 u.u_ofile[u.u_ar0[R0]] = NULL;
112 closef(fp);
113}
114
115seek()
116{
117 int n[2];
118 register *fp;
119
120 fp = getf(u.u_ar0[R0]);
121 if(fp == NULL)
122 return;
123 if(u.u_arg[1] > 2) {
124 n[1] = u.u_arg[0]<<9;
125 n[0] = (u.u_arg[0]>>7) & 0777;
126 } else {
127 n[1] = u.u_arg[0];
128 n[0] = 0;
129 }
130 switch(u.u_arg[1]) {
131
132 case 1:
133 case 4:
134 n[0] =+ fp->f_offset[0];
135 dpadd(n, fp->f_offset[1]);
136 break;
137
138 default:
139 n[0] =+ fp->f_inode->i_size0;
140 dpadd(n, fp->f_inode->i_size1);
141
142 case 0:
143 case 3:
144 ;
145 }
146 fp->f_offset[1] = n[1];
147 fp->f_offset[0] = n[0];
148}
149
150link()
151{
152 int *ip, *xp;
153 extern uchar;
154
155 ip = namei(&uchar, 0);
156 if(ip == NULL)
157 return;
158 ip->i_flag =& ~ILOCK;
159 u.u_dirp = u.u_arg[1];
160 xp = namei(&uchar, 1);
161 if(xp != NULL) {
162 u.u_error = EEXIST;
163 iput(xp);
164 }
165 if(u.u_error)
166 goto out;
167 if(u.u_pdir->i_dev != ip->i_dev) {
168 iput(u.u_pdir);
169 u.u_error = EXDEV;
170 goto out;
171 }
172 wdir(ip);
173 ip->i_nlink++;
174 ip->i_flag =| IUPD;
175
176out:
177 iput(ip);
178}
179
180mknod()
181{
182 int *ip;
183 extern uchar;
184
185 if(suser()) {
186 ip = namei(&uchar, 1);
187 if(ip != NULL) {
188 u.u_error = EEXIST;
189 goto out;
190 }
191 }
192 if(u.u_error)
193 return;
194 ip = maknode(u.u_arg[1]);
195 ip->i_addr[0] = u.u_arg[2];
196
197out:
198 iput(ip);
199}
200
201sslep()
202{
203 char *d[2];
204
205 spl7();
206 d[0] = time[0];
207 d[1] = time[1];
208 dpadd(d, u.u_ar0[R0]);
209
210 while(dpcmp(d[0], d[1], time[0], time[1]) > 0) {
211 if(dpcmp(tout[0], tout[1], time[0], time[1]) <= 0 ||
212 dpcmp(tout[0], tout[1], d[0], d[1]) > 0) {
213 tout[0] = d[0];
214 tout[1] = d[1];
215 }
216 sleep(tout, PSLEP);
217 }
218 spl0();
219}