Commit | Line | Data |
---|---|---|
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 | ||
8 | read() | |
9 | { | |
10 | extern readi; | |
11 | ||
12 | rdwr(&readi, FREAD); | |
13 | } | |
14 | ||
15 | write() | |
16 | { | |
17 | extern writei; | |
18 | ||
19 | rdwr(&writei, FWRITE); | |
20 | } | |
21 | ||
22 | rdwr(fun, mode) | |
23 | int (*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 | ||
44 | open() | |
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 | ||
56 | creat() | |
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 | ||
71 | open1(ip, mode, trf) | |
72 | int *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 | ||
104 | close() | |
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 | ||
115 | seek() | |
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 | ||
150 | link() | |
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 | ||
176 | out: | |
177 | iput(ip); | |
178 | } | |
179 | ||
180 | mknod() | |
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 | ||
197 | out: | |
198 | iput(ip); | |
199 | } | |
200 | ||
201 | sslep() | |
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 | } |