This source file includes following definitions.
- ultrix_sys_getsysinfo
- ultrix_sys_setsysinfo
- ultrix_sys_waitpid
- ultrix_sys_wait3
- ultrix_sys_select
- async_daemon
- ultrix_sys_mmap
- ultrix_sys_setsockopt
- ultrix_sys_uname
- ultrix_sys_setpgrp
- ultrix_sys_nfssvc
- ultrix_sys_ustat
- ultrix_sys_quotactl
- ultrix_sys_vhangup
- ultrix_sys_exportfs
- ultrix_sys_sigpending
- ultrix_sys_sigcleanup
- ultrix_sys_sigreturn
- ultrix_sys_execve
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 #include <sys/param.h>
83 #include <sys/systm.h>
84 #include <sys/namei.h>
85 #include <sys/dirent.h>
86 #include <sys/proc.h>
87 #include <sys/file.h>
88 #include <sys/filedesc.h>
89
90
91 #include <sys/kernel.h>
92 #include <sys/exec.h>
93 #include <sys/malloc.h>
94 #include <sys/mbuf.h>
95 #include <sys/mman.h>
96 #include <sys/mount.h>
97 #include <sys/resource.h>
98 #include <sys/resourcevar.h>
99 #include <sys/signal.h>
100 #include <sys/signalvar.h>
101 #include <sys/socket.h>
102 #include <sys/vnode.h>
103 #include <sys/uio.h>
104 #include <sys/wait.h>
105 #include <sys/utsname.h>
106 #include <sys/unistd.h>
107
108 #include <sys/syscallargs.h>
109
110 #include <compat/ultrix/ultrix_syscall.h>
111 #include <compat/ultrix/ultrix_syscallargs.h>
112 #include <compat/ultrix/ultrix_util.h>
113
114 #include <netinet/in.h>
115
116 #include <miscfs/specfs/specdev.h>
117
118 #include <nfs/rpcv2.h>
119 #include <nfs/nfsproto.h>
120 #include <nfs/nfs.h>
121
122 #include <uvm/uvm_extern.h>
123
124 #include <sys/conf.h>
125 #include <sys/socketvar.h>
126
127 extern struct sysent ultrix_sysent[];
128 #ifdef SYSCALL_DEBUG
129 extern char *ultrix_syscallnames[];
130 #endif
131
132
133
134
135 #ifdef __mips__
136 #define ULTRIX_EXEC_SETREGS cpu_exec_ecoff_setregs
137 #endif
138
139 #ifdef __vax__
140 #define ULTRIX_EXEC_SETREGS setregs
141 #endif
142
143
144 extern void ULTRIX_EXEC_SETREGS(struct proc *, struct exec_package *,
145 u_long, register_t *);
146 extern char sigcode[], esigcode[];
147
148 struct emul emul_ultrix = {
149 "ultrix",
150 NULL,
151 sendsig,
152 ULTRIX_SYS_syscall,
153 ULTRIX_SYS_MAXSYSCALL,
154 ultrix_sysent,
155 #ifdef SYSCALL_DEBUG
156 ultrix_syscallnames,
157 #else
158 NULL,
159 #endif
160 0,
161 copyargs,
162 ULTRIX_EXEC_SETREGS,
163 NULL,
164 sigcode,
165 esigcode,
166 };
167
168 #define GSI_PROG_ENV 1
169
170 int
171 ultrix_sys_getsysinfo(p, v, retval)
172 struct proc *p;
173 void *v;
174 register_t *retval;
175 {
176 struct ultrix_sys_getsysinfo_args *uap = v;
177 static short progenv = 0;
178
179 switch (SCARG(uap, op)) {
180
181 case GSI_PROG_ENV:
182 if (SCARG(uap, nbytes) < sizeof(short))
183 return EINVAL;
184 *retval = 1;
185 return (copyout(&progenv, SCARG(uap, buffer), sizeof(short)));
186 default:
187 *retval = 0;
188 return 0;
189 }
190 }
191
192 int
193 ultrix_sys_setsysinfo(p, v, retval)
194 struct proc *p;
195 void *v;
196 register_t *retval;
197 {
198
199 #ifdef notyet
200 struct ultrix_sys_setsysinfo_args *uap = v;
201 #endif
202
203 *retval = 0;
204 return 0;
205 }
206
207 int
208 ultrix_sys_waitpid(p, v, retval)
209 struct proc *p;
210 void *v;
211 register_t *retval;
212 {
213 struct ultrix_sys_waitpid_args *uap = v;
214 struct sys_wait4_args ua;
215
216 SCARG(&ua, pid) = SCARG(uap, pid);
217 SCARG(&ua, status) = SCARG(uap, status);
218 SCARG(&ua, options) = SCARG(uap, options);
219 SCARG(&ua, rusage) = 0;
220
221 return (sys_wait4(p, &ua, retval));
222 }
223
224 int
225 ultrix_sys_wait3(p, v, retval)
226 struct proc *p;
227 void *v;
228 register_t *retval;
229 {
230 struct ultrix_sys_wait3_args *uap = v;
231 struct sys_wait4_args ua;
232
233 SCARG(&ua, pid) = -1;
234 SCARG(&ua, status) = SCARG(uap, status);
235 SCARG(&ua, options) = SCARG(uap, options);
236 SCARG(&ua, rusage) = SCARG(uap, rusage);
237
238 return (sys_wait4(p, &ua, retval));
239 }
240
241
242
243
244
245
246
247
248 int
249 ultrix_sys_select(p, v, retval)
250 struct proc *p;
251 void *v;
252 register_t *retval;
253 {
254 struct sys_select_args *uap = v;
255 struct timeval atv;
256 int error;
257
258
259
260 if (SCARG(uap, nd) > FD_SETSIZE)
261 SCARG(uap, nd) = FD_SETSIZE;
262
263
264 if (SCARG(uap, tv)) {
265 error = copyin((caddr_t)SCARG(uap, tv), (caddr_t)&atv,
266 sizeof(atv));
267 if (error)
268 goto done;
269 #ifdef DEBUG
270
271 if (atv.tv_sec < 0 || atv.tv_usec < 0)
272 printf("ultrix select( %ld, %ld): negative timeout\n",
273 atv.tv_sec, atv.tv_usec);
274
275 #endif
276
277 }
278 error = sys_select(p, (void *) uap, retval);
279 if (error == EINVAL)
280 printf("ultrix select: bad args?\n");
281
282 done:
283 return error;
284 }
285
286 #if defined(NFSCLIENT)
287 int
288 async_daemon(p, v, retval)
289 struct proc *p;
290 void *v;
291 register_t *retval;
292 {
293 struct sys_nfssvc_args ouap;
294
295 SCARG(&ouap, flag) = NFSSVC_BIOD;
296 SCARG(&ouap, argp) = NULL;
297
298 return (sys_nfssvc(p, &ouap, retval));
299 }
300 #endif
301
302
303 #define SUN__MAP_NEW 0x80000000
304
305 int
306 ultrix_sys_mmap(p, v, retval)
307 struct proc *p;
308 void *v;
309 register_t *retval;
310 {
311 struct ultrix_sys_mmap_args *uap = v;
312 struct sys_mmap_args ouap;
313
314
315
316
317 if (SCARG(uap, prot) & ~(PROT_READ|PROT_WRITE|PROT_EXEC))
318 return (EINVAL);
319
320 if ((SCARG(uap, flags) & SUN__MAP_NEW) == 0)
321 return (EINVAL);
322
323 SCARG(&ouap, flags) = SCARG(uap, flags) & ~SUN__MAP_NEW;
324 SCARG(&ouap, addr) = SCARG(uap, addr);
325
326 if ((SCARG(&ouap, flags) & MAP_FIXED) == 0 &&
327 SCARG(&ouap, addr) != 0 &&
328 SCARG(&ouap, addr) < (void *)round_page((vaddr_t)p->p_vmspace->vm_daddr+MAXDSIZ))
329 SCARG(&ouap, addr) = (void *)round_page((vaddr_t)p->p_vmspace->vm_daddr+MAXDSIZ);
330
331 SCARG(&ouap, len) = SCARG(uap, len);
332 SCARG(&ouap, prot) = SCARG(uap, prot);
333 SCARG(&ouap, fd) = SCARG(uap, fd);
334 SCARG(&ouap, pos) = SCARG(uap, pos);
335
336 return (sys_mmap(p, &ouap, retval));
337 }
338
339 int
340 ultrix_sys_setsockopt(p, v, retval)
341 struct proc *p;
342 void *v;
343 register_t *retval;
344 {
345 register struct ultrix_sys_setsockopt_args *uap = v;
346 struct file *fp;
347 struct mbuf *m = NULL;
348 int error;
349
350 if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)) != 0)
351 return (error);
352 #define SO_DONTLINGER (~SO_LINGER)
353 if (SCARG(uap, name) == SO_DONTLINGER) {
354 m = m_get(M_WAIT, MT_SOOPTS);
355 mtod(m, struct linger *)->l_onoff = 0;
356 m->m_len = sizeof(struct linger);
357 error = (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
358 SO_LINGER, m));
359 goto bad;
360 }
361 if (SCARG(uap, valsize) > MLEN) {
362 error = EINVAL;
363 goto bad;
364 }
365 if (SCARG(uap, val)) {
366 m = m_get(M_WAIT, MT_SOOPTS);
367 if ((error = copyin(SCARG(uap, val), mtod(m, caddr_t),
368 (u_int)SCARG(uap, valsize))) != 0) {
369 (void) m_free(m);
370 goto bad;
371 }
372 m->m_len = SCARG(uap, valsize);
373 }
374 error = (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
375 SCARG(uap, name), m));
376 bad:
377 FRELE(fp);
378 return (error);
379 }
380
381 struct ultrix_utsname {
382 char sysname[9];
383 char nodename[9];
384 char nodeext[65-9];
385 char release[9];
386 char version[9];
387 char machine[9];
388 };
389
390 int
391 ultrix_sys_uname(p, v, retval)
392 struct proc *p;
393 void *v;
394 register_t *retval;
395 {
396 struct ultrix_sys_uname_args *uap = v;
397 struct ultrix_utsname sut;
398 extern char machine[];
399
400 bzero(&sut, sizeof(sut));
401
402 bcopy(ostype, sut.sysname, sizeof(sut.sysname) - 1);
403 bcopy(hostname, sut.nodename, sizeof(sut.nodename));
404 sut.nodename[sizeof(sut.nodename)-1] = '\0';
405 bcopy(osrelease, sut.release, sizeof(sut.release) - 1);
406 bcopy("1", sut.version, sizeof(sut.version) - 1);
407 bcopy(machine, sut.machine, sizeof(sut.machine) - 1);
408
409 return copyout((caddr_t)&sut, (caddr_t)SCARG(uap, name),
410 sizeof(struct ultrix_utsname));
411 }
412
413 int
414 ultrix_sys_setpgrp(p, v, retval)
415 struct proc *p;
416 void *v;
417 register_t *retval;
418 {
419 struct ultrix_sys_setpgrp_args *uap = v;
420
421
422
423
424
425
426
427 if (!SCARG(uap, pgid) &&
428 (!SCARG(uap, pid) || SCARG(uap, pid) == p->p_pid))
429 return sys_setsid(p, uap, retval);
430 else
431 return sys_setpgid(p, uap, retval);
432 }
433
434 #if defined (NFSSERVER)
435 int
436 ultrix_sys_nfssvc(p, v, retval)
437 struct proc *p;
438 void *v;
439 register_t *retval;
440 {
441
442 #if 0
443 struct ultrix_sys_nfssvc_args *uap = v;
444 struct emul *e = p->p_emul;
445 struct sys_nfssvc_args outuap;
446 struct sockaddr sa;
447 int error;
448
449 bzero(&outuap, sizeof outuap);
450 SCARG(&outuap, fd) = SCARG(uap, fd);
451 SCARG(&outuap, mskval) = STACKGAPBASE;
452 SCARG(&outuap, msklen) = sizeof sa;
453 SCARG(&outuap, mtchval) = outuap.mskval + sizeof sa;
454 SCARG(&outuap, mtchlen) = sizeof sa;
455
456 bzero(&sa, sizeof sa);
457 if (error = copyout(&sa, SCARG(&outuap, mskval), SCARG(&outuap, msklen)))
458 return (error);
459 if (error = copyout(&sa, SCARG(&outuap, mtchval), SCARG(&outuap, mtchlen)))
460 return (error);
461
462 return nfssvc(p, &outuap, retval);
463 #else
464 return (ENOSYS);
465 #endif
466 }
467 #endif
468
469 struct ultrix_ustat {
470 int32_t f_tfree;
471 ino_t f_tinode;
472 char f_fname[6];
473 char f_fpack[6];
474 };
475
476 int
477 ultrix_sys_ustat(p, v, retval)
478 struct proc *p;
479 void *v;
480 register_t *retval;
481 {
482 struct ultrix_sys_ustat_args *uap = v;
483 struct ultrix_ustat us;
484 int error;
485
486 bzero(&us, sizeof us);
487
488
489
490
491
492
493 if ((error = copyout(&us, SCARG(uap, buf), sizeof us)) != 0)
494 return (error);
495 return 0;
496 }
497
498 int
499 ultrix_sys_quotactl(p, v, retval)
500 struct proc *p;
501 void *v;
502 register_t *retval;
503 {
504
505 #ifdef notyet
506 struct ultrix_sys_quotactl_args *uap = v;
507 #endif
508
509 return EINVAL;
510 }
511
512 int
513 ultrix_sys_vhangup(p, v, retval)
514 struct proc *p;
515 void *v;
516 register_t *retval;
517 {
518
519 return 0;
520 }
521
522 int
523 ultrix_sys_exportfs(p, v, retval)
524 struct proc *p;
525 void *v;
526 register_t *retval;
527 {
528 #ifdef notyet
529 struct ultrix_sys_exportfs_args *uap = v;
530 #endif
531
532
533
534
535
536 return 0;
537 }
538
539 int
540 ultrix_sys_sigpending(p, v, retval)
541 struct proc *p;
542 void *v;
543 register_t *retval;
544 {
545 struct ultrix_sys_sigpending_args *uap = v;
546 int mask = p->p_siglist & p->p_sigmask;
547
548 return (copyout((caddr_t)&mask, (caddr_t)SCARG(uap, mask), sizeof(int)));
549 }
550
551 int
552 ultrix_sys_sigcleanup(p, v, retval)
553 struct proc *p;
554 void *v;
555 register_t *retval;
556 {
557 struct ultrix_sys_sigcleanup_args *uap = v;
558
559 return sys_sigreturn(p, (struct sys_sigreturn_args *)uap, retval);
560 }
561
562 int
563 ultrix_sys_sigreturn(p, v, retval)
564 struct proc *p;
565 void *v;
566 register_t *retval;
567 {
568 struct ultrix_sys_sigcleanup_args *uap = v;
569
570 #ifdef DEBUG
571 printf("ultrix sigreturn\n");
572 #endif
573 return sys_sigreturn(p, (struct sys_sigreturn_args *)uap, retval);
574 }
575
576 int
577 ultrix_sys_execve(p, v, retval)
578 struct proc *p;
579 void *v;
580 register_t *retval;
581 {
582 struct ultrix_sys_execve_args
583
584
585
586 *uap = v;
587 struct sys_execve_args ap;
588 caddr_t sg;
589
590 sg = stackgap_init(p->p_emul);
591 ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
592
593 SCARG(&ap, path) = SCARG(uap, path);
594 SCARG(&ap, argp) = SCARG(uap, argp);
595 SCARG(&ap, envp) = SCARG(uap, envp);
596
597 return (sys_execve(p, &ap, retval));
598 }