This source file includes following definitions.
- ultrix_sys_creat
- ultrix_sys_access
- ultrix_sys_stat
- ultrix_sys_lstat
- ultrix_sys_execv
- ultrix_sys_open
- ultrixstatfs
- ultrix_sys_statfs
- ultrix_sys_fstatfs
- ultrix_sys_mknod
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 #include <sys/param.h>
63 #include <sys/systm.h>
64 #include <sys/namei.h>
65 #include <sys/file.h>
66 #include <sys/filedesc.h>
67 #include <sys/ioctl.h>
68 #include <sys/mount.h>
69 #include <sys/stat.h>
70 #include <sys/vnode.h>
71 #include <sys/syscallargs.h>
72
73 #include <compat/ultrix/ultrix_syscallargs.h>
74 #include <compat/ultrix/ultrix_util.h>
75
76 const char ultrix_emul_path[] = "/emul/ultrix";
77
78 int
79 ultrix_sys_creat(p, v, retval)
80 struct proc *p;
81 void *v;
82 register_t *retval;
83 {
84 struct ultrix_sys_creat_args *uap = v;
85 struct sys_open_args ouap;
86
87 caddr_t sg = stackgap_init(p->p_emul);
88 ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
89
90 SCARG(&ouap, path) = SCARG(uap, path);
91 SCARG(&ouap, flags) = O_WRONLY | O_CREAT | O_TRUNC;
92 SCARG(&ouap, mode) = SCARG(uap, mode);
93
94 return (sys_open(p, &ouap, retval));
95 }
96
97
98 int
99 ultrix_sys_access(p, v, retval)
100 struct proc *p;
101 void *v;
102 register_t *retval;
103 {
104 struct ultrix_sys_access_args *uap = v;
105 caddr_t sg = stackgap_init(p->p_emul);
106 ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
107
108 return (sys_access(p, uap, retval));
109 }
110
111 int
112 ultrix_sys_stat(p, v, retval)
113 struct proc *p;
114 void *v;
115 register_t *retval;
116 {
117 struct ultrix_sys_stat_args *uap = v;
118 caddr_t sg = stackgap_init(p->p_emul);
119 ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
120
121 return (compat_43_sys_stat(p, uap, retval));
122 }
123
124 int
125 ultrix_sys_lstat(p, v, retval)
126 struct proc *p;
127 void *v;
128 register_t *retval;
129 {
130 struct ultrix_sys_lstat_args *uap = v;
131 caddr_t sg = stackgap_init(p->p_emul);
132 ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
133
134 return (compat_43_sys_lstat(p, uap, retval));
135 }
136
137 int
138 ultrix_sys_execv(p, v, retval)
139 struct proc *p;
140 void *v;
141 register_t *retval;
142 {
143 struct ultrix_sys_execv_args *uap = v;
144 struct sys_execve_args ouap;
145
146 caddr_t sg = stackgap_init(p->p_emul);
147 ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
148
149 SCARG(&ouap, path) = SCARG(uap, path);
150 SCARG(&ouap, argp) = SCARG(uap, argp);
151 SCARG(&ouap, envp) = NULL;
152
153 return (sys_execve(p, &ouap, retval));
154 }
155
156 int
157 ultrix_sys_open(p, v, retval)
158 struct proc *p;
159 void *v;
160 register_t *retval;
161 {
162 struct ultrix_sys_open_args *uap = v;
163 int l, r;
164 int noctty;
165 int ret;
166
167 caddr_t sg = stackgap_init(p->p_emul);
168 ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
169
170
171 l = SCARG(uap, flags);
172 noctty = l & 0x8000;
173 r = (l & (0x0001 | 0x0002 | 0x0008 | 0x0040 | 0x0200 | 0x0400 | 0x0800));
174 r |= ((l & (0x0004 | 0x1000 | 0x4000)) ? O_NONBLOCK : 0);
175 r |= ((l & 0x0080) ? O_SHLOCK : 0);
176 r |= ((l & 0x0100) ? O_EXLOCK : 0);
177 r |= ((l & 0x2000) ? O_SYNC : 0);
178
179 SCARG(uap, flags) = r;
180 ret = sys_open(p, (struct sys_open_args *)uap, retval);
181
182 if (!ret && !noctty && SESS_LEADER(p) && !(p->p_flag & P_CONTROLT)) {
183 struct filedesc *fdp = p->p_fd;
184 struct file *fp;
185
186 if ((fd = fd_getfile(fdp, *retval)) == NULL)
187 return (EBADF);
188 FREF(fp);
189
190 if (fp->f_type == DTYPE_VNODE)
191 (fp->f_ops->fo_ioctl)(fp, TIOCSCTTY, (caddr_t)0, p);
192 FRELE(fp);
193 }
194 return ret;
195 }
196
197
198 struct ultrix_statfs {
199 long f_type;
200 long f_bsize;
201 long f_blocks;
202 long f_bfree;
203 long f_bavail;
204 long f_files;
205 long f_ffree;
206 fsid_t f_fsid;
207 long f_spare[7];
208 };
209
210
211
212
213
214
215
216 static int
217 ultrixstatfs(sp, buf)
218 struct statfs *sp;
219 caddr_t buf;
220 {
221 struct ultrix_statfs ssfs;
222
223 bzero(&ssfs, sizeof ssfs);
224 ssfs.f_type = 0;
225 ssfs.f_bsize = sp->f_bsize;
226 ssfs.f_blocks = sp->f_blocks;
227 ssfs.f_bfree = sp->f_bfree;
228 ssfs.f_bavail = sp->f_bavail;
229 ssfs.f_files = sp->f_files;
230 ssfs.f_ffree = sp->f_ffree;
231 ssfs.f_fsid = sp->f_fsid;
232 return copyout((caddr_t)&ssfs, buf, sizeof ssfs);
233 }
234
235
236 int
237 ultrix_sys_statfs(p, v, retval)
238 struct proc *p;
239 void *v;
240 register_t *retval;
241 {
242 struct ultrix_sys_statfs_args *uap = v;
243 register struct mount *mp;
244 register struct statfs *sp;
245 int error;
246 struct nameidata nd;
247
248 caddr_t sg = stackgap_init(p->p_emul);
249 ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
250
251 NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
252 if ((error = namei(&nd)) != 0)
253 return (error);
254
255 mp = nd.ni_vp->v_mount;
256 sp = &mp->mnt_stat;
257 vrele(nd.ni_vp);
258 if ((error = VFS_STATFS(mp, sp, p)) != 0)
259 return (error);
260 sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
261 return ultrixstatfs(sp, (caddr_t)SCARG(uap, buf));
262 }
263
264
265
266
267
268
269 int
270 ultrix_sys_fstatfs(p, v, retval)
271 struct proc *p;
272 void *v;
273 register_t *retval;
274 {
275 struct ultrix_sys_fstatfs_args *uap = v;
276 struct file *fp;
277 struct mount *mp;
278 register struct statfs *sp;
279 int error;
280
281 if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
282 return (error);
283
284 mp = ((struct vnode *)fp->f_data)->v_mount;
285 sp = &mp->mnt_stat;
286 error = VFS_STATFS(mp, sp, p);
287 FRELE(fp);
288 if (error)
289 return (error);
290 sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
291 return ultrixstatfs(sp, (caddr_t)SCARG(uap, buf));
292 }
293
294 int
295 ultrix_sys_mknod(p, v, retval)
296 struct proc *p;
297 void *v;
298 register_t *retval;
299 {
300 struct ultrix_sys_mknod_args *uap = v;
301
302 caddr_t sg = stackgap_init(p->p_emul);
303 ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
304
305 if (S_ISFIFO(SCARG(uap, mode)))
306 return sys_mkfifo(p, uap, retval);
307
308 return sys_mknod(p, (struct sys_mknod_args *)uap, retval);
309 }