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

Annotation of sys/compat/aout/compat_aout.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: compat_aout.c,v 1.2 2003/08/23 19:28:53 tedu Exp $ */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 2003 Marc Espie
        !             5:  * All rights reserved.
        !             6:  *
        !             7:  * Redistribution and use in source and binary forms, with or without
        !             8:  * modification, are permitted provided that the following conditions
        !             9:  * are met:
        !            10:  * 1. Redistributions of source code must retain the above copyright
        !            11:  *    notice, this list of conditions and the following disclaimer.
        !            12:  * 2. The name of the author may not be used to endorse or promote products
        !            13:  *    derived from this software without specific prior written permission
        !            14:  *
        !            15:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            16:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
        !            17:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        !            18:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
        !            19:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
        !            20:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        !            21:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        !            22:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            23:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
        !            24:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            25:  *
        !            26:  */
        !            27: #include <sys/param.h>
        !            28: #include <sys/syscall.h>
        !            29: #include <sys/signalvar.h>
        !            30: #include <sys/mount.h>
        !            31: #include <sys/syscallargs.h>
        !            32: #include <sys/fcntl.h>
        !            33: #include <compat/common/compat_util.h>
        !            34:
        !            35: void aout_compat_setup(struct exec_package *epp);
        !            36:
        !            37: extern char sigcode[], esigcode[];
        !            38:
        !            39: struct sysent aout_sysent[SYS_MAXSYSCALL];
        !            40:
        !            41: struct emul emul_aout = {
        !            42:        "aout",
        !            43:        NULL,
        !            44:        sendsig,
        !            45:        SYS_syscall,
        !            46:        SYS_MAXSYSCALL,
        !            47:        NULL,
        !            48: #ifdef SYSCALL_DEBUG
        !            49:        syscallnames,
        !            50: #else
        !            51:        NULL,
        !            52: #endif
        !            53:        0,
        !            54:        copyargs,
        !            55:        setregs,
        !            56:        NULL,
        !            57:        sigcode,
        !            58:        esigcode,
        !            59: };
        !            60:
        !            61: #ifdef syscallarg
        !            62: #undef syscallarg
        !            63: #endif
        !            64:
        !            65: #define        syscallarg(x)                                                   \
        !            66:        union {                                                         \
        !            67:                register_t pad;                                         \
        !            68:                struct { x datum; } le;                                 \
        !            69:                struct {                                                \
        !            70:                        int8_t pad[ (sizeof (register_t) < sizeof (x))  \
        !            71:                                ? 0                                     \
        !            72:                                : sizeof (register_t) - sizeof (x)];    \
        !            73:                        x datum;                                        \
        !            74:                } be;                                                   \
        !            75:        }
        !            76:
        !            77:
        !            78: struct aout_sys_open_args {
        !            79:        syscallarg(char *) path;
        !            80:        syscallarg(int) flags;
        !            81:        syscallarg(int) mode;
        !            82: };
        !            83:
        !            84: struct aout_sys_link_args {
        !            85:        syscallarg(char *) path;
        !            86:        syscallarg(char *) link;
        !            87: };
        !            88:
        !            89: struct aout_sys_unlink_args {
        !            90:        syscallarg(char *) path;
        !            91: };
        !            92:
        !            93: struct aout_sys_rename_args {
        !            94:        syscallarg(char *) from;
        !            95:        syscallarg(char *) to;
        !            96: };
        !            97:
        !            98: int aout_sys_open(struct proc *, void *, register_t *);
        !            99: int aout_sys_link(struct proc *, void *, register_t *);
        !           100: int aout_sys_unlink(struct proc *, void *, register_t *);
        !           101: int aout_sys_rename(struct proc *, void *, register_t *);
        !           102:
        !           103: const char aout_path[] = "/emul/a.out";
        !           104:
        !           105: #define AOUT_CHECK_ALT_EXIST(p, sgp, path) \
        !           106:     CHECK_ALT_EXIST(p, sgp, aout_path, path)
        !           107:
        !           108: #define  AOUT_CHECK_ALT_CREAT(p, sgp, path) \
        !           109:     CHECK_ALT_CREAT(p, sgp, aout_path, path)
        !           110:
        !           111: /* XXX We just translate enough calls to allow ldconfig and ld.so to work. */
        !           112:
        !           113: void
        !           114: aout_compat_setup(struct exec_package *epp)
        !           115: {
        !           116:        if (emul_aout.e_sysent == NULL) {
        !           117:                memcpy(aout_sysent, sysent, sizeof aout_sysent);
        !           118:                aout_sysent[SYS_open].sy_call = aout_sys_open;
        !           119:                aout_sysent[SYS_link].sy_call = aout_sys_link;
        !           120:                aout_sysent[SYS_unlink].sy_call = aout_sys_unlink;
        !           121:                aout_sysent[SYS_rename].sy_call = aout_sys_rename;
        !           122:                emul_aout.e_sysent = aout_sysent;
        !           123:        }
        !           124:        epp->ep_emul = &emul_aout;
        !           125: }
        !           126:
        !           127: int
        !           128: aout_sys_open(p, v, retval)
        !           129:        struct proc *p;
        !           130:        void *v;
        !           131:        register_t *retval;
        !           132: {
        !           133:        struct aout_sys_open_args /* {
        !           134:                syscallarg(char *) path;
        !           135:                syscallarg(int) flags;
        !           136:                syscallarg(int) mode;
        !           137:        } */ *uap = v;
        !           138:        caddr_t sg = stackgap_init(p->p_emul);
        !           139:
        !           140:        if (SCARG(uap, flags) & O_CREAT)
        !           141:                AOUT_CHECK_ALT_CREAT(p, &sg, SCARG(uap, path));
        !           142:        else
        !           143:                AOUT_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
        !           144:        return sys_open(p, uap, retval);
        !           145: }
        !           146:
        !           147: int
        !           148: aout_sys_link(p, v, retval)
        !           149:        struct proc *p;
        !           150:        void *v;
        !           151:        register_t *retval;
        !           152: {
        !           153:        struct aout_sys_link_args /* {
        !           154:                syscallarg(char *) path;
        !           155:                syscallarg(char *) link;
        !           156:        } */ *uap = v;
        !           157:        caddr_t sg = stackgap_init(p->p_emul);
        !           158:
        !           159:        AOUT_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
        !           160:        AOUT_CHECK_ALT_CREAT(p, &sg, SCARG(uap, link));
        !           161:        return sys_link(p, uap, retval);
        !           162: }
        !           163:
        !           164: int
        !           165: aout_sys_unlink(p, v, retval)
        !           166:        struct proc *p;
        !           167:        void *v;
        !           168:        register_t *retval;
        !           169: {
        !           170:        struct aout_sys_unlink_args /* {
        !           171:                syscallarg(char *) path;
        !           172:        } */ *uap = v;
        !           173:        caddr_t sg = stackgap_init(p->p_emul);
        !           174:
        !           175:        AOUT_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
        !           176:        return sys_unlink(p, uap, retval);
        !           177: }
        !           178:
        !           179:
        !           180: int
        !           181: aout_sys_rename(p, v, retval)
        !           182:        struct proc *p;
        !           183:        void *v;
        !           184:        register_t *retval;
        !           185: {
        !           186:        struct aout_sys_rename_args /* {
        !           187:                syscallarg(char *) from;
        !           188:                syscallarg(char *) to;
        !           189:        } */ *uap = v;
        !           190:        caddr_t sg = stackgap_init(p->p_emul);
        !           191:
        !           192:        AOUT_CHECK_ALT_EXIST(p, &sg, SCARG(uap, from));
        !           193:        AOUT_CHECK_ALT_CREAT(p, &sg, SCARG(uap, to));
        !           194:        return sys_rename(p, uap, retval);
        !           195: }

CVSweb