1 /* $NetBSD: netbsd32_select.c,v 1.19 2010/04/23 15:19:20 rmind Exp $ */ 2 3 /* 4 * Copyright (c) 1998, 2001 Matthew R. Green 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. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29 #include <sys/cdefs.h> 30 __KERNEL_RCSID(0, "$NetBSD: netbsd32_select.c,v 1.19 2010/04/23 15:19:20 rmind Exp $"); 31 32 #include <sys/param.h> 33 #include <sys/systm.h> 34 #include <sys/mount.h> 35 #include <sys/time.h> 36 #include <sys/vnode.h> 37 #include <sys/file.h> 38 #include <sys/filedesc.h> 39 #include <sys/poll.h> 40 #include <sys/select.h> 41 #include <sys/dirent.h> 42 43 #include <sys/proc.h> 44 45 #include <net/if.h> 46 47 #include <compat/netbsd32/netbsd32.h> 48 #include <compat/netbsd32/netbsd32_syscall.h> 49 #include <compat/netbsd32/netbsd32_syscallargs.h> 50 #include <compat/netbsd32/netbsd32_conv.h> 51 52 int 53 netbsd32___select50(struct lwp *l, 54 const struct netbsd32___select50_args *uap, register_t *retval) 55 { 56 /* { 57 syscallarg(int) nd; 58 syscallarg(netbsd32_fd_setp_t) in; 59 syscallarg(netbsd32_fd_setp_t) ou; 60 syscallarg(netbsd32_fd_setp_t) ex; 61 syscallarg(netbsd32_timevalp_t) tv; 62 } */ 63 int error; 64 struct netbsd32_timeval tv32; 65 struct timespec ats, *ts = NULL; 66 67 if (SCARG_P32(uap, tv)) { 68 error = copyin(SCARG_P32(uap, tv), &tv32, sizeof(tv32)); 69 if (error != 0) 70 return error; 71 ats.tv_sec = tv32.tv_sec; 72 ats.tv_nsec = tv32.tv_usec * 1000; 73 ts = &ats; 74 } 75 76 return selcommon(retval, SCARG(uap, nd), SCARG_P32(uap, in), 77 SCARG_P32(uap, ou), SCARG_P32(uap, ex), ts, NULL); 78 } 79 80 int 81 netbsd32___pselect50(struct lwp *l, 82 const struct netbsd32___pselect50_args *uap, register_t *retval) 83 { 84 /* { 85 syscallarg(int) nd; 86 syscallarg(netbsd32_fd_setp_t) in; 87 syscallarg(netbsd32_fd_setp_t) ou; 88 syscallarg(netbsd32_fd_setp_t) ex; 89 syscallarg(const netbsd32_timespecp_t) ts; 90 syscallarg(const netbsd32_sigsetp_t) mask; 91 } */ 92 int error; 93 struct netbsd32_timespec ts32; 94 struct timespec ats, *ts = NULL; 95 sigset_t amask, *mask = NULL; 96 97 if (SCARG_P32(uap, ts)) { 98 error = copyin(SCARG_P32(uap, ts), &ts32, sizeof(ts32)); 99 if (error != 0) 100 return error; 101 netbsd32_to_timespec(&ts32, &ats); 102 ts = &ats; 103 } 104 if (SCARG_P32(uap, mask)) { 105 error = copyin(SCARG_P32(uap, mask), &amask, sizeof(amask)); 106 if (error != 0) 107 return error; 108 mask = &amask; 109 } 110 111 return selcommon(retval, SCARG(uap, nd), SCARG_P32(uap, in), 112 SCARG_P32(uap, ou), SCARG_P32(uap, ex), ts, mask); 113 } 114 115 int 116 netbsd32___pollts50(struct lwp *l, const struct netbsd32___pollts50_args *uap, 117 register_t *retval) 118 { 119 /* { 120 syscallarg(struct netbsd32_pollfdp_t) fds; 121 syscallarg(u_int) nfds; 122 syscallarg(const netbsd32_timespecp_t) ts; 123 syscallarg(const netbsd32_sigsetp_t) mask; 124 } */ 125 int error; 126 struct netbsd32_timespec ts32; 127 struct timespec ats, *ts = NULL; 128 sigset_t amask, *mask = NULL; 129 130 if (SCARG_P32(uap, ts)) { 131 error = copyin(SCARG_P32(uap, ts), &ts32, sizeof(ts32)); 132 if (error != 0) 133 return error; 134 netbsd32_to_timespec(&ts32, &ats); 135 ts = &ats; 136 } 137 if (NETBSD32PTR64( SCARG(uap, mask))) { 138 error = copyin(SCARG_P32(uap, mask), &amask, sizeof(amask)); 139 if (error != 0) 140 return error; 141 mask = &amask; 142 } 143 144 return pollcommon(retval, SCARG_P32(uap, fds), 145 SCARG(uap, nfds), ts, mask); 146 } 147