This source file includes following definitions.
- ibcs2_sys_ulimit
- ibcs2_sys_waitsys
- ibcs2_sys_execv
- ibcs2_sys_execve
- ibcs2_sys_umount
- ibcs2_sys_mount
- ibcs2_readdir_callback
- ibcs2_classicread_callback
- ibcs2_sys_getdents
- ibcs2_sys_read
- ibcs2_sys_mknod
- ibcs2_sys_getgroups
- ibcs2_sys_setgroups
- ibcs2_sys_setuid
- ibcs2_sys_setgid
- xenix_sys_ftime
- ibcs2_sys_time
- ibcs2_sys_pathconf
- ibcs2_sys_fpathconf
- ibcs2_sys_sysconf
- ibcs2_sys_alarm
- ibcs2_sys_getmsg
- ibcs2_sys_putmsg
- ibcs2_sys_times
- ibcs2_sys_stime
- ibcs2_sys_utime
- ibcs2_sys_nice
- ibcs2_sys_pgrpsys
- ibcs2_sys_plock
- ibcs2_sys_uadmin
- ibcs2_sys_sysfs
- xenix_sys_rdchk
- xenix_sys_chsize
- xenix_sys_nap
- ibcs2_sys_unlink
- ibcs2_sys_chdir
- ibcs2_sys_chmod
- ibcs2_sys_chown
- ibcs2_sys_rmdir
- ibcs2_sys_mkdir
- ibcs2_sys_symlink
- ibcs2_sys_rename
- ibcs2_sys_readlink
- ibcs2_sys_sysi86
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 #include <sys/param.h>
55 #include <sys/systm.h>
56 #include <sys/namei.h>
57 #include <sys/dirent.h>
58 #include <sys/proc.h>
59 #include <sys/file.h>
60 #include <sys/filedesc.h>
61 #include <sys/ioctl.h>
62 #include <sys/kernel.h>
63 #include <sys/malloc.h>
64 #include <sys/mbuf.h>
65 #include <sys/mman.h>
66 #include <sys/mount.h>
67 #include <sys/reboot.h>
68 #include <sys/resource.h>
69 #include <sys/resourcevar.h>
70 #include <sys/socket.h>
71 #include <sys/stat.h>
72 #include <sys/time.h>
73 #include <sys/times.h>
74 #include <sys/vnode.h>
75 #include <sys/uio.h>
76 #include <sys/wait.h>
77 #include <sys/utsname.h>
78 #include <sys/unistd.h>
79
80 #include <netinet/in.h>
81 #include <sys/syscallargs.h>
82
83 #include <miscfs/specfs/specdev.h>
84
85 #include <uvm/uvm_extern.h>
86 #include <sys/sysctl.h>
87
88 #include <i386/include/reg.h>
89
90 #include <compat/ibcs2/ibcs2_types.h>
91 #include <compat/ibcs2/ibcs2_dirent.h>
92 #include <compat/ibcs2/ibcs2_fcntl.h>
93 #include <compat/ibcs2/ibcs2_time.h>
94 #include <compat/ibcs2/ibcs2_signal.h>
95 #include <compat/ibcs2/ibcs2_timeb.h>
96 #include <compat/ibcs2/ibcs2_unistd.h>
97 #include <compat/ibcs2/ibcs2_utsname.h>
98 #include <compat/ibcs2/ibcs2_util.h>
99 #include <compat/ibcs2/ibcs2_utime.h>
100 #include <compat/ibcs2/ibcs2_syscallargs.h>
101 #include <compat/ibcs2/ibcs2_sysi86.h>
102
103 #include <compat/common/compat_dir.h>
104
105 int
106 ibcs2_sys_ulimit(p, v, retval)
107 struct proc *p;
108 void *v;
109 register_t *retval;
110 {
111 struct ibcs2_sys_ulimit_args
112
113
114 *uap = v;
115 #ifdef notyet
116 int error;
117 struct rlimit rl;
118 struct sys_setrlimit_args sra;
119 #endif
120 #define IBCS2_GETFSIZE 1
121 #define IBCS2_SETFSIZE 2
122 #define IBCS2_GETPSIZE 3
123 #define IBCS2_GETDTABLESIZE 4
124
125 switch (SCARG(uap, cmd)) {
126 case IBCS2_GETFSIZE:
127 *retval = p->p_rlimit[RLIMIT_FSIZE].rlim_cur;
128 return 0;
129 case IBCS2_SETFSIZE:
130 #ifdef notyet
131 rl.rlim_cur = SCARG(uap, newlimit);
132 SCARG(&sra, which) = RLIMIT_FSIZE;
133 SCARG(&sra, rlp) = &rl;
134 error = setrlimit(p, &sra, retval);
135 if (!error)
136 *retval = p->p_rlimit[RLIMIT_FSIZE].rlim_cur;
137 else
138 DPRINTF(("failed "));
139 return error;
140 #else
141 *retval = SCARG(uap, newlimit);
142 return 0;
143 #endif
144 case IBCS2_GETPSIZE:
145 *retval = p->p_rlimit[RLIMIT_RSS].rlim_cur;
146 return 0;
147 case IBCS2_GETDTABLESIZE:
148 SCARG(uap, cmd) = IBCS2_SC_OPEN_MAX;
149 return ibcs2_sys_sysconf(p, uap, retval);
150 default:
151 return ENOSYS;
152 }
153 }
154
155 int
156 ibcs2_sys_waitsys(p, v, retval)
157 struct proc *p;
158 void *v;
159 register_t *retval;
160 {
161 struct ibcs2_sys_waitsys_args
162
163
164
165 *uap = v;
166 int error;
167 struct sys_wait4_args w4;
168 #define WAITPID_EFLAGS 0x8c4
169
170 SCARG(&w4, rusage) = NULL;
171 if ((p->p_md.md_regs->tf_eflags & WAITPID_EFLAGS) == WAITPID_EFLAGS) {
172
173 SCARG(&w4, pid) = SCARG(uap, a1);
174 SCARG(&w4, status) = (int *)SCARG(uap, a2);
175 SCARG(&w4, options) = SCARG(uap, a3);
176 } else {
177
178 SCARG(&w4, pid) = WAIT_ANY;
179 SCARG(&w4, status) = (int *)SCARG(uap, a1);
180 SCARG(&w4, options) = 0;
181 }
182 if ((error = sys_wait4(p, &w4, retval)) != 0)
183 return error;
184 if (SCARG(&w4, status))
185 return copyin((caddr_t)SCARG(&w4, status), (caddr_t)&retval[1],
186 sizeof(SCARG(&w4, status)));
187 return 0;
188 }
189
190 int
191 ibcs2_sys_execv(p, v, retval)
192 struct proc *p;
193 void *v;
194 register_t *retval;
195 {
196 struct ibcs2_sys_execv_args
197
198
199 *uap = v;
200 struct sys_execve_args ap;
201 caddr_t sg;
202
203 sg = stackgap_init(p->p_emul);
204 IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
205
206 SCARG(&ap, path) = SCARG(uap, path);
207 SCARG(&ap, argp) = SCARG(uap, argp);
208 SCARG(&ap, envp) = NULL;
209
210 return sys_execve(p, &ap, retval);
211 }
212
213 int
214 ibcs2_sys_execve(p, v, retval)
215 struct proc *p;
216 void *v;
217 register_t *retval;
218 {
219 struct ibcs2_sys_execve_args
220
221
222
223 *uap = v;
224 struct sys_execve_args ap;
225 caddr_t sg;
226
227 sg = stackgap_init(p->p_emul);
228 IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
229
230 SCARG(&ap, path) = SCARG(uap, path);
231 SCARG(&ap, argp) = SCARG(uap, argp);
232 SCARG(&ap, envp) = SCARG(uap, envp);
233
234 return sys_execve(p, &ap, retval);
235 }
236
237 int
238 ibcs2_sys_umount(p, v, retval)
239 struct proc *p;
240 void *v;
241 register_t *retval;
242 {
243 struct ibcs2_sys_umount_args
244
245 *uap = v;
246 struct sys_unmount_args um;
247
248 SCARG(&um, path) = SCARG(uap, name);
249 SCARG(&um, flags) = 0;
250 return sys_unmount(p, &um, retval);
251 }
252
253 int
254 ibcs2_sys_mount(p, v, retval)
255 struct proc *p;
256 void *v;
257 register_t *retval;
258 {
259 #ifdef notyet
260 struct ibcs2_sys_mount_args
261
262
263
264
265
266
267 *uap = v;
268 int oflags = SCARG(uap, flags), nflags, error;
269 char fsname[MFSNAMELEN];
270
271 if (oflags & (IBCS2_MS_NOSUB | IBCS2_MS_SYS5))
272 return (EINVAL);
273 if ((oflags & IBCS2_MS_NEWTYPE) == 0)
274 return (EINVAL);
275 nflags = 0;
276 if (oflags & IBCS2_MS_RDONLY)
277 nflags |= MNT_RDONLY;
278 if (oflags & IBCS2_MS_NOSUID)
279 nflags |= MNT_NOSUID;
280 if (oflags & IBCS2_MS_REMOUNT)
281 nflags |= MNT_UPDATE;
282 SCARG(uap, flags) = nflags;
283
284 if (error = copyinstr((caddr_t)SCARG(uap, type), fsname, sizeof fsname,
285 (u_int *)0))
286 return (error);
287
288 if (strncmp(fsname, "4.2", sizeof fsname) == 0) {
289 SCARG(uap, type) = (caddr_t)STACK_ALLOC();
290 if (error = copyout("ffs", SCARG(uap, type), sizeof("ffs")))
291 return (error);
292 } else if (strncmp(fsname, "nfs", sizeof fsname) == 0) {
293 struct ibcs2_nfs_args sna;
294 struct sockaddr_in sain;
295 struct nfs_args na;
296 struct sockaddr sa;
297
298 if (error = copyin(SCARG(uap, data), &sna, sizeof sna))
299 return (error);
300 if (error = copyin(sna.addr, &sain, sizeof sain))
301 return (error);
302 bcopy(&sain, &sa, sizeof sa);
303 sa.sa_len = sizeof(sain);
304 SCARG(uap, data) = (caddr_t)STACK_ALLOC();
305 na.addr = (struct sockaddr *)((int)SCARG(uap, data) + sizeof na);
306 na.sotype = SOCK_DGRAM;
307 na.proto = IPPROTO_UDP;
308 na.fh = (nfsv2fh_t *)sna.fh;
309 na.flags = sna.flags;
310 na.wsize = sna.wsize;
311 na.rsize = sna.rsize;
312 na.timeo = sna.timeo;
313 na.retrans = sna.retrans;
314 na.hostname = sna.hostname;
315
316 if (error = copyout(&sa, na.addr, sizeof sa))
317 return (error);
318 if (error = copyout(&na, SCARG(uap, data), sizeof na))
319 return (error);
320 }
321 return (sys_mount(p, uap, retval));
322 #else
323 return EINVAL;
324 #endif
325 }
326
327
328
329
330
331
332
333
334
335 int ibcs2_readdir_callback(void *, struct dirent *, off_t);
336 int ibcs2_classicread_callback(void *, struct dirent *, off_t);
337
338 struct ibcs2_readdir_callback_args {
339 caddr_t outp;
340 int resid;
341 };
342
343 int
344 ibcs2_readdir_callback(arg, bdp, cookie)
345 void *arg;
346 struct dirent *bdp;
347 off_t cookie;
348 {
349 struct ibcs2_dirent idb;
350 struct ibcs2_readdir_callback_args *cb = arg;
351 int ibcs2_reclen;
352 int error;
353
354 ibcs2_reclen = IBCS2_RECLEN(&idb, bdp->d_namlen);
355 if (cb->resid < ibcs2_reclen)
356 return (ENOMEM);
357
358
359
360
361
362
363 idb.d_ino = (ibcs2_ino_t)bdp->d_fileno;
364 idb.d_pad = 0;
365 idb.d_off = (ibcs2_off_t)cookie;
366 idb.d_reclen = (u_short)ibcs2_reclen;
367 strlcpy(idb.d_name, bdp->d_name, sizeof(idb.d_name));
368 error = copyout((caddr_t)&idb, cb->outp, ibcs2_reclen);
369 if (error)
370 return (error);
371
372
373 cb->outp += ibcs2_reclen;
374 cb->resid -= ibcs2_reclen;
375
376 return (0);
377 }
378
379 int
380 ibcs2_classicread_callback(arg, bdp, cookie)
381 void *arg;
382 struct dirent *bdp;
383 off_t cookie;
384 {
385 struct ibcs2_direct {
386 ibcs2_ino_t ino;
387 char name[14];
388 } idb;
389 struct ibcs2_readdir_callback_args *cb = arg;
390 int ibcs2_reclen;
391 int error;
392
393 ibcs2_reclen = 16;
394 if (cb->resid < ibcs2_reclen)
395 return (ENOMEM);
396
397
398
399
400
401 idb.ino = (bdp->d_fileno > 0xfffe) ? 0xfffe : bdp->d_fileno;
402 bzero(&idb.name, sizeof(idb.name));
403 strncpy(idb.name, bdp->d_name, 14);
404 error = copyout(&idb, cb->outp, ibcs2_reclen);
405 if (error)
406 return (error);
407
408
409 cb->outp += ibcs2_reclen;
410 cb->resid -= ibcs2_reclen;
411
412 return (0);
413 }
414
415 int
416 ibcs2_sys_getdents(p, v, retval)
417 struct proc *p;
418 void *v;
419 register_t *retval;
420 {
421 register struct ibcs2_sys_getdents_args
422
423
424
425 *uap = v;
426 struct ibcs2_readdir_callback_args args;
427 struct file *fp;
428 int error;
429
430 if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
431 return (error);
432
433 args.resid = SCARG(uap, nbytes);
434 args.outp = (caddr_t)SCARG(uap, buf);
435 error = readdir_with_callback(fp, &fp->f_offset, args.resid,
436 ibcs2_readdir_callback, &args);
437 FRELE(fp);
438 if (error)
439 return (error);
440
441 *retval = SCARG(uap, nbytes) - args.resid;
442 return (0);
443 }
444
445 int
446 ibcs2_sys_read(p, v, retval)
447 struct proc *p;
448 void *v;
449 register_t *retval;
450 {
451 struct ibcs2_sys_read_args
452
453
454
455 *uap = v;
456 struct vnode *vp;
457 struct ibcs2_readdir_callback_args args;
458 struct file *fp;
459 int error;
460
461 if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0) {
462 if (error == EINVAL)
463 return sys_read(p, uap, retval);
464 else
465 return error;
466 }
467 if ((fp->f_flag & FREAD) == 0) {
468 error = EBADF;
469 goto bad;
470 }
471 vp = (struct vnode *)fp->f_data;
472 if (vp->v_type != VDIR) {
473 FRELE(fp);
474 return sys_read(p, uap, retval);
475 }
476
477 args.resid = SCARG(uap, nbytes);
478 args.outp = (caddr_t)SCARG(uap, buf);
479
480 error = readdir_with_callback(fp, &fp->f_offset, args.resid,
481 ibcs2_classicread_callback, &args);
482 bad:
483 FRELE(fp);
484 if (error)
485 return (error);
486
487 *retval = SCARG(uap, nbytes) - args.resid;
488 return (0);
489 }
490
491 int
492 ibcs2_sys_mknod(p, v, retval)
493 struct proc *p;
494 void *v;
495 register_t *retval;
496 {
497 struct ibcs2_sys_mknod_args
498
499
500
501 *uap = v;
502 caddr_t sg = stackgap_init(p->p_emul);
503
504 IBCS2_CHECK_ALT_CREAT(p, &sg, SCARG(uap, path));
505 if (S_ISFIFO(SCARG(uap, mode))) {
506 struct sys_mkfifo_args ap;
507 SCARG(&ap, path) = SCARG(uap, path);
508 SCARG(&ap, mode) = SCARG(uap, mode);
509 return sys_mkfifo(p, uap, retval);
510 } else {
511 struct sys_mknod_args ap;
512 SCARG(&ap, path) = SCARG(uap, path);
513 SCARG(&ap, mode) = SCARG(uap, mode);
514 SCARG(&ap, dev) = SCARG(uap, dev);
515 return sys_mknod(p, &ap, retval);
516 }
517 }
518
519 int
520 ibcs2_sys_getgroups(p, v, retval)
521 struct proc *p;
522 void *v;
523 register_t *retval;
524 {
525 struct ibcs2_sys_getgroups_args
526
527
528 *uap = v;
529 int error, i;
530 ibcs2_gid_t *iset = NULL;
531 struct sys_getgroups_args sa;
532 gid_t *gp;
533 caddr_t sg = stackgap_init(p->p_emul);
534
535 SCARG(&sa, gidsetsize) = SCARG(uap, gidsetsize);
536 if (SCARG(uap, gidsetsize)) {
537 SCARG(&sa, gidset) = stackgap_alloc(&sg, NGROUPS_MAX *
538 sizeof(gid_t *));
539 iset = stackgap_alloc(&sg, SCARG(uap, gidsetsize) *
540 sizeof(ibcs2_gid_t));
541 }
542 if ((error = sys_getgroups(p, &sa, retval)) != 0)
543 return error;
544 if (iset) {
545 for (i = 0, gp = SCARG(&sa, gidset); i < retval[0]; i++)
546 iset[i] = (ibcs2_gid_t)*gp++;
547 if (retval[0] && (error = copyout((caddr_t)iset,
548 (caddr_t)SCARG(uap, gidset),
549 sizeof(ibcs2_gid_t) * retval[0])))
550 return error;
551 }
552 return 0;
553 }
554
555 int
556 ibcs2_sys_setgroups(p, v, retval)
557 struct proc *p;
558 void *v;
559 register_t *retval;
560 {
561 struct ibcs2_sys_setgroups_args
562
563
564 *uap = v;
565 int error, i;
566 ibcs2_gid_t *iset;
567 struct sys_setgroups_args sa;
568 gid_t *gp;
569 caddr_t sg = stackgap_init(p->p_emul);
570
571 SCARG(&sa, gidsetsize) = SCARG(uap, gidsetsize);
572 gp = stackgap_alloc(&sg, SCARG(&sa, gidsetsize) * sizeof(gid_t *));
573 iset = stackgap_alloc(&sg, SCARG(&sa, gidsetsize) *
574 sizeof(ibcs2_gid_t *));
575 if (SCARG(&sa, gidsetsize)) {
576 error = copyin((caddr_t)SCARG(uap, gidset), (caddr_t)iset,
577 sizeof(ibcs2_gid_t *) * SCARG(uap, gidsetsize));
578 if (error)
579 return error;
580 }
581 for (i = 0; i < SCARG(&sa, gidsetsize); i++)
582 gp[i]= (gid_t)iset[i];
583 SCARG(&sa, gidset) = gp;
584 return sys_setgroups(p, &sa, retval);
585 }
586
587 int
588 ibcs2_sys_setuid(p, v, retval)
589 struct proc *p;
590 void *v;
591 register_t *retval;
592 {
593 struct ibcs2_sys_setuid_args
594
595 *uap = v;
596 struct sys_setuid_args sa;
597
598 SCARG(&sa, uid) = (uid_t)SCARG(uap, uid);
599 return sys_setuid(p, &sa, retval);
600 }
601
602 int
603 ibcs2_sys_setgid(p, v, retval)
604 struct proc *p;
605 void *v;
606 register_t *retval;
607 {
608 struct ibcs2_sys_setgid_args
609
610 *uap = v;
611 struct sys_setgid_args sa;
612
613 SCARG(&sa, gid) = (gid_t)SCARG(uap, gid);
614 return sys_setgid(p, &sa, retval);
615 }
616
617 int
618 xenix_sys_ftime(p, v, retval)
619 struct proc *p;
620 void *v;
621 register_t *retval;
622 {
623 struct xenix_sys_ftime_args
624
625 *uap = v;
626 struct timeval tv;
627 extern struct timezone tz;
628 struct xenix_timeb itb;
629
630 microtime(&tv);
631 itb.time = tv.tv_sec;
632 itb.millitm = (tv.tv_usec / 1000);
633 itb.timezone = tz.tz_minuteswest;
634 itb.dstflag = tz.tz_dsttime;
635 return copyout((caddr_t)&itb, (caddr_t)SCARG(uap, tp),
636 xenix_timeb_len);
637 }
638
639 int
640 ibcs2_sys_time(p, v, retval)
641 struct proc *p;
642 void *v;
643 register_t *retval;
644 {
645 struct ibcs2_sys_time_args
646
647 *uap = v;
648 struct timeval tv;
649
650 microtime(&tv);
651 *retval = tv.tv_sec;
652 if (SCARG(uap, tp))
653 return copyout((caddr_t)&tv.tv_sec, (caddr_t)SCARG(uap, tp),
654 sizeof(ibcs2_time_t));
655 else
656 return 0;
657 }
658
659 int
660 ibcs2_sys_pathconf(p, v, retval)
661 struct proc *p;
662 void *v;
663 register_t *retval;
664 {
665 struct ibcs2_sys_pathconf_args
666
667
668 *uap = v;
669 SCARG(uap, name)++;
670 return sys_pathconf(p, uap, retval);
671 }
672
673 int
674 ibcs2_sys_fpathconf(p, v, retval)
675 struct proc *p;
676 void *v;
677 register_t *retval;
678 {
679 struct ibcs2_sys_fpathconf_args
680
681
682 *uap = v;
683 SCARG(uap, name)++;
684 return sys_fpathconf(p, uap, retval);
685 }
686
687 int
688 ibcs2_sys_sysconf(p, v, retval)
689 struct proc *p;
690 void *v;
691 register_t *retval;
692 {
693 struct ibcs2_sys_sysconf_args
694
695 *uap = v;
696 int mib[2], value, error;
697 size_t len;
698 struct sys___sysctl_args sa;
699 struct sys_getrlimit_args ga;
700
701 switch(SCARG(uap, name)) {
702 case IBCS2_SC_ARG_MAX:
703 mib[1] = KERN_ARGMAX;
704 break;
705
706 case IBCS2_SC_CHILD_MAX:
707 {
708 caddr_t sg = stackgap_init(p->p_emul);
709
710 SCARG(&ga, which) = RLIMIT_NPROC;
711 SCARG(&ga, rlp) = stackgap_alloc(&sg, sizeof(struct rlimit *));
712 if ((error = sys_getrlimit(p, &ga, retval)) != 0)
713 return error;
714 *retval = SCARG(&ga, rlp)->rlim_cur;
715 return 0;
716 }
717
718 case IBCS2_SC_CLK_TCK:
719 *retval = hz;
720 return 0;
721
722 case IBCS2_SC_NGROUPS_MAX:
723 mib[1] = KERN_NGROUPS;
724 break;
725
726 case IBCS2_SC_OPEN_MAX:
727 {
728 caddr_t sg = stackgap_init(p->p_emul);
729
730 SCARG(&ga, which) = RLIMIT_NOFILE;
731 SCARG(&ga, rlp) = stackgap_alloc(&sg, sizeof(struct rlimit *));
732 if ((error = sys_getrlimit(p, &ga, retval)) != 0)
733 return error;
734 *retval = SCARG(&ga, rlp)->rlim_cur;
735 return 0;
736 }
737
738 case IBCS2_SC_JOB_CONTROL:
739 mib[1] = KERN_JOB_CONTROL;
740 break;
741
742 case IBCS2_SC_SAVED_IDS:
743 mib[1] = KERN_SAVED_IDS;
744 break;
745
746 case IBCS2_SC_VERSION:
747 mib[1] = KERN_POSIX1;
748 break;
749
750 case IBCS2_SC_PASS_MAX:
751 *retval = 128;
752 return 0;
753
754 case IBCS2_SC_XOPEN_VERSION:
755 *retval = 2;
756 return 0;
757
758 default:
759 return EINVAL;
760 }
761
762 mib[0] = CTL_KERN;
763 len = sizeof(value);
764 SCARG(&sa, name) = mib;
765 SCARG(&sa, namelen) = 2;
766 SCARG(&sa, old) = &value;
767 SCARG(&sa, oldlenp) = &len;
768 SCARG(&sa, new) = NULL;
769 SCARG(&sa, newlen) = 0;
770 if ((error = sys___sysctl(p, &sa, retval)) != 0)
771 return error;
772 *retval = value;
773 return 0;
774 }
775
776 int
777 ibcs2_sys_alarm(p, v, retval)
778 struct proc *p;
779 void *v;
780 register_t *retval;
781 {
782 struct ibcs2_sys_alarm_args
783
784 *uap = v;
785 int error;
786 struct itimerval *itp, *oitp;
787 struct sys_setitimer_args sa;
788 caddr_t sg = stackgap_init(p->p_emul);
789
790 itp = stackgap_alloc(&sg, sizeof(*itp));
791 oitp = stackgap_alloc(&sg, sizeof(*oitp));
792 timerclear(&itp->it_interval);
793 itp->it_value.tv_sec = SCARG(uap, sec);
794 itp->it_value.tv_usec = 0;
795
796 SCARG(&sa, which) = ITIMER_REAL;
797 SCARG(&sa, itv) = itp;
798 SCARG(&sa, oitv) = oitp;
799 error = sys_setitimer(p, &sa, retval);
800 if (error)
801 return error;
802 if (oitp->it_value.tv_usec)
803 oitp->it_value.tv_sec++;
804 *retval = oitp->it_value.tv_sec;
805 return 0;
806 }
807
808 int
809 ibcs2_sys_getmsg(p, v, retval)
810 struct proc *p;
811 void *v;
812 register_t *retval;
813 {
814 #ifdef notyet
815 struct ibcs2_sys_getmsg_args
816
817
818
819
820 *uap = v;
821 #endif
822
823 return 0;
824 }
825
826 int
827 ibcs2_sys_putmsg(p, v, retval)
828 struct proc *p;
829 void *v;
830 register_t *retval;
831 {
832 #ifdef notyet
833 struct ibcs2_sys_putmsg_args
834
835
836
837
838 *uap = v;
839 #endif
840
841 return 0;
842 }
843
844 int
845 ibcs2_sys_times(p, v, retval)
846 struct proc *p;
847 void *v;
848 register_t *retval;
849 {
850 struct ibcs2_sys_times_args
851
852 *uap = v;
853 int error;
854 struct sys_getrusage_args ga;
855 struct tms tms;
856 struct timeval t;
857 caddr_t sg = stackgap_init(p->p_emul);
858 struct rusage *ru = stackgap_alloc(&sg, sizeof(*ru));
859 #define CONVTCK(r) (r.tv_sec * hz + r.tv_usec / (1000000 / hz))
860
861 SCARG(&ga, who) = RUSAGE_SELF;
862 SCARG(&ga, rusage) = ru;
863 error = sys_getrusage(p, &ga, retval);
864 if (error)
865 return error;
866 tms.tms_utime = CONVTCK(ru->ru_utime);
867 tms.tms_stime = CONVTCK(ru->ru_stime);
868
869 SCARG(&ga, who) = RUSAGE_CHILDREN;
870 error = sys_getrusage(p, &ga, retval);
871 if (error)
872 return error;
873 tms.tms_cutime = CONVTCK(ru->ru_utime);
874 tms.tms_cstime = CONVTCK(ru->ru_stime);
875
876 microtime(&t);
877 *retval = CONVTCK(t);
878
879 return copyout((caddr_t)&tms, (caddr_t)SCARG(uap, tp),
880 sizeof(struct tms));
881 }
882
883 int
884 ibcs2_sys_stime(p, v, retval)
885 struct proc *p;
886 void *v;
887 register_t *retval;
888 {
889 struct ibcs2_sys_stime_args
890
891 *uap = v;
892 int error;
893 struct sys_settimeofday_args sa;
894 caddr_t sg = stackgap_init(p->p_emul);
895 struct timeval *tvp;
896
897 tvp = stackgap_alloc(&sg, sizeof(*SCARG(&sa, tv)));
898 SCARG(&sa, tzp) = NULL;
899 error = copyin((caddr_t)SCARG(uap, timep), (void *)&tvp->tv_sec,
900 sizeof(long));
901 if (error)
902 return error;
903 tvp->tv_usec = 0;
904 SCARG(&sa, tv) = tvp;
905 if ((error = sys_settimeofday(p, &sa, retval)) != 0)
906 return EPERM;
907 return 0;
908 }
909
910 int
911 ibcs2_sys_utime(p, v, retval)
912 struct proc *p;
913 void *v;
914 register_t *retval;
915 {
916 struct ibcs2_sys_utime_args
917
918
919 *uap = v;
920 int error;
921 struct sys_utimes_args sa;
922 struct timeval *tp;
923 caddr_t sg = stackgap_init(p->p_emul);
924
925 tp = stackgap_alloc(&sg, 2 * sizeof(struct timeval *));
926 IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
927 SCARG(&sa, path) = SCARG(uap, path);
928 if (SCARG(uap, buf)) {
929 struct ibcs2_utimbuf ubuf;
930
931 error = copyin((caddr_t)SCARG(uap, buf), (caddr_t)&ubuf,
932 sizeof(ubuf));
933 if (error)
934 return error;
935 tp[0].tv_sec = ubuf.actime;
936 tp[0].tv_usec = 0;
937 tp[1].tv_sec = ubuf.modtime;
938 tp[1].tv_usec = 0;
939 SCARG(&sa, tptr) = tp;
940 } else
941 SCARG(&sa, tptr) = NULL;
942 return sys_utimes(p, &sa, retval);
943 }
944
945 int
946 ibcs2_sys_nice(p, v, retval)
947 struct proc *p;
948 void *v;
949 register_t *retval;
950 {
951 struct ibcs2_sys_nice_args
952
953 *uap = v;
954 int error;
955 struct sys_setpriority_args sa;
956
957 SCARG(&sa, which) = PRIO_PROCESS;
958 SCARG(&sa, who) = 0;
959 SCARG(&sa, prio) = p->p_nice - PZERO + SCARG(uap, incr);
960 if ((error = sys_setpriority(p, &sa, retval)) != 0)
961 return EPERM;
962 *retval = p->p_nice - PZERO;
963 return 0;
964 }
965
966
967
968
969
970 int
971 ibcs2_sys_pgrpsys(p, v, retval)
972 struct proc *p;
973 void *v;
974 register_t *retval;
975 {
976 struct ibcs2_sys_pgrpsys_args
977
978
979
980
981 *uap = v;
982 switch (SCARG(uap, type)) {
983 case 0:
984 *retval = p->p_pgrp->pg_id;
985 return 0;
986
987 case 1:
988 {
989 struct sys_setpgid_args sa;
990
991 SCARG(&sa, pid) = 0;
992 SCARG(&sa, pgid) = 0;
993 sys_setpgid(p, &sa, retval);
994 *retval = p->p_pgrp->pg_id;
995 return 0;
996 }
997
998 case 2:
999 {
1000 struct sys_setpgid_args sa;
1001
1002 SCARG(&sa, pid) = SCARG(uap, pid);
1003 SCARG(&sa, pgid) = SCARG(uap, pgid);
1004 return sys_setpgid(p, &sa, retval);
1005 }
1006
1007 case 3:
1008 return sys_setsid(p, NULL, retval);
1009
1010 default:
1011 return EINVAL;
1012 }
1013 }
1014
1015
1016
1017
1018
1019 int
1020 ibcs2_sys_plock(p, v, retval)
1021 struct proc *p;
1022 void *v;
1023 register_t *retval;
1024 {
1025 struct ibcs2_sys_plock_args
1026
1027 *uap = v;
1028 int error;
1029 #define IBCS2_UNLOCK 0
1030 #define IBCS2_PROCLOCK 1
1031 #define IBCS2_TEXTLOCK 2
1032 #define IBCS2_DATALOCK 4
1033
1034
1035 if ((error = suser(p, 0)) != 0)
1036 return EPERM;
1037 switch(SCARG(uap, cmd)) {
1038 case IBCS2_UNLOCK:
1039 case IBCS2_PROCLOCK:
1040 case IBCS2_TEXTLOCK:
1041 case IBCS2_DATALOCK:
1042 return 0;
1043 }
1044 return EINVAL;
1045 }
1046
1047 int
1048 ibcs2_sys_uadmin(p, v, retval)
1049 struct proc *p;
1050 void *v;
1051 register_t *retval;
1052 {
1053 struct ibcs2_sys_uadmin_args
1054
1055
1056
1057 *uap = v;
1058 int error;
1059
1060 #define SCO_A_REBOOT 1
1061 #define SCO_A_SHUTDOWN 2
1062 #define SCO_A_REMOUNT 4
1063 #define SCO_A_CLOCK 8
1064 #define SCO_A_SETCONFIG 128
1065 #define SCO_A_GETDEV 130
1066
1067 #define SCO_AD_HALT 0
1068 #define SCO_AD_BOOT 1
1069 #define SCO_AD_IBOOT 2
1070 #define SCO_AD_PWRDOWN 3
1071 #define SCO_AD_PWRNAP 4
1072
1073 #define SCO_AD_PANICBOOT 1
1074
1075 #define SCO_AD_GETBMAJ 0
1076 #define SCO_AD_GETCMAJ 1
1077
1078
1079 if ((error = suser(p, 0)) != 0)
1080 return (error);
1081
1082 switch(SCARG(uap, cmd)) {
1083 case SCO_A_REBOOT:
1084 case SCO_A_SHUTDOWN:
1085 switch(SCARG(uap, func)) {
1086 case SCO_AD_HALT:
1087 case SCO_AD_PWRDOWN:
1088 case SCO_AD_PWRNAP:
1089 boot(RB_HALT);
1090 case SCO_AD_BOOT:
1091 case SCO_AD_IBOOT:
1092 boot(RB_AUTOBOOT);
1093 }
1094 return EINVAL;
1095 case SCO_A_REMOUNT:
1096 case SCO_A_CLOCK:
1097 case SCO_A_SETCONFIG:
1098 return 0;
1099 case SCO_A_GETDEV:
1100 return EINVAL;
1101 }
1102 return EINVAL;
1103 }
1104
1105 int
1106 ibcs2_sys_sysfs(p, v, retval)
1107 struct proc *p;
1108 void *v;
1109 register_t *retval;
1110 {
1111 struct ibcs2_sys_sysfs_args
1112
1113
1114
1115 *uap = v;
1116
1117 #define IBCS2_GETFSIND 1
1118 #define IBCS2_GETFSTYP 2
1119 #define IBCS2_GETNFSTYP 3
1120
1121 switch(SCARG(uap, cmd)) {
1122 case IBCS2_GETFSIND:
1123 case IBCS2_GETFSTYP:
1124 case IBCS2_GETNFSTYP:
1125 break;
1126 }
1127 return EINVAL;
1128 }
1129
1130 int
1131 xenix_sys_rdchk(p, v, retval)
1132 struct proc *p;
1133 void *v;
1134 register_t *retval;
1135 {
1136 struct xenix_sys_rdchk_args
1137
1138 *uap = v;
1139 int error;
1140 struct sys_ioctl_args sa;
1141 caddr_t sg = stackgap_init(p->p_emul);
1142
1143 SCARG(&sa, fd) = SCARG(uap, fd);
1144 SCARG(&sa, com) = FIONREAD;
1145 SCARG(&sa, data) = stackgap_alloc(&sg, sizeof(int));
1146 if ((error = sys_ioctl(p, &sa, retval)) != 0)
1147 return error;
1148 *retval = (*((int *)SCARG(&sa, data))) ? 1 : 0;
1149 return 0;
1150 }
1151
1152 int
1153 xenix_sys_chsize(p, v, retval)
1154 struct proc *p;
1155 void *v;
1156 register_t *retval;
1157 {
1158 struct xenix_sys_chsize_args
1159
1160
1161 *uap = v;
1162 struct sys_ftruncate_args sa;
1163
1164 SCARG(&sa, fd) = SCARG(uap, fd);
1165 SCARG(&sa, pad) = 0;
1166 SCARG(&sa, length) = SCARG(uap, size);
1167 return sys_ftruncate(p, &sa, retval);
1168 }
1169
1170 int
1171 xenix_sys_nap(p, v, retval)
1172 struct proc *p;
1173 void *v;
1174 register_t *retval;
1175 {
1176 #ifdef notyet
1177 struct xenix_sys_nap_args
1178
1179 *uap = v;
1180 #endif
1181
1182 return ENOSYS;
1183 }
1184
1185 int
1186 ibcs2_sys_unlink(p, v, retval)
1187 struct proc *p;
1188 void *v;
1189 register_t *retval;
1190 {
1191 struct ibcs2_sys_unlink_args
1192
1193 *uap = v;
1194 caddr_t sg = stackgap_init(p->p_emul);
1195
1196 IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
1197 return sys_unlink(p, uap, retval);
1198 }
1199
1200 int
1201 ibcs2_sys_chdir(p, v, retval)
1202 struct proc *p;
1203 void *v;
1204 register_t *retval;
1205 {
1206 struct ibcs2_sys_chdir_args
1207
1208 *uap = v;
1209 caddr_t sg = stackgap_init(p->p_emul);
1210
1211 IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
1212 return sys_chdir(p, uap, retval);
1213 }
1214
1215 int
1216 ibcs2_sys_chmod(p, v, retval)
1217 struct proc *p;
1218 void *v;
1219 register_t *retval;
1220 {
1221 struct ibcs2_sys_chmod_args
1222
1223
1224 *uap = v;
1225 caddr_t sg = stackgap_init(p->p_emul);
1226
1227 IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
1228 return sys_chmod(p, uap, retval);
1229 }
1230
1231 int
1232 ibcs2_sys_chown(p, v, retval)
1233 struct proc *p;
1234 void *v;
1235 register_t *retval;
1236 {
1237 struct ibcs2_sys_chown_args
1238
1239
1240
1241 *uap = v;
1242 caddr_t sg = stackgap_init(p->p_emul);
1243
1244 IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
1245 return sys_chown(p, uap, retval);
1246 }
1247
1248 int
1249 ibcs2_sys_rmdir(p, v, retval)
1250 struct proc *p;
1251 void *v;
1252 register_t *retval;
1253 {
1254 struct ibcs2_sys_rmdir_args
1255
1256 *uap = v;
1257 caddr_t sg = stackgap_init(p->p_emul);
1258
1259 IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
1260 return sys_rmdir(p, uap, retval);
1261 }
1262
1263 int
1264 ibcs2_sys_mkdir(p, v, retval)
1265 struct proc *p;
1266 void *v;
1267 register_t *retval;
1268 {
1269 struct ibcs2_sys_mkdir_args
1270
1271
1272 *uap = v;
1273 caddr_t sg = stackgap_init(p->p_emul);
1274
1275 IBCS2_CHECK_ALT_CREAT(p, &sg, SCARG(uap, path));
1276 return sys_mkdir(p, uap, retval);
1277 }
1278
1279 int
1280 ibcs2_sys_symlink(p, v, retval)
1281 struct proc *p;
1282 void *v;
1283 register_t *retval;
1284 {
1285 struct ibcs2_sys_symlink_args
1286
1287
1288 *uap = v;
1289 caddr_t sg = stackgap_init(p->p_emul);
1290
1291 IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
1292 IBCS2_CHECK_ALT_CREAT(p, &sg, SCARG(uap, link));
1293 return sys_symlink(p, uap, retval);
1294 }
1295
1296 int
1297 ibcs2_sys_rename(p, v, retval)
1298 struct proc *p;
1299 void *v;
1300 register_t *retval;
1301 {
1302 struct ibcs2_sys_rename_args
1303
1304
1305 *uap = v;
1306 caddr_t sg = stackgap_init(p->p_emul);
1307
1308 IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, from));
1309 IBCS2_CHECK_ALT_CREAT(p, &sg, SCARG(uap, to));
1310 return sys_rename(p, uap, retval);
1311 }
1312
1313 int
1314 ibcs2_sys_readlink(p, v, retval)
1315 struct proc *p;
1316 void *v;
1317 register_t *retval;
1318 {
1319 struct ibcs2_sys_readlink_args
1320
1321
1322
1323 *uap = v;
1324 caddr_t sg = stackgap_init(p->p_emul);
1325
1326 IBCS2_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
1327 return sys_readlink(p, uap, retval);
1328 }
1329
1330 int
1331 ibcs2_sys_sysi86(p, v, retval)
1332 struct proc *p;
1333 void *v;
1334 register_t *retval;
1335 {
1336 struct ibcs2_sys_sysi86_args
1337
1338
1339 *uap = v;
1340 int val, error;
1341
1342 switch (SCARG(uap, cmd)) {
1343 case IBCS2_SI86FPHW:
1344 val = IBCS2_FP_NO;
1345 #ifdef MATH_EMULATE
1346 val = IBCS2_FP_SW;
1347 #else
1348 val = IBCS2_FP_387;
1349 #endif
1350 if ((error = copyout((caddr_t)&val, (caddr_t)SCARG(uap, arg),
1351 sizeof(val))))
1352 return error;
1353 break;
1354
1355 case IBCS2_SI86STIME:
1356 case IBCS2_SI86SETNAME:
1357 return EINVAL;
1358
1359 case IBCS2_SI86PHYSMEM:
1360 *retval = ctob(physmem);
1361 break;
1362
1363 default:
1364 return EINVAL;
1365 }
1366 return 0;
1367 }