Annotation of 43BSDReno/sys/hpux/hpux_net.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1988 University of Utah.
        !             3:  * Copyright (c) 1990 The Regents of the University of California.
        !             4:  * All rights reserved.
        !             5:  *
        !             6:  * This code is derived from software contributed to Berkeley by
        !             7:  * the Systems Programming Group of the University of Utah Computer
        !             8:  * Science Department.
        !             9:  *
        !            10:  * Redistribution is only permitted until one year after the first shipment
        !            11:  * of 4.4BSD by the Regents.  Otherwise, redistribution and use in source and
        !            12:  * binary forms are permitted provided that: (1) source distributions retain
        !            13:  * this entire copyright notice and comment, and (2) distributions including
        !            14:  * binaries display the following acknowledgement:  This product includes
        !            15:  * software developed by the University of California, Berkeley and its
        !            16:  * contributors'' in the documentation or other materials provided with the
        !            17:  * distribution and in all advertising materials mentioning features or use
        !            18:  * of this software.  Neither the name of the University nor the names of
        !            19:  * its contributors may be used to endorse or promote products derived from
        !            20:  * this software without specific prior written permission.
        !            21:  * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
        !            22:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
        !            23:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            24:  *
        !            25:  * from: Utah $Hdr: hpux_net.c 1.33 89/08/23$
        !            26:  *
        !            27:  *     @(#)hpux_net.c  7.3 (Berkeley) 6/28/90
        !            28:  */
        !            29: 
        !            30: /*
        !            31:  * Network related HP-UX compatibility routines
        !            32:  */
        !            33: 
        !            34: #ifdef HPUXCOMPAT
        !            35: 
        !            36: #include "param.h"
        !            37: #include "systm.h"
        !            38: #include "kernel.h"
        !            39: #include "time.h"
        !            40: #include "errno.h"
        !            41: #include "proc.h"
        !            42: #include "file.h"
        !            43: #include "mbuf.h"
        !            44: #include "socket.h"
        !            45: #include "socketvar.h"
        !            46: #include "uio.h"
        !            47: #include "ktrace.h"
        !            48: #include "hpux.h"
        !            49: 
        !            50: #define MINBSDIPCCODE  0x3EE
        !            51: #define NUMBSDIPC      32
        !            52: 
        !            53: /*
        !            54:  * HPUX netioctl() to BSD syscall map.
        !            55:  * Indexed by callno - MINBSDIPCCODE
        !            56:  */
        !            57: extern int socket(), listen(), bind(), accept(), connect(), orecv();
        !            58: extern int osend(), shutdown(), getsockname(), sendto();
        !            59: extern int recvfrom(), getpeername();
        !            60: int hpuxgetsockopt(), hpuxsetsockopt();
        !            61: struct file *getsock();
        !            62: 
        !            63: struct hpuxtobsdipc {
        !            64:        int (*rout)();
        !            65:        int nargs;
        !            66: } hpuxtobsdipc[NUMBSDIPC] = {
        !            67:        socket,         3, /* 3ee */    listen,         2, /* 3ef */
        !            68:        bind,           3, /* 3f0 */    accept,         3, /* 3f1 */
        !            69:        connect,        3, /* 3f2 */    orecv,          4, /* 3f3 */
        !            70:        osend,          4, /* 3f4 */    shutdown,       2, /* 3f5 */
        !            71:        getsockname,    3, /* 3f6 */    hpuxsetsockopt, 5, /* 3f7 */
        !            72:        sendto,         6, /* 3f8 */    recvfrom,       6, /* 3f9 */
        !            73:        getpeername,    3, /* 3fa */    NULL,           0, /* 3fb */
        !            74:        NULL,           0, /* 3fc */    NULL,           0, /* 3fd */
        !            75:        NULL,           0, /* 3fe */    NULL,           0, /* 3ff */
        !            76:        NULL,           0, /* 400 */    NULL,           0, /* 401 */
        !            77:        NULL,           0, /* 402 */    NULL,           0, /* 403 */
        !            78:        NULL,           0, /* 404 */    NULL,           0, /* 405 */
        !            79:        NULL,           0, /* 406 */    NULL,           0, /* 407 */
        !            80:        NULL,           0, /* 408 */    NULL,           0, /* 409 */
        !            81:        NULL,           0, /* 40a */    hpuxgetsockopt, 5, /* 40b */
        !            82:        NULL,           0, /* 40c */    NULL,           0, /* 40d */
        !            83: };
        !            84: 
        !            85: /*
        !            86:  * Single system call entry to BSD style IPC.
        !            87:  * Gleened from disassembled libbsdipc.a syscall entries.
        !            88:  */
        !            89: hpuxnetioctl(p, uap, retval)
        !            90:        struct proc *p;
        !            91:        struct args {
        !            92:                int     call;
        !            93:                int     *args;
        !            94:        } *uap;
        !            95:        int *retval;
        !            96: {
        !            97:        int *args, i;
        !            98:        register int code;
        !            99:        int error;
        !           100: 
        !           101:        args = uap->args;
        !           102:        code = uap->call - MINBSDIPCCODE;
        !           103:        if (code < 0 || code >= NUMBSDIPC || hpuxtobsdipc[code].rout == NULL)
        !           104:                return (EINVAL);
        !           105:        if ((i = hpuxtobsdipc[code].nargs * sizeof (int)) &&
        !           106:            (error = copyin((caddr_t)args, (caddr_t)uap, (u_int)i))) {
        !           107: #ifdef KTRACE
        !           108:                 if (KTRPOINT(p, KTR_SYSCALL))
        !           109:                         ktrsyscall(p->p_tracep, code + MINBSDIPCCODE,
        !           110:                                   hpuxtobsdipc[code].nargs);
        !           111: #endif
        !           112:                return (error);
        !           113:        }
        !           114: #ifdef KTRACE
        !           115:         if (KTRPOINT(p, KTR_SYSCALL))
        !           116:                 ktrsyscall(p->p_tracep, code + MINBSDIPCCODE,
        !           117:                           hpuxtobsdipc[code].nargs);
        !           118: #endif
        !           119:        return ((*hpuxtobsdipc[code].rout)(p, uap, retval));
        !           120: }
        !           121: 
        !           122: hpuxsetsockopt(p, uap, retval)
        !           123:        struct proc *p;
        !           124:        struct args {
        !           125:                int     s;
        !           126:                int     level;
        !           127:                int     name;
        !           128:                caddr_t val;
        !           129:                int     valsize;
        !           130:        } *uap;
        !           131:        int *retval;
        !           132: {
        !           133:        struct file *fp;
        !           134:        struct mbuf *m = NULL;
        !           135:        int tmp, error;
        !           136: 
        !           137:        fp = getsock(uap->s, &error);
        !           138:        if (fp == 0)
        !           139:                return (error);
        !           140:        if (uap->valsize > MLEN)
        !           141:                return (EINVAL);
        !           142:        if (uap->val) {
        !           143:                m = m_get(M_WAIT, MT_SOOPTS);
        !           144:                if (m == NULL)
        !           145:                        return (ENOBUFS);
        !           146:                if (error = copyin(uap->val, mtod(m, caddr_t),
        !           147:                    (u_int)uap->valsize)) {
        !           148:                        (void) m_free(m);
        !           149:                        return (error);
        !           150:                }
        !           151:                if (uap->name == SO_LINGER) {
        !           152:                        tmp = *mtod(m, int *);
        !           153:                        mtod(m, struct linger *)->l_onoff = 1;
        !           154:                        mtod(m, struct linger *)->l_linger = tmp;
        !           155:                        m->m_len = sizeof(struct linger);
        !           156:                } else
        !           157:                        m->m_len = uap->valsize;
        !           158:        } else if (uap->name == ~SO_LINGER) {
        !           159:                m = m_get(M_WAIT, MT_SOOPTS);
        !           160:                if (m) {
        !           161:                        uap->name = SO_LINGER;
        !           162:                        mtod(m, struct linger *)->l_onoff = 0;
        !           163:                        m->m_len = sizeof(struct linger);
        !           164:                }
        !           165:        }
        !           166:        return (sosetopt((struct socket *)fp->f_data, uap->level,
        !           167:            uap->name, m));
        !           168: }
        !           169: 
        !           170: hpuxgetsockopt(p, uap, retval)
        !           171:        struct proc *p;
        !           172:        struct args {
        !           173:                int     s;
        !           174:                int     level;
        !           175:                int     name;
        !           176:                caddr_t val;
        !           177:                int     *avalsize;
        !           178:        } *uap;
        !           179:        int *retval;
        !           180: {
        !           181:        struct file *fp;
        !           182:        struct mbuf *m = NULL;
        !           183:        int valsize, error;
        !           184: 
        !           185:        fp = getsock(uap->s, &error);
        !           186:        if (fp == 0)
        !           187:                return (error);
        !           188:        if (uap->val) {
        !           189:                if (error = copyin((caddr_t)uap->avalsize, (caddr_t)&valsize,
        !           190:                    sizeof (valsize)))
        !           191:                        return (error);
        !           192:        } else
        !           193:                valsize = 0;
        !           194:        if (error = sogetopt((struct socket *)fp->f_data, uap->level,
        !           195:            uap->name, &m))
        !           196:                goto bad;
        !           197:        if (uap->val && valsize && m != NULL) {
        !           198:                if (uap->name == SO_LINGER) {
        !           199:                        if (mtod(m, struct linger *)->l_onoff)
        !           200:                                *mtod(m, int *) = mtod(m, struct linger *)->l_linger;
        !           201:                        else
        !           202:                                *mtod(m, int *) = 0;
        !           203:                        m->m_len = sizeof(int);
        !           204:                }
        !           205:                if (valsize > m->m_len)
        !           206:                        valsize = m->m_len;
        !           207:                error = copyout(mtod(m, caddr_t), uap->val, (u_int)valsize);
        !           208:                if (error == 0)
        !           209:                        error = copyout((caddr_t)&valsize,
        !           210:                            (caddr_t)uap->avalsize, sizeof (valsize));
        !           211:        }
        !           212: bad:
        !           213:        if (m != NULL)
        !           214:                (void) m_free(m);
        !           215:        return (error);
        !           216: }
        !           217: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.