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

Annotation of sys/compat/ultrix/ultrix_misc.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: ultrix_misc.c,v 1.30 2007/06/06 17:15:13 deraadt Exp $        */
                      2: /*     $NetBSD: ultrix_misc.c,v 1.23 1996/04/07 17:23:04 jonathan Exp $        */
                      3:
                      4: /*
                      5:  * Copyright (c) 1995
                      6:  *     Jonathan Stone (hereinafter referred to as the author)
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  * 3. The name of the author may not be used to endorse or promote products
                     17:  *    derived from this software without specific prior written permission.
                     18:  *
                     19:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
                     20:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     21:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     22:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
                     23:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     24:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     25:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     26:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     27:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     28:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     29:  * SUCH DAMAGE.
                     30:  */
                     31:
                     32: /*
                     33:  * Copyright (c) 1992, 1993
                     34:  *     The Regents of the University of California.  All rights reserved.
                     35:  *
                     36:  * This software was developed by the Computer Systems Engineering group
                     37:  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
                     38:  * contributed to Berkeley.
                     39:  *
                     40:  * All advertising materials mentioning features or use of this software
                     41:  * must display the following acknowledgement:
                     42:  *     This product includes software developed by the University of
                     43:  *     California, Lawrence Berkeley Laboratory.
                     44:  *
                     45:  * Redistribution and use in source and binary forms, with or without
                     46:  * modification, are permitted provided that the following conditions
                     47:  * are met:
                     48:  * 1. Redistributions of source code must retain the above copyright
                     49:  *    notice, this list of conditions and the following disclaimer.
                     50:  * 2. Redistributions in binary form must reproduce the above copyright
                     51:  *    notice, this list of conditions and the following disclaimer in the
                     52:  *    documentation and/or other materials provided with the distribution.
                     53:  * 3. Neither the name of the University nor the names of its contributors
                     54:  *    may be used to endorse or promote products derived from this software
                     55:  *    without specific prior written permission.
                     56:  *
                     57:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     58:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     59:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     60:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     61:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     62:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     63:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     64:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     65:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     66:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     67:  * SUCH DAMAGE.
                     68:  *
                     69:  *
                     70:  *     @(#)sun_misc.c  8.1 (Berkeley) 6/18/93
                     71:  *
                     72:  * from: Header: sun_misc.c,v 1.16 93/04/07 02:46:27 torek Exp
                     73:  */
                     74:
                     75: /*
                     76:  * SunOS compatibility module.
                     77:  *
                     78:  * SunOS system calls that are implemented differently in BSD are
                     79:  * handled here.
                     80:  */
                     81:
                     82: #include <sys/param.h>
                     83: #include <sys/systm.h>
                     84: #include <sys/namei.h>
                     85: #include <sys/dirent.h>
                     86: #include <sys/proc.h>
                     87: #include <sys/file.h>
                     88: #include <sys/filedesc.h>
                     89: /*#include <sys/stat.h>*/
                     90: /*#include <sys/ioctl.h>*/
                     91: #include <sys/kernel.h>
                     92: #include <sys/exec.h>
                     93: #include <sys/malloc.h>
                     94: #include <sys/mbuf.h>
                     95: #include <sys/mman.h>
                     96: #include <sys/mount.h>
                     97: #include <sys/resource.h>
                     98: #include <sys/resourcevar.h>
                     99: #include <sys/signal.h>
                    100: #include <sys/signalvar.h>
                    101: #include <sys/socket.h>
                    102: #include <sys/vnode.h>
                    103: #include <sys/uio.h>
                    104: #include <sys/wait.h>
                    105: #include <sys/utsname.h>
                    106: #include <sys/unistd.h>
                    107:
                    108: #include <sys/syscallargs.h>
                    109:
                    110: #include <compat/ultrix/ultrix_syscall.h>
                    111: #include <compat/ultrix/ultrix_syscallargs.h>
                    112: #include <compat/ultrix/ultrix_util.h>
                    113:
                    114: #include <netinet/in.h>
                    115:
                    116: #include <miscfs/specfs/specdev.h>
                    117:
                    118: #include <nfs/rpcv2.h>
                    119: #include <nfs/nfsproto.h>
                    120: #include <nfs/nfs.h>
                    121:
                    122: #include <uvm/uvm_extern.h>
                    123:
                    124: #include <sys/conf.h>                                  /* iszerodev() */
                    125: #include <sys/socketvar.h>                             /* sosetopt() */
                    126:
                    127: extern struct sysent ultrix_sysent[];
                    128: #ifdef SYSCALL_DEBUG
                    129: extern char *ultrix_syscallnames[];
                    130: #endif
                    131:
                    132: /*
                    133:  * Select the appropriate setregs callback for the target architecture.
                    134:  */
                    135: #ifdef __mips__
                    136: #define ULTRIX_EXEC_SETREGS cpu_exec_ecoff_setregs
                    137: #endif /* __mips__ */
                    138:
                    139: #ifdef __vax__
                    140: #define ULTRIX_EXEC_SETREGS setregs
                    141: #endif /* __vax__ */
                    142:
                    143:
                    144: extern void ULTRIX_EXEC_SETREGS(struct proc *, struct exec_package *,
                    145:                                        u_long, register_t *);
                    146: extern char sigcode[], esigcode[];
                    147:
                    148: struct emul emul_ultrix = {
                    149:        "ultrix",
                    150:        NULL,
                    151:        sendsig,
                    152:        ULTRIX_SYS_syscall,
                    153:        ULTRIX_SYS_MAXSYSCALL,
                    154:        ultrix_sysent,
                    155: #ifdef SYSCALL_DEBUG
                    156:        ultrix_syscallnames,
                    157: #else
                    158:        NULL,
                    159: #endif
                    160:        0,
                    161:        copyargs,
                    162:        ULTRIX_EXEC_SETREGS,
                    163:        NULL,
                    164:        sigcode,
                    165:        esigcode,
                    166: };
                    167:
                    168: #define GSI_PROG_ENV 1
                    169:
                    170: int
                    171: ultrix_sys_getsysinfo(p, v, retval)
                    172:        struct proc *p;
                    173:        void *v;
                    174:        register_t *retval;
                    175: {
                    176:        struct ultrix_sys_getsysinfo_args *uap = v;
                    177:        static short progenv = 0;
                    178:
                    179:        switch (SCARG(uap, op)) {
                    180:                /* operations implemented: */
                    181:        case GSI_PROG_ENV:
                    182:                if (SCARG(uap, nbytes) < sizeof(short))
                    183:                        return EINVAL;
                    184:                *retval = 1;
                    185:                return (copyout(&progenv, SCARG(uap, buffer), sizeof(short)));
                    186:        default:
                    187:                *retval = 0; /* info unavail */
                    188:                return 0;
                    189:        }
                    190: }
                    191:
                    192: int
                    193: ultrix_sys_setsysinfo(p, v, retval)
                    194:        struct proc *p;
                    195:        void *v;
                    196:        register_t *retval;
                    197: {
                    198:
                    199: #ifdef notyet
                    200:        struct ultrix_sys_setsysinfo_args *uap = v;
                    201: #endif
                    202:
                    203:        *retval = 0;
                    204:        return 0;
                    205: }
                    206:
                    207: int
                    208: ultrix_sys_waitpid(p, v, retval)
                    209:        struct proc *p;
                    210:        void *v;
                    211:        register_t *retval;
                    212: {
                    213:        struct ultrix_sys_waitpid_args *uap = v;
                    214:        struct sys_wait4_args ua;
                    215:
                    216:        SCARG(&ua, pid) = SCARG(uap, pid);
                    217:        SCARG(&ua, status) = SCARG(uap, status);
                    218:        SCARG(&ua, options) = SCARG(uap, options);
                    219:        SCARG(&ua, rusage) = 0;
                    220:
                    221:        return (sys_wait4(p, &ua, retval));
                    222: }
                    223:
                    224: int
                    225: ultrix_sys_wait3(p, v, retval)
                    226:        struct proc *p;
                    227:        void *v;
                    228:        register_t *retval;
                    229: {
                    230:        struct ultrix_sys_wait3_args *uap = v;
                    231:        struct sys_wait4_args ua;
                    232:
                    233:        SCARG(&ua, pid) = -1;
                    234:        SCARG(&ua, status) = SCARG(uap, status);
                    235:        SCARG(&ua, options) = SCARG(uap, options);
                    236:        SCARG(&ua, rusage) = SCARG(uap, rusage);
                    237:
                    238:        return (sys_wait4(p, &ua, retval));
                    239: }
                    240:
                    241: /*
                    242:  * Ultrix binaries pass in FD_MAX as the first arg to select().
                    243:  * On Ultrix, FD_MAX is 4096, which is more than the NetBSD sys_select()
                    244:  * can handle.
                    245:  * Since we can't have more than the (native) FD_MAX descriptors open,
                    246:  * limit nfds to at most FD_MAX.
                    247:  */
                    248: int
                    249: ultrix_sys_select(p, v, retval)
                    250:        struct proc *p;
                    251:        void *v;
                    252:        register_t *retval;
                    253: {
                    254:        struct sys_select_args *uap = v;
                    255:        struct timeval atv;
                    256:        int error;
                    257:
                    258:        /* Limit number of FDs selected on to the native maximum */
                    259:
                    260:        if (SCARG(uap, nd) > FD_SETSIZE)
                    261:                SCARG(uap, nd) = FD_SETSIZE;
                    262:
                    263:        /* Check for negative timeval */
                    264:        if (SCARG(uap, tv)) {
                    265:                error = copyin((caddr_t)SCARG(uap, tv), (caddr_t)&atv,
                    266:                               sizeof(atv));
                    267:                if (error)
                    268:                        goto done;
                    269: #ifdef DEBUG
                    270:                /* Ultrix clients sometimes give negative timeouts? */
                    271:                if (atv.tv_sec < 0 || atv.tv_usec < 0)
                    272:                        printf("ultrix select( %ld, %ld): negative timeout\n",
                    273:                               atv.tv_sec, atv.tv_usec);
                    274:                /*tvp = (timeval *)STACKGAPBASE;*/
                    275: #endif
                    276:
                    277:        }
                    278:        error = sys_select(p, (void *) uap, retval);
                    279:        if (error == EINVAL)
                    280:                printf("ultrix select: bad args?\n");
                    281:
                    282: done:
                    283:        return error;
                    284: }
                    285:
                    286: #if defined(NFSCLIENT)
                    287: int
                    288: async_daemon(p, v, retval)
                    289:        struct proc *p;
                    290:        void *v;
                    291:        register_t *retval;
                    292: {
                    293:        struct sys_nfssvc_args ouap;
                    294:
                    295:        SCARG(&ouap, flag) = NFSSVC_BIOD;
                    296:        SCARG(&ouap, argp) = NULL;
                    297:
                    298:        return (sys_nfssvc(p, &ouap, retval));
                    299: }
                    300: #endif /* NFSCLIENT */
                    301:
                    302:
                    303: #define        SUN__MAP_NEW    0x80000000      /* if not, old mmap & cannot handle */
                    304:
                    305: int
                    306: ultrix_sys_mmap(p, v, retval)
                    307:        struct proc *p;
                    308:        void *v;
                    309:        register_t *retval;
                    310: {
                    311:        struct ultrix_sys_mmap_args *uap = v;
                    312:        struct sys_mmap_args ouap;
                    313:
                    314:        /*
                    315:         * Verify the arguments.
                    316:         */
                    317:        if (SCARG(uap, prot) & ~(PROT_READ|PROT_WRITE|PROT_EXEC))
                    318:                return (EINVAL);                        /* XXX still needed? */
                    319:
                    320:        if ((SCARG(uap, flags) & SUN__MAP_NEW) == 0)
                    321:                return (EINVAL);
                    322:
                    323:        SCARG(&ouap, flags) = SCARG(uap, flags) & ~SUN__MAP_NEW;
                    324:        SCARG(&ouap, addr) = SCARG(uap, addr);
                    325:
                    326:        if ((SCARG(&ouap, flags) & MAP_FIXED) == 0 &&
                    327:            SCARG(&ouap, addr) != 0 &&
                    328:            SCARG(&ouap, addr) < (void *)round_page((vaddr_t)p->p_vmspace->vm_daddr+MAXDSIZ))
                    329:                SCARG(&ouap, addr) = (void *)round_page((vaddr_t)p->p_vmspace->vm_daddr+MAXDSIZ);
                    330:
                    331:        SCARG(&ouap, len) = SCARG(uap, len);
                    332:        SCARG(&ouap, prot) = SCARG(uap, prot);
                    333:        SCARG(&ouap, fd) = SCARG(uap, fd);
                    334:        SCARG(&ouap, pos) = SCARG(uap, pos);
                    335:
                    336:        return (sys_mmap(p, &ouap, retval));
                    337: }
                    338:
                    339: int
                    340: ultrix_sys_setsockopt(p, v, retval)
                    341:        struct proc *p;
                    342:        void *v;
                    343:        register_t *retval;
                    344: {
                    345:        register struct ultrix_sys_setsockopt_args *uap = v;
                    346:        struct file *fp;
                    347:        struct mbuf *m = NULL;
                    348:        int error;
                    349:
                    350:        if ((error = getsock(p->p_fd, SCARG(uap, s), &fp))  != 0)
                    351:                return (error);
                    352: #define        SO_DONTLINGER (~SO_LINGER)
                    353:        if (SCARG(uap, name) == SO_DONTLINGER) {
                    354:                m = m_get(M_WAIT, MT_SOOPTS);
                    355:                mtod(m, struct linger *)->l_onoff = 0;
                    356:                m->m_len = sizeof(struct linger);
                    357:                error = (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
                    358:                    SO_LINGER, m));
                    359:                goto bad;
                    360:        }
                    361:        if (SCARG(uap, valsize) > MLEN) {
                    362:                error = EINVAL;
                    363:                goto bad;
                    364:        }
                    365:        if (SCARG(uap, val)) {
                    366:                m = m_get(M_WAIT, MT_SOOPTS);
                    367:                if ((error = copyin(SCARG(uap, val), mtod(m, caddr_t),
                    368:                                    (u_int)SCARG(uap, valsize))) != 0) {
                    369:                        (void) m_free(m);
                    370:                        goto bad;
                    371:                }
                    372:                m->m_len = SCARG(uap, valsize);
                    373:        }
                    374:        error = (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
                    375:            SCARG(uap, name), m));
                    376: bad:
                    377:        FRELE(fp);
                    378:        return (error);
                    379: }
                    380:
                    381: struct ultrix_utsname {
                    382:        char    sysname[9];
                    383:        char    nodename[9];
                    384:        char    nodeext[65-9];
                    385:        char    release[9];
                    386:        char    version[9];
                    387:        char    machine[9];
                    388: };
                    389:
                    390: int
                    391: ultrix_sys_uname(p, v, retval)
                    392:        struct proc *p;
                    393:        void *v;
                    394:        register_t *retval;
                    395: {
                    396:        struct ultrix_sys_uname_args *uap = v;
                    397:        struct ultrix_utsname sut;
                    398:        extern char machine[];
                    399:
                    400:        bzero(&sut, sizeof(sut));
                    401:
                    402:        bcopy(ostype, sut.sysname, sizeof(sut.sysname) - 1);
                    403:        bcopy(hostname, sut.nodename, sizeof(sut.nodename));
                    404:        sut.nodename[sizeof(sut.nodename)-1] = '\0';
                    405:        bcopy(osrelease, sut.release, sizeof(sut.release) - 1);
                    406:        bcopy("1", sut.version, sizeof(sut.version) - 1);
                    407:        bcopy(machine, sut.machine, sizeof(sut.machine) - 1);
                    408:
                    409:        return copyout((caddr_t)&sut, (caddr_t)SCARG(uap, name),
                    410:            sizeof(struct ultrix_utsname));
                    411: }
                    412:
                    413: int
                    414: ultrix_sys_setpgrp(p, v, retval)
                    415:        struct proc *p;
                    416:        void *v;
                    417:        register_t *retval;
                    418: {
                    419:        struct ultrix_sys_setpgrp_args *uap = v;
                    420:
                    421:        /*
                    422:         * difference to our setpgid call is to include backwards
                    423:         * compatibility to pre-setsid() binaries. Do setsid()
                    424:         * instead of setpgid() in those cases where the process
                    425:         * tries to create a new session the old way.
                    426:         */
                    427:        if (!SCARG(uap, pgid) &&
                    428:            (!SCARG(uap, pid) || SCARG(uap, pid) == p->p_pid))
                    429:                return sys_setsid(p, uap, retval);
                    430:        else
                    431:                return sys_setpgid(p, uap, retval);
                    432: }
                    433:
                    434: #if defined (NFSSERVER)
                    435: int
                    436: ultrix_sys_nfssvc(p, v, retval)
                    437:        struct proc *p;
                    438:        void *v;
                    439:        register_t *retval;
                    440: {
                    441:
                    442: #if 0  /* XXX */
                    443:        struct ultrix_sys_nfssvc_args *uap = v;
                    444:        struct emul *e = p->p_emul;
                    445:        struct sys_nfssvc_args outuap;
                    446:        struct sockaddr sa;
                    447:        int error;
                    448:
                    449:        bzero(&outuap, sizeof outuap);
                    450:        SCARG(&outuap, fd) = SCARG(uap, fd);
                    451:        SCARG(&outuap, mskval) = STACKGAPBASE;
                    452:        SCARG(&outuap, msklen) = sizeof sa;
                    453:        SCARG(&outuap, mtchval) = outuap.mskval + sizeof sa;
                    454:        SCARG(&outuap, mtchlen) = sizeof sa;
                    455:
                    456:        bzero(&sa, sizeof sa);
                    457:        if (error = copyout(&sa, SCARG(&outuap, mskval), SCARG(&outuap, msklen)))
                    458:                return (error);
                    459:        if (error = copyout(&sa, SCARG(&outuap, mtchval), SCARG(&outuap, mtchlen)))
                    460:                return (error);
                    461:
                    462:        return nfssvc(p, &outuap, retval);
                    463: #else
                    464:        return (ENOSYS);
                    465: #endif
                    466: }
                    467: #endif /* NFSSERVER */
                    468:
                    469: struct ultrix_ustat {
                    470:        int32_t f_tfree;        /* total free */
                    471:        ino_t   f_tinode;       /* total inodes free */
                    472:        char    f_fname[6];     /* filsys name */
                    473:        char    f_fpack[6];     /* filsys pack name */
                    474: };
                    475:
                    476: int
                    477: ultrix_sys_ustat(p, v, retval)
                    478:        struct proc *p;
                    479:        void *v;
                    480:        register_t *retval;
                    481: {
                    482:        struct ultrix_sys_ustat_args *uap = v;
                    483:        struct ultrix_ustat us;
                    484:        int error;
                    485:
                    486:        bzero(&us, sizeof us);
                    487:
                    488:        /*
                    489:         * XXX: should set f_tfree and f_tinode at least
                    490:         * How do we translate dev -> fstat? (and then to ultrix_ustat)
                    491:         */
                    492:
                    493:        if ((error = copyout(&us, SCARG(uap, buf), sizeof us)) != 0)
                    494:                return (error);
                    495:        return 0;
                    496: }
                    497:
                    498: int
                    499: ultrix_sys_quotactl(p, v, retval)
                    500:        struct proc *p;
                    501:        void *v;
                    502:        register_t *retval;
                    503: {
                    504:
                    505: #ifdef notyet
                    506:        struct ultrix_sys_quotactl_args *uap = v;
                    507: #endif
                    508:
                    509:        return EINVAL;
                    510: }
                    511:
                    512: int
                    513: ultrix_sys_vhangup(p, v, retval)
                    514:        struct proc *p;
                    515:        void *v;
                    516:        register_t *retval;
                    517: {
                    518:
                    519:        return 0;
                    520: }
                    521:
                    522: int
                    523: ultrix_sys_exportfs(p, v, retval)
                    524:        struct proc *p;
                    525:        void *v;
                    526:        register_t *retval;
                    527: {
                    528: #ifdef notyet
                    529:        struct ultrix_sys_exportfs_args *uap = v;
                    530: #endif
                    531:
                    532:        /*
                    533:         * XXX: should perhaps translate into a mount(2)
                    534:         * with MOUNT_EXPORT?
                    535:         */
                    536:        return 0;
                    537: }
                    538:
                    539: int
                    540: ultrix_sys_sigpending(p, v, retval)
                    541:        struct proc *p;
                    542:        void *v;
                    543:        register_t *retval;
                    544: {
                    545:        struct ultrix_sys_sigpending_args *uap = v;
                    546:        int mask = p->p_siglist & p->p_sigmask;
                    547:
                    548:        return (copyout((caddr_t)&mask, (caddr_t)SCARG(uap, mask), sizeof(int)));
                    549: }
                    550:
                    551: int
                    552: ultrix_sys_sigcleanup(p, v, retval)
                    553:        struct proc *p;
                    554:        void *v;
                    555:        register_t *retval;
                    556: {
                    557:        struct ultrix_sys_sigcleanup_args *uap = v;
                    558:
                    559:        return sys_sigreturn(p, (struct sys_sigreturn_args *)uap, retval);
                    560: }
                    561:
                    562: int
                    563: ultrix_sys_sigreturn(p, v, retval)
                    564:        struct proc *p;
                    565:        void *v;
                    566:        register_t *retval;
                    567: {
                    568:        struct ultrix_sys_sigcleanup_args *uap = v;
                    569:
                    570: #ifdef DEBUG
                    571:        printf("ultrix sigreturn\n");
                    572: #endif
                    573:        return sys_sigreturn(p, (struct sys_sigreturn_args  *)uap, retval);
                    574: }
                    575:
                    576: int
                    577: ultrix_sys_execve(p, v, retval)
                    578:        struct proc *p;
                    579:        void *v;
                    580:        register_t *retval;
                    581: {
                    582:        struct ultrix_sys_execve_args /* {
                    583:                syscallarg(char *) path;
                    584:                syscallarg(char **) argv;
                    585:                syscallarg(char **) envp;
                    586:         } */ *uap = v;
                    587:        struct sys_execve_args ap;
                    588:        caddr_t sg;
                    589:
                    590:        sg = stackgap_init(p->p_emul);
                    591:        ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
                    592:
                    593:        SCARG(&ap, path) = SCARG(uap, path);
                    594:        SCARG(&ap, argp) = SCARG(uap, argp);
                    595:        SCARG(&ap, envp) = SCARG(uap, envp);
                    596:
                    597:        return (sys_execve(p, &ap, retval));
                    598: }

CVSweb