Home | History | Annotate | Line # | Download | only in netbsd32
netbsd32_socket.c revision 1.38
      1  1.38     joerg /*	$NetBSD: netbsd32_socket.c,v 1.38 2012/01/13 21:02:03 joerg Exp $	*/
      2   1.1       mrg 
      3   1.1       mrg /*
      4   1.1       mrg  * Copyright (c) 1998, 2001 Matthew R. Green
      5   1.1       mrg  * All rights reserved.
      6   1.1       mrg  *
      7   1.1       mrg  * Redistribution and use in source and binary forms, with or without
      8   1.1       mrg  * modification, are permitted provided that the following conditions
      9   1.1       mrg  * are met:
     10   1.1       mrg  * 1. Redistributions of source code must retain the above copyright
     11   1.1       mrg  *    notice, this list of conditions and the following disclaimer.
     12   1.1       mrg  * 2. Redistributions in binary form must reproduce the above copyright
     13   1.1       mrg  *    notice, this list of conditions and the following disclaimer in the
     14   1.1       mrg  *    documentation and/or other materials provided with the distribution.
     15   1.1       mrg  *
     16   1.1       mrg  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     17   1.1       mrg  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     18   1.1       mrg  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     19   1.1       mrg  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     20   1.1       mrg  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     21   1.1       mrg  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     22   1.1       mrg  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     23   1.1       mrg  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24   1.1       mrg  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     25   1.1       mrg  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26   1.1       mrg  * SUCH DAMAGE.
     27   1.1       mrg  */
     28   1.6     lukem 
     29   1.6     lukem #include <sys/cdefs.h>
     30  1.38     joerg __KERNEL_RCSID(0, "$NetBSD: netbsd32_socket.c,v 1.38 2012/01/13 21:02:03 joerg Exp $");
     31   1.1       mrg 
     32   1.1       mrg #include <sys/param.h>
     33   1.1       mrg #include <sys/systm.h>
     34   1.1       mrg #define msg __msg /* Don't ask me! */
     35   1.1       mrg #include <sys/mount.h>
     36   1.1       mrg #include <sys/socket.h>
     37   1.1       mrg #include <sys/sockio.h>
     38   1.1       mrg #include <sys/socketvar.h>
     39   1.1       mrg #include <sys/mbuf.h>
     40   1.1       mrg #include <sys/ktrace.h>
     41   1.1       mrg #include <sys/file.h>
     42   1.1       mrg #include <sys/filedesc.h>
     43   1.1       mrg #include <sys/syscallargs.h>
     44   1.1       mrg #include <sys/proc.h>
     45  1.15  christos #include <sys/dirent.h>
     46   1.1       mrg 
     47   1.1       mrg #include <compat/netbsd32/netbsd32.h>
     48   1.1       mrg #include <compat/netbsd32/netbsd32_syscallargs.h>
     49   1.1       mrg #include <compat/netbsd32/netbsd32_conv.h>
     50   1.1       mrg 
     51  1.37     rmind /*
     52  1.38     joerg  * XXX Assumes that sockaddr is compatible.
     53  1.38     joerg  * XXX Assumes that copyout_msg_control uses identical alignment.
     54  1.37     rmind  */
     55   1.1       mrg int
     56  1.30       dsl netbsd32_recvmsg(struct lwp *l, const struct netbsd32_recvmsg_args *uap, register_t *retval)
     57   1.1       mrg {
     58  1.30       dsl 	/* {
     59   1.1       mrg 		syscallarg(int) s;
     60   1.1       mrg 		syscallarg(netbsd32_msghdrp_t) msg;
     61   1.1       mrg 		syscallarg(int) flags;
     62  1.30       dsl 	} */
     63  1.38     joerg 	struct netbsd32_msghdr	msg32;
     64  1.35     njoly 	struct iovec aiov[UIO_SMALLIOV], *iov;
     65  1.38     joerg 	struct msghdr	msg;
     66  1.38     joerg 	int		error;
     67  1.38     joerg 	struct mbuf	*from, *control;
     68  1.37     rmind 	size_t iovsz;
     69   1.1       mrg 
     70  1.38     joerg 	error = copyin(SCARG_P32(uap, msg), &msg32, sizeof(msg32));
     71   1.1       mrg 	if (error)
     72   1.1       mrg 		return (error);
     73  1.38     joerg 
     74  1.38     joerg 	iovsz = msg32.msg_iovlen * sizeof(struct iovec);
     75  1.38     joerg 	if (msg32.msg_iovlen > UIO_SMALLIOV) {
     76  1.38     joerg 		if (msg32.msg_iovlen > IOV_MAX)
     77   1.1       mrg 			return (EMSGSIZE);
     78  1.37     rmind 		iov = kmem_alloc(iovsz, KM_SLEEP);
     79  1.25  christos 	} else
     80   1.1       mrg 		iov = aiov;
     81  1.38     joerg 	error = netbsd32_to_iovecin(NETBSD32PTR64(msg32.msg_iov), iov,
     82  1.38     joerg 	    msg32.msg_iovlen);
     83   1.1       mrg 	if (error)
     84   1.1       mrg 		goto done;
     85   1.1       mrg 
     86  1.38     joerg 	msg.msg_flags = SCARG(uap, flags) & MSG_USERFLAGS;
     87  1.38     joerg 	msg.msg_name = NETBSD32PTR64(msg32.msg_name);
     88  1.38     joerg 	msg.msg_namelen = msg32.msg_namelen;
     89  1.38     joerg 	msg.msg_control = NETBSD32PTR64(msg32.msg_control);
     90  1.38     joerg 	msg.msg_controllen = msg32.msg_controllen;
     91  1.38     joerg 	msg.msg_iov = iov;
     92  1.38     joerg 	msg.msg_iovlen = msg32.msg_iovlen;
     93  1.13     perry 
     94  1.38     joerg 	error = do_sys_recvmsg(l, SCARG(uap, s), &msg, &from,
     95  1.38     joerg 	    msg.msg_control != NULL ? &control : NULL, retval);
     96  1.38     joerg 	if (error != 0)
     97  1.38     joerg 		goto done;
     98   1.1       mrg 
     99  1.38     joerg 	if (msg.msg_control != NULL)
    100  1.38     joerg 		error = copyout_msg_control(l, &msg, control);
    101  1.27        ad 
    102  1.38     joerg 	if (error == 0)
    103  1.38     joerg 		error = copyout_sockname(msg.msg_name, &msg.msg_namelen, 0,
    104  1.38     joerg 			from);
    105  1.38     joerg 	if (from != NULL)
    106  1.38     joerg 		m_free(from);
    107  1.38     joerg 	if (error == 0) {
    108  1.38     joerg 		ktrkuser("msghdr", &msg, sizeof msg);
    109  1.38     joerg 		msg32.msg_namelen = msg.msg_namelen;
    110  1.38     joerg 		msg32.msg_controllen = msg.msg_controllen;
    111  1.38     joerg 		msg32.msg_flags = msg.msg_flags;
    112  1.38     joerg 		error = copyout(&msg32, SCARG_P32(uap, msg), sizeof(msg32));
    113   1.1       mrg 	}
    114  1.27        ad 
    115  1.38     joerg  done:
    116  1.38     joerg 	if (iov != aiov)
    117  1.38     joerg 		kmem_free(iov, iovsz);
    118   1.1       mrg 	return (error);
    119   1.1       mrg }
    120   1.1       mrg 
    121   1.1       mrg int
    122  1.30       dsl netbsd32_sendmsg(struct lwp *l, const struct netbsd32_sendmsg_args *uap, register_t *retval)
    123   1.1       mrg {
    124  1.30       dsl 	/* {
    125   1.1       mrg 		syscallarg(int) s;
    126   1.1       mrg 		syscallarg(const netbsd32_msghdrp_t) msg;
    127   1.1       mrg 		syscallarg(int) flags;
    128  1.30       dsl 	} */
    129   1.1       mrg 	struct msghdr msg;
    130   1.1       mrg 	struct netbsd32_msghdr msg32;
    131   1.1       mrg 	struct iovec aiov[UIO_SMALLIOV], *iov;
    132  1.35     njoly 	struct netbsd32_iovec *iov32;
    133  1.37     rmind 	size_t iovsz;
    134   1.1       mrg 	int error;
    135   1.1       mrg 
    136  1.24       dsl 	error = copyin(SCARG_P32(uap, msg), &msg32, sizeof(msg32));
    137   1.1       mrg 	if (error)
    138   1.1       mrg 		return (error);
    139   1.1       mrg 	netbsd32_to_msghdr(&msg32, &msg);
    140  1.26       dsl 
    141  1.37     rmind 	iovsz = msg.msg_iovlen * sizeof(struct iovec);
    142   1.1       mrg 	if ((u_int)msg.msg_iovlen > UIO_SMALLIOV) {
    143   1.1       mrg 		if ((u_int)msg.msg_iovlen > IOV_MAX)
    144   1.1       mrg 			return (EMSGSIZE);
    145  1.37     rmind 		iov = kmem_alloc(iovsz, KM_SLEEP);
    146  1.36     njoly 	} else
    147   1.1       mrg 		iov = aiov;
    148  1.26       dsl 
    149  1.35     njoly 	iov32 = NETBSD32PTR64(msg32.msg_iov);
    150  1.35     njoly 	error = netbsd32_to_iovecin(iov32, iov, msg.msg_iovlen);
    151   1.1       mrg 	if (error)
    152   1.1       mrg 		goto done;
    153   1.1       mrg 	msg.msg_iov = iov;
    154  1.26       dsl 	msg.msg_flags = 0;
    155  1.26       dsl 
    156   1.1       mrg 	/* Luckily we can use this directly */
    157  1.26       dsl 	/* XXX: dsl (June'07) The cmsg alignment rules differ ! */
    158  1.26       dsl 	error = do_sys_sendmsg(l, SCARG(uap, s), &msg, SCARG(uap, flags), retval);
    159   1.1       mrg done:
    160   1.1       mrg 	if (iov != aiov)
    161  1.37     rmind 		kmem_free(iov, iovsz);
    162   1.1       mrg 	return (error);
    163   1.1       mrg }
    164   1.1       mrg 
    165   1.1       mrg int
    166  1.30       dsl netbsd32_recvfrom(struct lwp *l, const struct netbsd32_recvfrom_args *uap, register_t *retval)
    167   1.1       mrg {
    168  1.30       dsl 	/* {
    169   1.1       mrg 		syscallarg(int) s;
    170   1.1       mrg 		syscallarg(netbsd32_voidp) buf;
    171   1.1       mrg 		syscallarg(netbsd32_size_t) len;
    172   1.1       mrg 		syscallarg(int) flags;
    173   1.1       mrg 		syscallarg(netbsd32_sockaddrp_t) from;
    174   1.1       mrg 		syscallarg(netbsd32_intp) fromlenaddr;
    175  1.30       dsl 	} */
    176  1.38     joerg 	struct msghdr	msg;
    177  1.38     joerg 	struct iovec	aiov;
    178  1.38     joerg 	int		error;
    179  1.38     joerg 	struct mbuf	*from;
    180   1.1       mrg 
    181  1.38     joerg 	msg.msg_name = NULL;
    182  1.38     joerg 	msg.msg_iov = &aiov;
    183   1.1       mrg 	msg.msg_iovlen = 1;
    184  1.24       dsl 	aiov.iov_base = SCARG_P32(uap, buf);
    185  1.38     joerg 	aiov.iov_len = SCARG(uap, len);
    186  1.38     joerg 	msg.msg_control = NULL;
    187  1.38     joerg 	msg.msg_flags = SCARG(uap, flags) & MSG_USERFLAGS;
    188  1.38     joerg 
    189  1.38     joerg 	error = do_sys_recvmsg(l, SCARG(uap, s), &msg, &from, NULL, retval);
    190  1.38     joerg 	if (error != 0)
    191  1.38     joerg 		return error;
    192  1.38     joerg 
    193  1.38     joerg 	error = copyout_sockname(SCARG_P32(uap, from), SCARG_P32(uap, fromlenaddr),
    194  1.38     joerg 	    MSG_LENUSRSPACE, from);
    195  1.38     joerg 	if (from != NULL)
    196  1.38     joerg 		m_free(from);
    197  1.38     joerg 	return error;
    198   1.1       mrg }
    199   1.1       mrg 
    200   1.1       mrg int
    201  1.30       dsl netbsd32_sendto(struct lwp *l, const struct netbsd32_sendto_args *uap, register_t *retval)
    202   1.1       mrg {
    203  1.30       dsl 	/* {
    204   1.1       mrg 		syscallarg(int) s;
    205   1.1       mrg 		syscallarg(const netbsd32_voidp) buf;
    206   1.1       mrg 		syscallarg(netbsd32_size_t) len;
    207   1.1       mrg 		syscallarg(int) flags;
    208   1.1       mrg 		syscallarg(const netbsd32_sockaddrp_t) to;
    209   1.1       mrg 		syscallarg(int) tolen;
    210  1.30       dsl 	} */
    211   1.1       mrg 	struct msghdr msg;
    212   1.1       mrg 	struct iovec aiov;
    213   1.1       mrg 
    214  1.24       dsl 	msg.msg_name = SCARG_P32(uap, to); /* XXX kills const */
    215   1.1       mrg 	msg.msg_namelen = SCARG(uap, tolen);
    216   1.1       mrg 	msg.msg_iov = &aiov;
    217   1.1       mrg 	msg.msg_iovlen = 1;
    218   1.1       mrg 	msg.msg_control = 0;
    219  1.24       dsl 	aiov.iov_base = SCARG_P32(uap, buf);	/* XXX kills const */
    220   1.1       mrg 	aiov.iov_len = SCARG(uap, len);
    221  1.26       dsl 	msg.msg_flags = 0;
    222  1.26       dsl 	return do_sys_sendmsg(l, SCARG(uap, s), &msg, SCARG(uap, flags), retval);
    223   1.1       mrg }
    224