[BACK]Return to hpux_net.c CVS log [TXT][DIR] Up to [local] / sys / compat / hpux / m68k

Annotation of sys/compat/hpux/m68k/hpux_net.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: hpux_net.c,v 1.1 2004/07/09 21:33:45 mickey Exp $     */
        !             2: /*     $NetBSD: hpux_net.c,v 1.14 1997/04/01 19:59:02 scottr Exp $     */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 1988 University of Utah.
        !             6:  * Copyright (c) 1990, 1993
        !             7:  *     The Regents of the University of California.  All rights reserved.
        !             8:  *
        !             9:  * This code is derived from software contributed to Berkeley by
        !            10:  * the Systems Programming Group of the University of Utah Computer
        !            11:  * Science Department.
        !            12:  *
        !            13:  * Redistribution and use in source and binary forms, with or without
        !            14:  * modification, are permitted provided that the following conditions
        !            15:  * are met:
        !            16:  * 1. Redistributions of source code must retain the above copyright
        !            17:  *    notice, this list of conditions and the following disclaimer.
        !            18:  * 2. Redistributions in binary form must reproduce the above copyright
        !            19:  *    notice, this list of conditions and the following disclaimer in the
        !            20:  *    documentation and/or other materials provided with the distribution.
        !            21:  * 3. Neither the name of the University nor the names of its contributors
        !            22:  *    may be used to endorse or promote products derived from this software
        !            23:  *    without specific prior written permission.
        !            24:  *
        !            25:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
        !            26:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            27:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            28:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            29:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            30:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            31:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            32:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            33:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            34:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            35:  * SUCH DAMAGE.
        !            36:  *
        !            37:  * from: Utah $Hdr: hpux_net.c 1.8 93/08/02$
        !            38:  *
        !            39:  *     @(#)hpux_net.c  8.2 (Berkeley) 9/9/93
        !            40:  */
        !            41:
        !            42: /*
        !            43:  * Network related HP-UX compatibility routines
        !            44:  */
        !            45:
        !            46: #include <sys/param.h>
        !            47: #include <sys/systm.h>
        !            48: #include <sys/kernel.h>
        !            49: #include <sys/time.h>
        !            50: #include <sys/errno.h>
        !            51: #include <sys/proc.h>
        !            52: #include <sys/file.h>
        !            53: #include <sys/filedesc.h>
        !            54: #include <sys/mbuf.h>
        !            55: #include <sys/mount.h>
        !            56: #include <sys/socket.h>
        !            57: #include <sys/socketvar.h>
        !            58: #include <sys/uio.h>
        !            59: #include <sys/ktrace.h>
        !            60: #include <sys/syscallargs.h>
        !            61:
        !            62: #include <compat/hpux/hpux.h>
        !            63: #include <compat/hpux/hpux_util.h>
        !            64: #include <compat/hpux/m68k/hpux_syscallargs.h>
        !            65:
        !            66: struct hpux_sys_getsockopt_args {
        !            67:        syscallarg(int) s;
        !            68:        syscallarg(int) level;
        !            69:        syscallarg(int) name;
        !            70:        syscallarg(caddr_t) val;
        !            71:        syscallarg(int *) avalsize;
        !            72: };
        !            73:
        !            74: int    hpux_sys_setsockopt2(struct proc *, void *, register_t *);
        !            75: int    hpux_sys_getsockopt(struct proc *, void *, register_t *);
        !            76:
        !            77: void   socksetsize(int, struct mbuf *);
        !            78:
        !            79:
        !            80: #define MINBSDIPCCODE  0x3EE
        !            81: #define NUMBSDIPC      32
        !            82:
        !            83: /*
        !            84:  * HPUX netioctl() to BSD syscall map.
        !            85:  * Indexed by callno - MINBSDIPCCODE
        !            86:  */
        !            87:
        !            88: struct hpuxtobsdipc {
        !            89:        int (*rout)(struct proc *, void *, register_t *);
        !            90:        int nargs;
        !            91: } hpuxtobsdipc[NUMBSDIPC] = {
        !            92:        { sys_socket,                   3 }, /* 3ee */
        !            93:        { sys_listen,                   2 }, /* 3ef */
        !            94:        { sys_bind,                     3 }, /* 3f0 */
        !            95:        { compat_43_sys_accept,         3 }, /* 3f1 */
        !            96:        { sys_connect,                  3 }, /* 3f2 */
        !            97:        { compat_43_sys_recv,           4 }, /* 3f3 */
        !            98:        { compat_43_sys_send,           4 }, /* 3f4 */
        !            99:        { sys_shutdown,                 2 }, /* 3f5 */
        !           100:        { compat_43_sys_getsockname,    3 }, /* 3f6 */
        !           101:        { hpux_sys_setsockopt2,         5 }, /* 3f7 */
        !           102:        { sys_sendto,                   6 }, /* 3f8 */
        !           103:        { compat_43_sys_recvfrom,       6 }, /* 3f9 */
        !           104:        { compat_43_sys_getpeername,    3 }, /* 3fa */
        !           105:        { NULL,                         0 }, /* 3fb */
        !           106:        { NULL,                         0 }, /* 3fc */
        !           107:        { NULL,                         0 }, /* 3fd */
        !           108:        { NULL,                         0 }, /* 3fe */
        !           109:        { NULL,                         0 }, /* 3ff */
        !           110:        { NULL,                         0 }, /* 400 */
        !           111:        { NULL,                         0 }, /* 401 */
        !           112:        { NULL,                         0 }, /* 402 */
        !           113:        { NULL,                         0 }, /* 403 */
        !           114:        { NULL,                         0 }, /* 404 */
        !           115:        { NULL,                         0 }, /* 405 */
        !           116:        { NULL,                         0 }, /* 406 */
        !           117:        { NULL,                         0 }, /* 407 */
        !           118:        { NULL,                         0 }, /* 408 */
        !           119:        { NULL,                         0 }, /* 409 */
        !           120:        { NULL,                         0 }, /* 40a */
        !           121:        { hpux_sys_getsockopt,          5 }, /* 40b */
        !           122:        { NULL,                         0 }, /* 40c */
        !           123:        { NULL,                         0 }, /* 40d */
        !           124: };
        !           125:
        !           126: /*
        !           127:  * Single system call entry to BSD style IPC.
        !           128:  * Gleened from disassembled libbsdipc.a syscall entries.
        !           129:  */
        !           130: int
        !           131: hpux_sys_netioctl(p, v, retval)
        !           132:        struct proc *p;
        !           133:        void *v;
        !           134:        register_t *retval;
        !           135: {
        !           136:        struct hpux_sys_netioctl_args *uap = v;
        !           137:        int *args, i;
        !           138:        int code;
        !           139:        int error;
        !           140:
        !           141:        args = SCARG(uap, args);
        !           142:        code = SCARG(uap, call) - MINBSDIPCCODE;
        !           143:        if (code < 0 || code >= NUMBSDIPC || hpuxtobsdipc[code].rout == NULL)
        !           144:                return (EINVAL);
        !           145:        if ((i = hpuxtobsdipc[code].nargs * sizeof (int)) &&
        !           146:            (error = copyin((caddr_t)args, (caddr_t)uap, (u_int)i))) {
        !           147: #ifdef KTRACE
        !           148:                 if (KTRPOINT(p, KTR_SYSCALL))
        !           149:                         ktrsyscall(p, code + MINBSDIPCCODE,
        !           150:                                   hpuxtobsdipc[code].nargs,
        !           151:                                   (register_t *)uap);
        !           152: #endif
        !           153:                return (error);
        !           154:        }
        !           155: #ifdef KTRACE
        !           156:         if (KTRPOINT(p, KTR_SYSCALL))
        !           157:                 ktrsyscall(p, code + MINBSDIPCCODE,
        !           158:                           hpuxtobsdipc[code].nargs,
        !           159:                           (register_t *)uap);
        !           160: #endif
        !           161:        return ((*hpuxtobsdipc[code].rout)(p, uap, retval));
        !           162: }
        !           163:
        !           164: void
        !           165: socksetsize(size, m)
        !           166:        int size;
        !           167:        struct mbuf *m;
        !           168: {
        !           169:        int tmp;
        !           170:
        !           171:        if (size < sizeof(int)) {
        !           172:                switch(size) {
        !           173:                case 1:
        !           174:                        tmp = (int) *mtod(m, char *);
        !           175:                        break;
        !           176:                case 2:
        !           177:                        tmp = (int) *mtod(m, short *);
        !           178:                        break;
        !           179:                case 3:
        !           180:                default:        /* XXX uh, what if sizeof(int) > 4? */
        !           181:                        tmp = (((int) *mtod(m, int *)) >> 8) & 0xffffff;
        !           182:                        break;
        !           183:                }
        !           184:                *mtod(m, int *) = tmp;
        !           185:                m->m_len = sizeof(int);
        !           186:        } else {
        !           187:                m->m_len = size;
        !           188:        }
        !           189: }
        !           190:
        !           191: /* ARGSUSED */
        !           192: int
        !           193: hpux_sys_setsockopt2(p, v, retval)
        !           194:        struct proc *p;
        !           195:        void *v;
        !           196:        register_t *retval;
        !           197: {
        !           198:        struct hpux_sys_setsockopt_args *uap = v;
        !           199:        struct file *fp;
        !           200:        struct mbuf *m = NULL;
        !           201:        int tmp, error;
        !           202:
        !           203:        if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)))
        !           204:                return (error);
        !           205:        if (SCARG(uap, valsize) > MLEN) {
        !           206:                error = EINVAL;
        !           207:                goto bad;
        !           208:        }
        !           209:        if (SCARG(uap, val)) {
        !           210:                m = m_get(M_WAIT, MT_SOOPTS);
        !           211:                if ((error = copyin(SCARG(uap, val), mtod(m, caddr_t),
        !           212:                    (u_int)SCARG(uap, valsize)))) {
        !           213:                        (void) m_free(m);
        !           214:                        goto bad;
        !           215:                }
        !           216:                if (SCARG(uap, name) == SO_LINGER) {
        !           217:                        tmp = *mtod(m, int *);
        !           218:                        mtod(m, struct linger *)->l_onoff = 1;
        !           219:                        mtod(m, struct linger *)->l_linger = tmp;
        !           220:                        m->m_len = sizeof(struct linger);
        !           221:                } else
        !           222:                        socksetsize(SCARG(uap, valsize), m);
        !           223:        } else if (SCARG(uap, name) == ~SO_LINGER) {
        !           224:                m = m_get(M_WAIT, MT_SOOPTS);
        !           225:                SCARG(uap, name) = SO_LINGER;
        !           226:                mtod(m, struct linger *)->l_onoff = 0;
        !           227:                m->m_len = sizeof(struct linger);
        !           228:        }
        !           229:        error = sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
        !           230:            SCARG(uap, name), m);
        !           231: bad:
        !           232:        FRELE(fp);
        !           233:        return (error);
        !           234: }
        !           235:
        !           236: /* ARGSUSED */
        !           237: int
        !           238: hpux_sys_setsockopt(p, v, retval)
        !           239:        struct proc *p;
        !           240:        void *v;
        !           241:        register_t *retval;
        !           242: {
        !           243:        struct hpux_sys_setsockopt_args *uap = v;
        !           244:        struct file *fp;
        !           245:        struct mbuf *m = NULL;
        !           246:        int error;
        !           247:
        !           248:        if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)))
        !           249:                return (error);
        !           250:        if (SCARG(uap, valsize) > MLEN) {
        !           251:                error = EINVAL;
        !           252:                goto bad;
        !           253:        }
        !           254:        if (SCARG(uap, val)) {
        !           255:                m = m_get(M_WAIT, MT_SOOPTS);
        !           256:                if ((error = copyin(SCARG(uap, val), mtod(m, caddr_t),
        !           257:                    (u_int)SCARG(uap, valsize)))) {
        !           258:                        m_free(m);
        !           259:                        goto bad;
        !           260:                }
        !           261:                socksetsize(SCARG(uap, valsize), m);
        !           262:        }
        !           263:        error = sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
        !           264:            SCARG(uap, name), m);
        !           265: bad:
        !           266:        FRELE(fp);
        !           267:        return (error);
        !           268: }
        !           269:
        !           270: int
        !           271: hpux_sys_getsockopt(p, v, retval)
        !           272:        struct proc *p;
        !           273:        void *v;
        !           274:        register_t *retval;
        !           275: {
        !           276:        struct hpux_sys_getsockopt_args *uap = v;
        !           277:        struct file *fp;
        !           278:        struct mbuf *m = NULL;
        !           279:        int valsize, error;
        !           280:
        !           281:        if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)))
        !           282:                return (error);
        !           283:        if (SCARG(uap, val)) {
        !           284:                if ((error = copyin((caddr_t)SCARG(uap, avalsize),
        !           285:                    (caddr_t)&valsize, sizeof (valsize)))) {
        !           286:                        goto bad;
        !           287:                }
        !           288:        } else
        !           289:                valsize = 0;
        !           290:        if ((error = sogetopt((struct socket *)fp->f_data, SCARG(uap, level),
        !           291:            SCARG(uap, name), &m)))
        !           292:                goto bad;
        !           293:        if (SCARG(uap, val) && valsize && m != NULL) {
        !           294:                if (SCARG(uap, name) == SO_LINGER) {
        !           295:                        if (mtod(m, struct linger *)->l_onoff)
        !           296:                                *mtod(m, int *) = mtod(m, struct linger *)->l_linger;
        !           297:                        else
        !           298:                                *mtod(m, int *) = 0;
        !           299:                        m->m_len = sizeof(int);
        !           300:                }
        !           301:                if (valsize > m->m_len)
        !           302:                        valsize = m->m_len;
        !           303:                error = copyout(mtod(m, caddr_t), SCARG(uap, val),
        !           304:                    (u_int)valsize);
        !           305:                if (error == 0)
        !           306:                        error = copyout((caddr_t)&valsize,
        !           307:                            (caddr_t)SCARG(uap, avalsize), sizeof (valsize));
        !           308:        }
        !           309: bad:
        !           310:        FRELE(fp);
        !           311:        if (m != NULL)
        !           312:                m_free(m);
        !           313:        return (error);
        !           314: }

CVSweb