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

Annotation of sys/compat/common/uipc_syscalls_43.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: uipc_syscalls_43.c,v 1.7 2003/06/02 23:27:59 millert Exp $    */
                      2: /*     $NetBSD: uipc_syscalls_43.c,v 1.5 1996/03/14 19:31:50 christos Exp $    */
                      3:
                      4: /*
                      5:  * Copyright (c) 1982, 1986, 1989, 1990, 1993
                      6:  *     The Regents of the University of California.  All rights reserved.
                      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. Neither the name of the University nor the names of its contributors
                     17:  *    may be used to endorse or promote products derived from this software
                     18:  *    without specific prior written permission.
                     19:  *
                     20:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     21:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     22:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     23:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     24:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     25:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     26:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     27:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     28:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     29:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     30:  * SUCH DAMAGE.
                     31:  *
                     32:  *     @(#)uipc_syscalls.c     8.4 (Berkeley) 2/21/94
                     33:  */
                     34:
                     35: #include <sys/param.h>
                     36: #include <sys/systm.h>
                     37: #include <sys/filedesc.h>
                     38: #include <sys/kernel.h>
                     39: #include <sys/proc.h>
                     40: #include <sys/file.h>
                     41: #include <sys/socket.h>
                     42: #include <sys/socketvar.h>
                     43: #include <sys/stat.h>
                     44: #include <sys/ioctl.h>
                     45: #include <sys/fcntl.h>
                     46: #include <sys/malloc.h>
                     47: #include <sys/syslog.h>
                     48: #include <sys/unistd.h>
                     49: #include <sys/resourcevar.h>
                     50:
                     51: #include <sys/mount.h>
                     52: #include <sys/syscallargs.h>
                     53:
                     54: int
                     55: compat_43_sys_accept(p, v, retval)
                     56:        struct proc *p;
                     57:        void *v;
                     58:        register_t *retval;
                     59: {
                     60:        struct sys_accept_args /* {
                     61:                syscallarg(int) s;
                     62:                syscallarg(caddr_t) name;
                     63:                syscallarg(int *) anamelen;
                     64:        } */ *uap = v;
                     65:        int error;
                     66:
                     67:        if ((error = sys_accept(p, uap, retval)) != 0)
                     68:                return error;
                     69:
                     70:        if (SCARG(uap, name)) {
                     71:                struct sockaddr sa;
                     72:
                     73:                if ((error = copyin(SCARG(uap, name), &sa, sizeof(sa))) != 0)
                     74:                        return error;
                     75:
                     76:                ((struct osockaddr*) &sa)->sa_family = sa.sa_family;
                     77:
                     78:                if ((error = copyout(&sa, SCARG(uap, name), sizeof(sa))) != 0)
                     79:                        return error;
                     80:        }
                     81:        return 0;
                     82: }
                     83:
                     84:
                     85: int
                     86: compat_43_sys_getpeername(p, v, retval)
                     87:        struct proc *p;
                     88:        void *v;
                     89:        register_t *retval;
                     90: {
                     91:        struct sys_getpeername_args /* {
                     92:                syscallarg(int) fdes;
                     93:                syscallarg(caddr_t) asa;
                     94:                syscallarg(int *) alen;
                     95:        } */ *uap = v;
                     96:        struct sockaddr sa;
                     97:
                     98:        int error;
                     99:
                    100:        if ((error = sys_getpeername(p, uap, retval)) != 0)
                    101:                return error;
                    102:
                    103:        if ((error = copyin(SCARG(uap, asa), &sa, sizeof(sa))) != 0)
                    104:                return error;
                    105:
                    106:        ((struct osockaddr*) &sa)->sa_family = sa.sa_family;
                    107:
                    108:        if ((error = copyout(&sa, SCARG(uap, asa), sizeof(sa))) != 0)
                    109:                return error;
                    110:
                    111:        return 0;
                    112: }
                    113:
                    114:
                    115: int
                    116: compat_43_sys_getsockname(p, v, retval)
                    117:        struct proc *p;
                    118:        void *v;
                    119:        register_t *retval;
                    120: {
                    121:        struct sys_getsockname_args /* {
                    122:                syscallarg(int) fdes;
                    123:                syscallarg(caddr_t) asa;
                    124:                syscallarg(int *) alen;
                    125:        } */ *uap = v;
                    126:        struct sockaddr sa;
                    127:        int error;
                    128:
                    129:        if ((error = sys_getsockname(p, uap, retval)) != 0)
                    130:                return error;
                    131:
                    132:        if ((error = copyin(SCARG(uap, asa), &sa, sizeof(sa))) != 0)
                    133:                return error;
                    134:
                    135:        ((struct osockaddr*) &sa)->sa_family = sa.sa_family;
                    136:
                    137:        if ((error = copyout(&sa, SCARG(uap, asa), sizeof(sa))) != 0)
                    138:                return error;
                    139:
                    140:        return 0;
                    141: }
                    142:
                    143:
                    144: int
                    145: compat_43_sys_recv(p, v, retval)
                    146:        struct proc *p;
                    147:        void *v;
                    148:        register_t *retval;
                    149: {
                    150:        register struct compat_43_sys_recv_args /* {
                    151:                syscallarg(int) s;
                    152:                syscallarg(caddr_t) buf;
                    153:                syscallarg(int) len;
                    154:                syscallarg(int) flags;
                    155:        } */ *uap = v;
                    156:        struct msghdr msg;
                    157:        struct iovec aiov;
                    158:
                    159:        msg.msg_name = 0;
                    160:        msg.msg_namelen = 0;
                    161:        msg.msg_iov = &aiov;
                    162:        msg.msg_iovlen = 1;
                    163:        aiov.iov_base = SCARG(uap, buf);
                    164:        aiov.iov_len = SCARG(uap, len);
                    165:        msg.msg_control = 0;
                    166:        msg.msg_flags = SCARG(uap, flags);
                    167:        return (recvit(p, SCARG(uap, s), &msg, (caddr_t)0, retval));
                    168: }
                    169:
                    170:
                    171: #ifdef MSG_COMPAT
                    172: int
                    173: compat_43_sys_recvfrom(p, v, retval)
                    174:        struct proc *p;
                    175:        void *v;
                    176:        register_t *retval;
                    177: {
                    178:        struct sys_recvfrom_args /* {
                    179:                syscallarg(int) s;
                    180:                syscallarg(caddr_t) buf;
                    181:                syscallarg(size_t) len;
                    182:                syscallarg(int) flags;
                    183:                syscallarg(caddr_t) from;
                    184:                syscallarg(int *) fromlenaddr;
                    185:        } */ *uap = v;
                    186:
                    187:        SCARG(uap, flags) |= MSG_COMPAT;
                    188:        return (sys_recvfrom(p, uap, retval));
                    189: }
                    190: #endif
                    191:
                    192:
                    193: #ifdef MSG_COMPAT
                    194: /*
                    195:  * Old recvmsg.  This code takes advantage of the fact that the old msghdr
                    196:  * overlays the new one, missing only the flags, and with the (old) access
                    197:  * rights where the control fields are now.
                    198:  */
                    199: int
                    200: compat_43_sys_recvmsg(p, v, retval)
                    201:        struct proc *p;
                    202:        void *v;
                    203:        register_t *retval;
                    204: {
                    205:        register struct compat_43_sys_recvmsg_args /* {
                    206:                syscallarg(int) s;
                    207:                syscallarg(struct omsghdr *) msg;
                    208:                syscallarg(int) flags;
                    209:        } */ *uap = v;
                    210:        struct msghdr msg;
                    211:        struct iovec aiov[UIO_SMALLIOV], *iov;
                    212:        int error;
                    213:
                    214:        error = copyin((caddr_t)SCARG(uap, msg), (caddr_t)&msg,
                    215:            sizeof (struct omsghdr));
                    216:        if (error)
                    217:                return (error);
                    218:        if (msg.msg_iovlen <= 0 || msg.msg_iovlen > IOV_MAX)
                    219:                return (EMSGSIZE);
                    220:        if (msg.msg_iovlen > UIO_SMALLIOV)
                    221:                MALLOC(iov, struct iovec *,
                    222:                      sizeof(struct iovec) * msg.msg_iovlen, M_IOV, M_WAITOK);
                    223:        else
                    224:                iov = aiov;
                    225:        msg.msg_flags = SCARG(uap, flags) | MSG_COMPAT;
                    226:        error = copyin((caddr_t)msg.msg_iov, (caddr_t)iov,
                    227:            (unsigned)(msg.msg_iovlen * sizeof (struct iovec)));
                    228:        if (error)
                    229:                goto done;
                    230:        msg.msg_iov = iov;
                    231:        error = recvit(p, SCARG(uap, s), &msg,
                    232:            (caddr_t)&SCARG(uap, msg)->msg_namelen, retval);
                    233:
                    234:        if (msg.msg_controllen && error == 0)
                    235:                error = copyout((caddr_t)&msg.msg_controllen,
                    236:                    (caddr_t)&SCARG(uap, msg)->msg_accrightslen, sizeof (int));
                    237: done:
                    238:        if (iov != aiov)
                    239:                FREE(iov, M_IOV);
                    240:        return (error);
                    241: }
                    242: #endif
                    243:
                    244: int
                    245: compat_43_sys_send(p, v, retval)
                    246:        struct proc *p;
                    247:        void *v;
                    248:        register_t *retval;
                    249: {
                    250:        register struct compat_43_sys_send_args /* {
                    251:                syscallarg(int) s;
                    252:                syscallarg(caddr_t) buf;
                    253:                syscallarg(int) len;
                    254:                syscallarg(int) flags;
                    255:        } */ *uap = v;
                    256:        struct msghdr msg;
                    257:        struct iovec aiov;
                    258:
                    259:        msg.msg_name = 0;
                    260:        msg.msg_namelen = 0;
                    261:        msg.msg_iov = &aiov;
                    262:        msg.msg_iovlen = 1;
                    263:        aiov.iov_base = SCARG(uap, buf);
                    264:        aiov.iov_len = SCARG(uap, len);
                    265:        msg.msg_control = 0;
                    266:        msg.msg_flags = 0;
                    267:        return (sendit(p, SCARG(uap, s), &msg, SCARG(uap, flags), retval));
                    268: }
                    269:
                    270: #ifdef MSG_COMPAT
                    271: int
                    272: compat_43_sys_sendmsg(p, v, retval)
                    273:        struct proc *p;
                    274:        void *v;
                    275:        register_t *retval;
                    276: {
                    277:        register struct compat_43_sys_sendmsg_args /* {
                    278:                syscallarg(int) s;
                    279:                syscallarg(caddr_t) msg;
                    280:                syscallarg(int) flags;
                    281:        } */ *uap = v;
                    282:        struct msghdr msg;
                    283:        struct iovec aiov[UIO_SMALLIOV], *iov;
                    284:        int error;
                    285:
                    286:        error = copyin(SCARG(uap, msg), (caddr_t)&msg,
                    287:            sizeof (struct omsghdr));
                    288:        if (error)
                    289:                return (error);
                    290:        if (msg.msg_iovlen <= 0 || msg.msg_iovlen > IOV_MAX)
                    291:                return (EMSGSIZE);
                    292:        if (msg.msg_iovlen > UIO_SMALLIOV)
                    293:                MALLOC(iov, struct iovec *,
                    294:                      sizeof(struct iovec) * msg.msg_iovlen, M_IOV, M_WAITOK);
                    295:        else
                    296:                iov = aiov;
                    297:        error = copyin((caddr_t)msg.msg_iov, (caddr_t)iov,
                    298:            (unsigned)(msg.msg_iovlen * sizeof (struct iovec)));
                    299:        if (error)
                    300:                goto done;
                    301:        msg.msg_flags = MSG_COMPAT;
                    302:        msg.msg_iov = iov;
                    303:        error = sendit(p, SCARG(uap, s), &msg, SCARG(uap, flags), retval);
                    304: done:
                    305:        if (iov != aiov)
                    306:                FREE(iov, M_IOV);
                    307:        return (error);
                    308: }
                    309: #endif

CVSweb