[BACK]Return to ibcs2_misc.c CVS log [TXT][DIR] Up to [local] / sys / compat / ibcs2

Annotation of sys/compat/ibcs2/ibcs2_misc.c, Revision 1.1.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