1 /* $NetBSD: netbsd32_select.c,v 1.17 2009/03/29 19:21:19 christos 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.17 2009/03/29 19:21:19 christos Exp $"); 31 32 #include <sys/param.h> 33 #include <sys/systm.h> 34 #include <sys/malloc.h> 35 #include <sys/mount.h> 36 #include <sys/time.h> 37 #include <sys/vnode.h> 38 #include <sys/file.h> 39 #include <sys/filedesc.h> 40 #include <sys/poll.h> 41 #include <sys/select.h> 42 #include <sys/dirent.h> 43 44 #include <sys/proc.h> 45 46 #include <net/if.h> 47 48 #include <compat/netbsd32/netbsd32.h> 49 #include <compat/netbsd32/netbsd32_syscall.h> 50 #include <compat/netbsd32/netbsd32_syscallargs.h> 51 #include <compat/netbsd32/netbsd32_conv.h> 52 53 int 54 netbsd32___select50(struct lwp *l, 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(l, 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, const struct netbsd32___pselect50_args *uap, register_t *retval) 82 { 83 /* { 84 syscallarg(int) nd; 85 syscallarg(netbsd32_fd_setp_t) in; 86 syscallarg(netbsd32_fd_setp_t) ou; 87 syscallarg(netbsd32_fd_setp_t) ex; 88 syscallarg(const netbsd32_timespecp_t) ts; 89 syscallarg(const netbsd32_sigsetp_t) mask; 90 } */ 91 int error; 92 struct netbsd32_timespec ts32; 93 struct timespec ats, *ts = NULL; 94 sigset_t amask, *mask = NULL; 95 96 if (SCARG_P32(uap, ts)) { 97 error = copyin(SCARG_P32(uap, ts), &ts32, sizeof(ts32)); 98 if (error != 0) 99 return error; 100 netbsd32_to_timespec(&ts32, &ats); 101 ts = &ats; 102 } 103 if (SCARG_P32(uap, mask)) { 104 error = copyin(SCARG_P32(uap, mask), &amask, sizeof(amask)); 105 if (error != 0) 106 return error; 107 mask = &amask; 108 } 109 110 return selcommon(l, retval, SCARG(uap, nd), SCARG_P32(uap, in), 111 SCARG_P32(uap, ou), SCARG_P32(uap, ex), ts, mask); 112 } 113 114 int 115 netbsd32___pollts50(struct lwp *l, const struct netbsd32___pollts50_args *uap, register_t *retval) 116 { 117 /* { 118 syscallarg(struct netbsd32_pollfdp_t) fds; 119 syscallarg(u_int) nfds; 120 syscallarg(const netbsd32_timespecp_t) ts; 121 syscallarg(const netbsd32_sigsetp_t) mask; 122 } */ 123 int error; 124 struct netbsd32_timespec ts32; 125 struct timespec ats, *ts = NULL; 126 sigset_t amask, *mask = NULL; 127 128 if (SCARG_P32(uap, ts)) { 129 error = copyin(SCARG_P32(uap, ts), &ts32, sizeof(ts32)); 130 if (error != 0) 131 return error; 132 netbsd32_to_timespec(&ts32, &ats); 133 ts = &ats; 134 } 135 if (NETBSD32PTR64( SCARG(uap, mask))) { 136 error = copyin(SCARG_P32(uap, mask), &amask, sizeof(amask)); 137 if (error != 0) 138 return error; 139 mask = &amask; 140 } 141 142 return pollcommon(l, retval, SCARG_P32(uap, fds), 143 SCARG(uap, nfds), ts, mask); 144 } 145