Annotation of sys/compat/ibcs2/ibcs2_misc.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: ibcs2_misc.c,v 1.28 2004/06/22 23:52:18 jfb Exp $ */
! 2: /* $NetBSD: ibcs2_misc.c,v 1.23 1997/01/15 01:37:49 perry Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1994, 1995 Scott Bartram
! 6: * Copyright (c) 1992, 1993
! 7: * The Regents of the University of California. All rights reserved.
! 8: *
! 9: * This software was developed by the Computer Systems Engineering group
! 10: * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
! 11: * contributed to Berkeley.
! 12: *
! 13: * All advertising materials mentioning features or use of this software
! 14: * must display the following acknowledgement:
! 15: * This product includes software developed by the University of
! 16: * California, Lawrence Berkeley Laboratory.
! 17: *
! 18: * Redistribution and use in source and binary forms, with or without
! 19: * modification, are permitted provided that the following conditions
! 20: * are met:
! 21: * 1. Redistributions of source code must retain the above copyright
! 22: * notice, this list of conditions and the following disclaimer.
! 23: * 2. Redistributions in binary form must reproduce the above copyright
! 24: * notice, this list of conditions and the following disclaimer in the
! 25: * documentation and/or other materials provided with the distribution.
! 26: * 3. Neither the name of the University nor the names of its contributors
! 27: * may be used to endorse or promote products derived from this software
! 28: * without specific prior written permission.
! 29: *
! 30: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 31: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 32: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 33: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 34: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 35: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 36: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 37: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 38: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 39: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 40: * SUCH DAMAGE.
! 41: *
! 42: * from: Header: sun_misc.c,v 1.16 93/04/07 02:46:27 torek Exp
! 43: *
! 44: * @(#)sun_misc.c 8.1 (Berkeley) 6/18/93
! 45: */
! 46:
! 47: /*
! 48: * IBCS2 compatibility module.
! 49: *
! 50: * IBCS2 system calls that are implemented differently in BSD are
! 51: * handled here.
! 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> /* must be included after vm.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: syscallarg(int) cmd;
! 113: syscallarg(int) newlimit;
! 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: /* XXX - fix this */
! 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; /* XXX */
! 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: syscallarg(int) a1;
! 163: syscallarg(int) a2;
! 164: syscallarg(int) a3;
! 165: } */ *uap = v;
! 166: int error;
! 167: struct sys_wait4_args w4;
! 168: #define WAITPID_EFLAGS 0x8c4 /* OF, SF, ZF, PF */
! 169:
! 170: SCARG(&w4, rusage) = NULL;
! 171: if ((p->p_md.md_regs->tf_eflags & WAITPID_EFLAGS) == WAITPID_EFLAGS) {
! 172: /* waitpid */
! 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: /* wait */
! 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)) /* this is real iBCS brain-damage */
! 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: syscallarg(char *) path;
! 198: syscallarg(char **) argp;
! 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: syscallarg(char *) path;
! 221: syscallarg(char **) argv;
! 222: syscallarg(char **) envp;
! 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: syscallarg(char *) name;
! 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: syscallarg(char *) special;
! 262: syscallarg(char *) dir;
! 263: syscallarg(int) flags;
! 264: syscallarg(int) fstype;
! 265: syscallarg(char *) data;
! 266: syscallarg(int) len;
! 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: * Read iBCS2-style directory entries. We suck them into kernel space so
! 329: * that they can be massaged before being copied out to user code. Like
! 330: * SunOS, we squish out `empty' entries.
! 331: *
! 332: * This is quite ugly, but what do you expect from compatibility code?
! 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: * Massage in place to make a iBCS2-shaped dirent (otherwise
! 360: * we have to worry about touching user memory outside of
! 361: * the copyout() call).
! 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: /* advance output past iBCS2-shaped entry */
! 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: * TODO: if length(filename) > 14 then break filename into
! 399: * multiple entries and set inode = 0xffff except last
! 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: /* advance output past iBCS2-shaped entry */
! 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: syscallarg(int) fd;
! 423: syscallarg(char *) buf;
! 424: syscallarg(int) nbytes;
! 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: syscallarg(int) fd;
! 453: syscallarg(char *) buf;
! 454: syscallarg(u_int) nbytes;
! 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: syscallarg(char *) path;
! 499: syscallarg(int) mode;
! 500: syscallarg(int) dev;
! 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: syscallarg(int) gidsetsize;
! 527: syscallarg(ibcs2_gid_t *) gidset;
! 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: syscallarg(int) gidsetsize;
! 563: syscallarg(ibcs2_gid_t *) gidset;
! 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: syscallarg(int) uid;
! 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: syscallarg(int) gid;
! 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: syscallarg(struct xenix_timeb *) tp;
! 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: syscallarg(ibcs2_time_t *) tp;
! 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: syscallarg(char *) path;
! 667: syscallarg(int) name;
! 668: } */ *uap = v;
! 669: SCARG(uap, name)++; /* iBCS2 _PC_* defines are offset by one */
! 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: syscallarg(int) fd;
! 681: syscallarg(int) name;
! 682: } */ *uap = v;
! 683: SCARG(uap, name)++; /* iBCS2 _PC_* defines are offset by one */
! 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: syscallarg(int) name;
! 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; /* XXX - should we create PASS_MAX ? */
! 752: return 0;
! 753:
! 754: case IBCS2_SC_XOPEN_VERSION:
! 755: *retval = 2; /* XXX: What should that be? */
! 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: syscallarg(unsigned) sec;
! 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: syscallarg(int) fd;
! 817: syscallarg(struct ibcs2_stropts *) ctl;
! 818: syscallarg(struct ibcs2_stropts *) dat;
! 819: syscallarg(int *) flags;
! 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: syscallarg(int) fd;
! 835: syscallarg(struct ibcs2_stropts *) ctl;
! 836: syscallarg(struct ibcs2_stropts *) dat;
! 837: syscallarg(int) flags;
! 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: syscallarg(struct tms *) tp;
! 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: syscallarg(long *) timep;
! 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: syscallarg(char *) path;
! 918: syscallarg(struct ibcs2_utimbuf *) buf;
! 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: syscallarg(int) incr;
! 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: * iBCS2 getpgrp, setpgrp, setsid, and setpgid
! 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: syscallarg(int) type;
! 978: syscallarg(caddr_t) dummy;
! 979: syscallarg(int) pid;
! 980: syscallarg(int) pgid;
! 981: } */ *uap = v;
! 982: switch (SCARG(uap, type)) {
! 983: case 0: /* getpgrp */
! 984: *retval = p->p_pgrp->pg_id;
! 985: return 0;
! 986:
! 987: case 1: /* setpgrp */
! 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: /* setpgid */
! 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: /* setsid */
! 1008: return sys_setsid(p, NULL, retval);
! 1009:
! 1010: default:
! 1011: return EINVAL;
! 1012: }
! 1013: }
! 1014:
! 1015: /*
! 1016: * XXX - need to check for nested calls
! 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: syscallarg(int) cmd;
! 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; /* XXX - TODO */
! 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: syscallarg(int) cmd;
! 1055: syscallarg(int) func;
! 1056: syscallarg(caddr_t) data;
! 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: /* XXX: is this the right place for this call? */
! 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; /* XXX - TODO */
! 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: syscallarg(int) cmd;
! 1113: syscallarg(caddr_t) d1;
! 1114: syscallarg(char *) buf;
! 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; /* XXX - TODO */
! 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: syscallarg(int) fd;
! 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: syscallarg(int) fd;
! 1160: syscallarg(long) size;
! 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: syscallarg(int) millisec;
! 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: syscallarg(char *) path;
! 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: syscallarg(char *) path;
! 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: syscallarg(char *) path;
! 1223: syscallarg(int) mode;
! 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: syscallarg(char *) path;
! 1239: syscallarg(int) uid;
! 1240: syscallarg(int) gid;
! 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: syscallarg(char *) path;
! 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: syscallarg(char *) path;
! 1271: syscallarg(int) mode;
! 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: syscallarg(char *) path;
! 1287: syscallarg(char *) link;
! 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: syscallarg(char *) from;
! 1304: syscallarg(char *) to;
! 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: syscallarg(char *) path;
! 1321: syscallarg(char *) buf;
! 1322: syscallarg(int) count;
! 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: syscallarg(int) cmd;
! 1338: syscallarg(int) arg;
! 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; /* a real coprocessor */
! 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: /* XXX - not used much, if at all */
! 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: }
CVSweb