1 1.86 riastrad /* $NetBSD: sunos32_misc.c,v 1.86 2023/06/20 15:21:55 riastradh Exp $ */ 2 1.1 mrg /* from :NetBSD: sunos_misc.c,v 1.107 2000/12/01 19:25:10 jdolecek Exp */ 3 1.1 mrg 4 1.1 mrg /* 5 1.1 mrg * Copyright (c) 2001 Matthew R. Green 6 1.1 mrg * All rights reserved. 7 1.1 mrg * 8 1.1 mrg * Redistribution and use in source and binary forms, with or without 9 1.1 mrg * modification, are permitted provided that the following conditions 10 1.1 mrg * are met: 11 1.1 mrg * 1. Redistributions of source code must retain the above copyright 12 1.1 mrg * notice, this list of conditions and the following disclaimer. 13 1.1 mrg * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 mrg * notice, this list of conditions and the following disclaimer in the 15 1.1 mrg * documentation and/or other materials provided with the distribution. 16 1.1 mrg * 17 1.1 mrg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 1.1 mrg * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 1.1 mrg * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 1.1 mrg * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 1.1 mrg * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 22 1.1 mrg * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 1.1 mrg * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 24 1.1 mrg * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 25 1.1 mrg * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 1.1 mrg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 1.1 mrg * SUCH DAMAGE. 28 1.1 mrg */ 29 1.1 mrg 30 1.1 mrg /* 31 1.1 mrg * Copyright (c) 1992, 1993 32 1.1 mrg * The Regents of the University of California. All rights reserved. 33 1.1 mrg * 34 1.1 mrg * This software was developed by the Computer Systems Engineering group 35 1.1 mrg * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and 36 1.1 mrg * contributed to Berkeley. 37 1.1 mrg * 38 1.1 mrg * All advertising materials mentioning features or use of this software 39 1.1 mrg * must display the following acknowledgement: 40 1.1 mrg * This product includes software developed by the University of 41 1.1 mrg * California, Lawrence Berkeley Laboratory. 42 1.1 mrg * 43 1.1 mrg * Redistribution and use in source and binary forms, with or without 44 1.1 mrg * modification, are permitted provided that the following conditions 45 1.1 mrg * are met: 46 1.1 mrg * 1. Redistributions of source code must retain the above copyright 47 1.1 mrg * notice, this list of conditions and the following disclaimer. 48 1.1 mrg * 2. Redistributions in binary form must reproduce the above copyright 49 1.1 mrg * notice, this list of conditions and the following disclaimer in the 50 1.1 mrg * documentation and/or other materials provided with the distribution. 51 1.23 agc * 3. Neither the name of the University nor the names of its contributors 52 1.1 mrg * may be used to endorse or promote products derived from this software 53 1.1 mrg * without specific prior written permission. 54 1.1 mrg * 55 1.1 mrg * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 56 1.1 mrg * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 57 1.1 mrg * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 58 1.1 mrg * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 59 1.1 mrg * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 60 1.1 mrg * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 61 1.1 mrg * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 62 1.1 mrg * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 63 1.1 mrg * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 64 1.1 mrg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 65 1.1 mrg * SUCH DAMAGE. 66 1.1 mrg * 67 1.1 mrg * @(#)sunos_misc.c 8.1 (Berkeley) 6/18/93 68 1.1 mrg * 69 1.29 perry * Header: sunos_misc.c,v 1.16 93/04/07 02:46:27 torek Exp 70 1.1 mrg */ 71 1.1 mrg 72 1.1 mrg /* 73 1.1 mrg * SunOS compatibility module, 64-bit kernel version 74 1.1 mrg * 75 1.1 mrg * SunOS system calls that are implemented differently in BSD are 76 1.1 mrg * handled here. 77 1.1 mrg */ 78 1.10 lukem 79 1.10 lukem #include <sys/cdefs.h> 80 1.86 riastrad __KERNEL_RCSID(0, "$NetBSD: sunos32_misc.c,v 1.86 2023/06/20 15:21:55 riastradh Exp $"); 81 1.1 mrg 82 1.1 mrg #define COMPAT_SUNOS 1 83 1.1 mrg 84 1.8 mrg #if defined(_KERNEL_OPT) 85 1.1 mrg #include "opt_compat_43.h" 86 1.1 mrg #include "opt_compat_netbsd.h" 87 1.1 mrg #endif 88 1.1 mrg 89 1.1 mrg #include <sys/param.h> 90 1.1 mrg #include <sys/systm.h> 91 1.1 mrg #include <sys/namei.h> 92 1.1 mrg #include <sys/proc.h> 93 1.1 mrg #include <sys/dirent.h> 94 1.1 mrg #include <sys/file.h> 95 1.1 mrg #include <sys/stat.h> 96 1.1 mrg #include <sys/filedesc.h> 97 1.1 mrg #include <sys/ioctl.h> 98 1.1 mrg #include <sys/kernel.h> 99 1.1 mrg #include <sys/reboot.h> 100 1.1 mrg #include <sys/malloc.h> 101 1.1 mrg #include <sys/mbuf.h> 102 1.1 mrg #include <sys/mman.h> 103 1.1 mrg #include <sys/mount.h> 104 1.1 mrg #include <sys/ptrace.h> 105 1.1 mrg #include <sys/resource.h> 106 1.1 mrg #include <sys/resourcevar.h> 107 1.1 mrg #include <sys/signal.h> 108 1.1 mrg #include <sys/signalvar.h> 109 1.1 mrg #include <sys/socket.h> 110 1.1 mrg #include <sys/tty.h> 111 1.1 mrg #include <sys/vnode.h> 112 1.1 mrg #include <sys/uio.h> 113 1.1 mrg #include <sys/wait.h> 114 1.1 mrg #include <sys/utsname.h> 115 1.1 mrg #include <sys/unistd.h> 116 1.41 matt #include <sys/syscall.h> 117 1.1 mrg #include <sys/syscallargs.h> 118 1.1 mrg #include <sys/conf.h> 119 1.1 mrg #include <sys/socketvar.h> 120 1.1 mrg #include <sys/exec.h> 121 1.1 mrg #include <sys/swap.h> 122 1.37 elad #include <sys/kauth.h> 123 1.46 dsl #include <sys/vfs_syscalls.h> 124 1.1 mrg 125 1.1 mrg #include <compat/netbsd32/netbsd32.h> 126 1.1 mrg #include <compat/netbsd32/netbsd32_syscallargs.h> 127 1.1 mrg #include <compat/sunos32/sunos32.h> 128 1.6 mrg #include <compat/sunos32/sunos32_dirent.h> 129 1.1 mrg #include <compat/sunos32/sunos32_syscallargs.h> 130 1.1 mrg #include <compat/common/compat_util.h> 131 1.51 christos #include <compat/sys/mount.h> 132 1.1 mrg 133 1.1 mrg #include <netinet/in.h> 134 1.1 mrg 135 1.1 mrg #include <miscfs/specfs/specdev.h> 136 1.1 mrg 137 1.1 mrg #include <nfs/rpcv2.h> 138 1.1 mrg #include <nfs/nfsproto.h> 139 1.1 mrg #include <nfs/nfs.h> 140 1.1 mrg #include <nfs/nfsmount.h> 141 1.1 mrg 142 1.4 mrg static void sunos32_sigvec_to_sigaction(const struct netbsd32_sigvec *, struct sigaction *); 143 1.4 mrg static void sunos32_sigvec_from_sigaction(struct netbsd32_sigvec *, const struct sigaction *); 144 1.4 mrg 145 1.53 dsl static int sunstatfs(struct statvfs *, void *); 146 1.1 mrg 147 1.4 mrg static void 148 1.54 dsl sunos32_sigvec_to_sigaction(const struct netbsd32_sigvec *sv, struct sigaction *sa) 149 1.4 mrg { 150 1.53 dsl /*XXX*/ extern void compat_43_sigmask_to_sigset(const int *, sigset_t *); 151 1.29 perry 152 1.47 dsl sa->sa_handler = NETBSD32PTR64(sv->sv_handler); 153 1.4 mrg compat_43_sigmask_to_sigset(&sv->sv_mask, &sa->sa_mask); 154 1.4 mrg sa->sa_flags = sv->sv_flags ^ SA_RESTART; 155 1.4 mrg } 156 1.4 mrg 157 1.74 matt static void 158 1.74 matt sunos32_sigvec_from_sigaction( 159 1.74 matt struct netbsd32_sigvec *sv, 160 1.74 matt const struct sigaction *sa) 161 1.4 mrg { 162 1.53 dsl /*XXX*/ extern void compat_43_sigset_to_sigmask(const sigset_t *, int *); 163 1.4 mrg 164 1.85 riastrad memset(sv, 0, sizeof(*sv)); 165 1.47 dsl NETBSD32PTR32(sv->sv_handler, sa->sa_handler); 166 1.4 mrg compat_43_sigset_to_sigmask(&sa->sa_mask, &sv->sv_mask); 167 1.4 mrg sv->sv_flags = sa->sa_flags ^ SA_RESTART; 168 1.4 mrg } 169 1.4 mrg 170 1.1 mrg int 171 1.56 dsl sunos32_sys_stime(struct lwp *l, const struct sunos32_sys_stime_args *uap, register_t *retval) 172 1.1 mrg { 173 1.56 dsl /* { 174 1.4 mrg syscallarg(sunos32_time_tp) tp; 175 1.56 dsl } */ 176 1.4 mrg struct netbsd32_timeval ntv; 177 1.49 dsl struct timeval tv; 178 1.1 mrg int error; 179 1.1 mrg 180 1.49 dsl error = copyin(SCARG_P32(uap, tp), &ntv.tv_sec, sizeof(ntv.tv_sec)); 181 1.1 mrg if (error) 182 1.1 mrg return error; 183 1.4 mrg tv.tv_sec = ntv.tv_sec; 184 1.1 mrg tv.tv_usec = 0; 185 1.1 mrg 186 1.49 dsl return settimeofday1(&tv, false, NULL, l, true); 187 1.1 mrg } 188 1.1 mrg 189 1.1 mrg int 190 1.56 dsl sunos32_sys_wait4(struct lwp *l, const struct sunos32_sys_wait4_args *uap, register_t *retval) 191 1.1 mrg { 192 1.56 dsl /* { 193 1.4 mrg syscallarg(int) pid; 194 1.4 mrg syscallarg(netbsd32_intp) status; 195 1.4 mrg syscallarg(int) options; 196 1.4 mrg syscallarg(netbsd32_rusagep_t) rusage; 197 1.56 dsl } */ 198 1.1 mrg 199 1.65 nakayama struct compat_50_netbsd32_wait4_args bsd_ua; 200 1.56 dsl 201 1.56 dsl SCARG(&bsd_ua, pid) = SCARG(uap, pid) == 0 ? WAIT_ANY : SCARG(uap, pid); 202 1.56 dsl SCARG(&bsd_ua, status) = SCARG(uap, status); 203 1.56 dsl SCARG(&bsd_ua, options) = SCARG(uap, options); 204 1.56 dsl SCARG(&bsd_ua, rusage) = SCARG(uap, rusage); 205 1.56 dsl 206 1.65 nakayama return compat_50_netbsd32_wait4(l, &bsd_ua, retval); 207 1.1 mrg } 208 1.1 mrg 209 1.1 mrg int 210 1.56 dsl sunos32_sys_creat(struct lwp *l, const struct sunos32_sys_creat_args *uap, register_t *retval) 211 1.1 mrg { 212 1.56 dsl /* { 213 1.4 mrg syscallarg(const netbsd32_charp) path; 214 1.4 mrg syscallarg(int) mode; 215 1.56 dsl } */ 216 1.1 mrg struct sys_open_args ua; 217 1.1 mrg 218 1.1 mrg SUNOS32TOP_UAP(path, const char); 219 1.1 mrg SCARG(&ua, flags) = O_WRONLY | O_CREAT | O_TRUNC; 220 1.1 mrg SUNOS32TO64_UAP(mode); 221 1.7 mrg 222 1.15 thorpej return (sys_open(l, &ua, retval)); 223 1.1 mrg } 224 1.1 mrg 225 1.1 mrg int 226 1.56 dsl sunos32_sys_access(struct lwp *l, const struct sunos32_sys_access_args *uap, register_t *retval) 227 1.1 mrg { 228 1.56 dsl /* { 229 1.4 mrg syscallarg(const netbsd32_charp) path; 230 1.4 mrg syscallarg(int) flags; 231 1.56 dsl } */ 232 1.1 mrg struct sys_access_args ua; 233 1.1 mrg 234 1.1 mrg SUNOS32TOP_UAP(path, const char); 235 1.1 mrg SUNOS32TO64_UAP(flags); 236 1.1 mrg 237 1.15 thorpej return (sys_access(l, &ua, retval)); 238 1.1 mrg } 239 1.1 mrg 240 1.53 dsl static inline void sunos32_from___stat13(struct stat *, struct netbsd32_stat43 *); 241 1.2 mrg 242 1.34 perry static inline void 243 1.54 dsl sunos32_from___stat13(struct stat *sbp, struct netbsd32_stat43 *sb32p) 244 1.2 mrg { 245 1.86 riastrad memset(sb32p, 0, sizeof(*sb32p)); 246 1.2 mrg sb32p->st_dev = sbp->st_dev; 247 1.2 mrg sb32p->st_ino = sbp->st_ino; 248 1.2 mrg sb32p->st_mode = sbp->st_mode; 249 1.2 mrg sb32p->st_nlink = sbp->st_nlink; 250 1.2 mrg sb32p->st_uid = sbp->st_uid; 251 1.2 mrg sb32p->st_gid = sbp->st_gid; 252 1.2 mrg sb32p->st_rdev = sbp->st_rdev; 253 1.2 mrg if (sbp->st_size < (quad_t)1 << 32) 254 1.2 mrg sb32p->st_size = sbp->st_size; 255 1.2 mrg else 256 1.2 mrg sb32p->st_size = -2; 257 1.2 mrg sb32p->st_atimespec.tv_sec = (netbsd32_time_t)sbp->st_atimespec.tv_sec; 258 1.2 mrg sb32p->st_atimespec.tv_nsec = (netbsd32_long)sbp->st_atimespec.tv_nsec; 259 1.2 mrg sb32p->st_mtimespec.tv_sec = (netbsd32_time_t)sbp->st_mtimespec.tv_sec; 260 1.2 mrg sb32p->st_mtimespec.tv_nsec = (netbsd32_long)sbp->st_mtimespec.tv_nsec; 261 1.2 mrg sb32p->st_ctimespec.tv_sec = (netbsd32_time_t)sbp->st_ctimespec.tv_sec; 262 1.2 mrg sb32p->st_ctimespec.tv_nsec = (netbsd32_long)sbp->st_ctimespec.tv_nsec; 263 1.2 mrg sb32p->st_blksize = sbp->st_blksize; 264 1.2 mrg sb32p->st_blocks = sbp->st_blocks; 265 1.2 mrg sb32p->st_flags = sbp->st_flags; 266 1.2 mrg sb32p->st_gen = sbp->st_gen; 267 1.2 mrg } 268 1.2 mrg 269 1.2 mrg 270 1.1 mrg int 271 1.56 dsl sunos32_sys_stat(struct lwp *l, const struct sunos32_sys_stat_args *uap, register_t *retval) 272 1.1 mrg { 273 1.56 dsl /* { 274 1.4 mrg syscallarg(const netbsd32_charp) path; 275 1.4 mrg syscallarg(netbsd32_stat43p_t) ub; 276 1.56 dsl } */ 277 1.5 mrg struct netbsd32_stat43 sb32; 278 1.2 mrg struct stat sb; 279 1.2 mrg const char *path; 280 1.2 mrg int error; 281 1.1 mrg 282 1.47 dsl path = SCARG_P32(uap, path); 283 1.1 mrg 284 1.59 ad error = do_sys_stat(path, FOLLOW, &sb); 285 1.2 mrg if (error) 286 1.2 mrg return (error); 287 1.2 mrg sunos32_from___stat13(&sb, &sb32); 288 1.47 dsl error = copyout(&sb32, SCARG_P32(uap, ub), sizeof (sb32)); 289 1.2 mrg return (error); 290 1.1 mrg } 291 1.1 mrg 292 1.1 mrg int 293 1.56 dsl sunos32_sys_lstat(struct lwp *l, const struct sunos32_sys_lstat_args *uap, register_t *retval) 294 1.1 mrg { 295 1.56 dsl /* { 296 1.4 mrg syscallarg(const netbsd32_charp) path; 297 1.4 mrg syscallarg(netbsd32_stat43p_t) ub; 298 1.56 dsl } */ 299 1.84 jdolecek struct stat sb; 300 1.5 mrg struct netbsd32_stat43 sb32; 301 1.2 mrg int error; 302 1.1 mrg 303 1.84 jdolecek error = do_sys_stat(SCARG_P32(uap, path), NOFOLLOW, &sb); 304 1.84 jdolecek if (error) 305 1.73 dholland return error; 306 1.73 dholland 307 1.2 mrg /* 308 1.84 jdolecek * For symbolic links, SunOS returned the attributes of its 309 1.2 mrg * containing directory, except for mode, size, and links. 310 1.84 jdolecek * This is no longer emulated, the parent directory is not consulted. 311 1.2 mrg */ 312 1.2 mrg sunos32_from___stat13(&sb, &sb32); 313 1.47 dsl error = copyout((void *)&sb32, SCARG_P32(uap, ub), sizeof (sb32)); 314 1.2 mrg return (error); 315 1.1 mrg } 316 1.1 mrg 317 1.32 cube static int 318 1.32 cube sunos32_execve_fetch_element(char * const *array, size_t index, char **value) 319 1.32 cube { 320 1.32 cube int error; 321 1.32 cube netbsd32_charp const *a32 = (void const *)array; 322 1.32 cube netbsd32_charp e; 323 1.32 cube 324 1.32 cube error = copyin(a32 + index, &e, sizeof(e)); 325 1.32 cube if (error) 326 1.32 cube return error; 327 1.47 dsl *value = NETBSD32PTR64(e); 328 1.32 cube return 0; 329 1.32 cube } 330 1.32 cube 331 1.1 mrg int 332 1.56 dsl sunos32_sys_execv(struct lwp *l, const struct sunos32_sys_execv_args *uap, register_t *retval) 333 1.1 mrg { 334 1.56 dsl /* { 335 1.1 mrg syscallarg(const char *) path; 336 1.1 mrg syscallarg(char **) argv; 337 1.56 dsl } */ 338 1.47 dsl const char *path = SCARG_P32(uap, path); 339 1.1 mrg 340 1.81 christos return execve1(l, true, path, -1, SCARG_P32(uap, argp), NULL, 341 1.32 cube sunos32_execve_fetch_element); 342 1.1 mrg } 343 1.1 mrg 344 1.1 mrg int 345 1.56 dsl sunos32_sys_execve(struct lwp *l, const struct sunos32_sys_execve_args *uap, register_t *retval) 346 1.1 mrg { 347 1.56 dsl /* { 348 1.1 mrg syscallarg(const char *) path; 349 1.1 mrg syscallarg(char **) argv; 350 1.1 mrg syscallarg(char **) envp; 351 1.56 dsl } */ 352 1.47 dsl const char *path = SCARG_P32(uap, path); 353 1.1 mrg 354 1.81 christos return execve1(l, true, path, -1, SCARG_P32(uap, argp), 355 1.81 christos SCARG_P32(uap, envp), sunos32_execve_fetch_element); 356 1.1 mrg } 357 1.1 mrg 358 1.1 mrg int 359 1.56 dsl sunos32_sys_omsync(struct lwp *l, const struct sunos32_sys_omsync_args *uap, register_t *retval) 360 1.1 mrg { 361 1.56 dsl /* { 362 1.45 christos syscallarg(netbsd32_caddr_t) addr; 363 1.4 mrg syscallarg(netbsd32_size_t) len; 364 1.4 mrg syscallarg(int) flags; 365 1.56 dsl } */ 366 1.1 mrg struct netbsd32___msync13_args ouap; 367 1.1 mrg 368 1.1 mrg SCARG(&ouap, addr) = SCARG(uap, addr); 369 1.1 mrg SCARG(&ouap, len) = SCARG(uap, len); 370 1.1 mrg SCARG(&ouap, flags) = SCARG(uap, flags); 371 1.1 mrg 372 1.15 thorpej return (netbsd32___msync13(l, &ouap, retval)); 373 1.1 mrg } 374 1.1 mrg 375 1.1 mrg int 376 1.56 dsl sunos32_sys_unmount(struct lwp *l, const struct sunos32_sys_unmount_args *uap, register_t *retval) 377 1.1 mrg { 378 1.56 dsl /* { 379 1.4 mrg syscallarg(netbsd32_charp) path; 380 1.56 dsl } */ 381 1.1 mrg struct sys_unmount_args ua; 382 1.1 mrg 383 1.1 mrg SUNOS32TOP_UAP(path, const char); 384 1.1 mrg SCARG(&ua, flags) = 0; 385 1.1 mrg 386 1.15 thorpej return (sys_unmount(l, &ua, retval)); 387 1.1 mrg } 388 1.1 mrg 389 1.1 mrg /* 390 1.1 mrg * Conversion table for SunOS NFS mount flags. 391 1.1 mrg */ 392 1.1 mrg static struct { 393 1.1 mrg int sun_flg; 394 1.1 mrg int bsd_flg; 395 1.1 mrg } sunnfs_flgtab[] = { 396 1.1 mrg { SUNNFS_SOFT, NFSMNT_SOFT }, 397 1.1 mrg { SUNNFS_WSIZE, NFSMNT_WSIZE }, 398 1.1 mrg { SUNNFS_RSIZE, NFSMNT_RSIZE }, 399 1.1 mrg { SUNNFS_TIMEO, NFSMNT_TIMEO }, 400 1.1 mrg { SUNNFS_RETRANS, NFSMNT_RETRANS }, 401 1.1 mrg { SUNNFS_HOSTNAME, 0 }, /* Ignored */ 402 1.1 mrg { SUNNFS_INT, NFSMNT_INT }, 403 1.1 mrg { SUNNFS_NOAC, 0 }, /* Ignored */ 404 1.1 mrg { SUNNFS_ACREGMIN, 0 }, /* Ignored */ 405 1.1 mrg { SUNNFS_ACREGMAX, 0 }, /* Ignored */ 406 1.1 mrg { SUNNFS_ACDIRMIN, 0 }, /* Ignored */ 407 1.1 mrg { SUNNFS_ACDIRMAX, 0 }, /* Ignored */ 408 1.1 mrg { SUNNFS_SECURE, 0 }, /* Ignored */ 409 1.1 mrg { SUNNFS_NOCTO, 0 }, /* Ignored */ 410 1.1 mrg { SUNNFS_POSIX, 0 } /* Ignored */ 411 1.1 mrg }; 412 1.1 mrg 413 1.1 mrg int 414 1.56 dsl sunos32_sys_mount(struct lwp *l, const struct sunos32_sys_mount_args *uap, register_t *retval) 415 1.1 mrg { 416 1.56 dsl /* { 417 1.4 mrg syscallarg(netbsd32_charp) type; 418 1.4 mrg syscallarg(netbsd32_charp) path; 419 1.4 mrg syscallarg(int) flags; 420 1.45 christos syscallarg(netbsd32_caddr_t) data; 421 1.56 dsl } */ 422 1.1 mrg int oflags = SCARG(uap, flags), nflags, error; 423 1.1 mrg char fsname[MFSNAMELEN]; 424 1.50 dsl register_t dummy; 425 1.1 mrg 426 1.1 mrg if (oflags & (SUNM_NOSUB | SUNM_SYS5)) 427 1.1 mrg return (EINVAL); 428 1.1 mrg if ((oflags & SUNM_NEWTYPE) == 0) 429 1.1 mrg return (EINVAL); 430 1.1 mrg nflags = 0; 431 1.1 mrg if (oflags & SUNM_RDONLY) 432 1.1 mrg nflags |= MNT_RDONLY; 433 1.1 mrg if (oflags & SUNM_NOSUID) 434 1.1 mrg nflags |= MNT_NOSUID; 435 1.1 mrg if (oflags & SUNM_REMOUNT) 436 1.1 mrg nflags |= MNT_UPDATE; 437 1.1 mrg 438 1.50 dsl error = copyinstr(SCARG_P32(uap, type), fsname, sizeof fsname, NULL); 439 1.1 mrg if (error) 440 1.1 mrg return (error); 441 1.1 mrg 442 1.50 dsl if (strncmp(fsname, "nfs", sizeof fsname) == 0) { 443 1.1 mrg struct sunos_nfs_args sna; 444 1.1 mrg struct nfs_args na; /* XXX */ 445 1.1 mrg int n; 446 1.1 mrg 447 1.47 dsl error = copyin(SCARG_P32(uap, data), &sna, sizeof sna); 448 1.1 mrg if (error) 449 1.1 mrg return (error); 450 1.50 dsl /* sa.sa_len = sizeof(sain); */ 451 1.1 mrg na.version = NFS_ARGSVERSION; 452 1.50 dsl na.addr = (void *)sna.addr; 453 1.1 mrg na.addrlen = sizeof(struct sockaddr); 454 1.1 mrg na.sotype = SOCK_DGRAM; 455 1.1 mrg na.proto = IPPROTO_UDP; 456 1.50 dsl na.fh = sna.fh; 457 1.1 mrg na.fhsize = NFSX_V2FH; 458 1.1 mrg na.flags = 0; 459 1.1 mrg n = sizeof(sunnfs_flgtab) / sizeof(sunnfs_flgtab[0]); 460 1.1 mrg while (--n >= 0) 461 1.1 mrg if (sna.flags & sunnfs_flgtab[n].sun_flg) 462 1.1 mrg na.flags |= sunnfs_flgtab[n].bsd_flg; 463 1.1 mrg na.wsize = sna.wsize; 464 1.1 mrg na.rsize = sna.rsize; 465 1.1 mrg if (na.flags & NFSMNT_RSIZE) { 466 1.1 mrg na.flags |= NFSMNT_READDIRSIZE; 467 1.1 mrg na.readdirsize = na.rsize; 468 1.1 mrg } 469 1.1 mrg na.timeo = sna.timeo; 470 1.1 mrg na.retrans = sna.retrans; 471 1.1 mrg na.hostname = (char *)(u_long)sna.hostname; 472 1.1 mrg 473 1.76 maxv return do_sys_mount(l, "nfs", UIO_SYSSPACE, 474 1.50 dsl SCARG_P32(uap, path), nflags, &na, UIO_SYSSPACE, sizeof na, 475 1.50 dsl &dummy); 476 1.1 mrg } 477 1.50 dsl 478 1.50 dsl if (strcmp(fsname, "4.2") == 0) 479 1.50 dsl strcpy(fsname, "ffs"); 480 1.50 dsl 481 1.76 maxv return do_sys_mount(l, fsname, UIO_SYSSPACE, 482 1.50 dsl SCARG_P32(uap, path), nflags, SCARG_P32(uap, data), UIO_USERSPACE, 483 1.50 dsl 0, &dummy); 484 1.1 mrg } 485 1.1 mrg 486 1.53 dsl void native_to_sunos_sigset(const sigset_t *, int *); 487 1.53 dsl void sunos_to_native_sigset(const int, sigset_t *); 488 1.1 mrg 489 1.35 perry inline void 490 1.54 dsl native_to_sunos_sigset(const sigset_t *ss, int *mask) 491 1.1 mrg { 492 1.85 riastrad 493 1.1 mrg *mask = ss->__bits[0]; 494 1.1 mrg } 495 1.1 mrg 496 1.35 perry inline void 497 1.54 dsl sunos_to_native_sigset(const int mask, sigset_t *ss) 498 1.1 mrg { 499 1.1 mrg 500 1.85 riastrad memset(ss, 0, sizeof(*ss)); 501 1.1 mrg ss->__bits[0] = mask; 502 1.1 mrg ss->__bits[1] = 0; 503 1.1 mrg ss->__bits[2] = 0; 504 1.1 mrg ss->__bits[3] = 0; 505 1.1 mrg } 506 1.1 mrg 507 1.1 mrg int 508 1.56 dsl sunos32_sys_sigpending(struct lwp *l, const struct sunos32_sys_sigpending_args *uap, register_t *retval) 509 1.1 mrg { 510 1.56 dsl /* { 511 1.4 mrg syscallarg(netbsd32_intp) mask; 512 1.56 dsl } */ 513 1.1 mrg sigset_t ss; 514 1.1 mrg int mask; 515 1.1 mrg 516 1.43 ad sigpending1(l, &ss); 517 1.1 mrg native_to_sunos_sigset(&ss, &mask); 518 1.1 mrg 519 1.47 dsl return (copyout((void *)(u_long)&mask, SCARG_P32(uap, mask), sizeof(int))); 520 1.1 mrg } 521 1.1 mrg 522 1.29 perry int 523 1.56 dsl sunos32_sys_sigsuspend(struct lwp *l, const struct sunos32_sys_sigsuspend_args *uap, register_t *retval) 524 1.1 mrg { 525 1.56 dsl /* { 526 1.1 mrg syscallarg(int) mask; 527 1.56 dsl } */ 528 1.1 mrg int mask; 529 1.1 mrg sigset_t ss; 530 1.29 perry 531 1.1 mrg mask = SCARG(uap, mask); 532 1.1 mrg sunos_to_native_sigset(mask, &ss); 533 1.43 ad return (sigsuspend1(l, &ss)); 534 1.1 mrg } 535 1.1 mrg 536 1.1 mrg /* 537 1.1 mrg * Read Sun-style directory entries. We suck them into kernel space so 538 1.1 mrg * that they can be massaged before being copied out to user code. Like 539 1.1 mrg * SunOS, we squish out `empty' entries. 540 1.1 mrg * 541 1.1 mrg * This is quite ugly, but what do you expect from compatibility code? 542 1.1 mrg */ 543 1.1 mrg int 544 1.56 dsl sunos32_sys_getdents(struct lwp *l, const struct sunos32_sys_getdents_args *uap, register_t *retval) 545 1.1 mrg { 546 1.56 dsl /* { 547 1.4 mrg syscallarg(int) fd; 548 1.4 mrg syscallarg(netbsd32_charp) buf; 549 1.4 mrg syscallarg(int) nbytes; 550 1.56 dsl } */ 551 1.1 mrg struct dirent *bdp; 552 1.1 mrg struct vnode *vp; 553 1.45 christos char *inp, *sbuf; /* BSD-format */ 554 1.1 mrg int len, reclen; /* BSD-format */ 555 1.45 christos char *outp; /* Sun-format */ 556 1.1 mrg int resid, sunos_reclen;/* Sun-format */ 557 1.1 mrg struct file *fp; 558 1.1 mrg struct uio auio; 559 1.1 mrg struct iovec aiov; 560 1.6 mrg struct sunos32_dirent idb; 561 1.1 mrg off_t off; /* true file offset */ 562 1.1 mrg int buflen, error, eofflag; 563 1.1 mrg off_t *cookiebuf, *cookie; 564 1.1 mrg int ncookies; 565 1.1 mrg 566 1.61 ad /* fd_getvnode() will use the descriptor for us */ 567 1.59 ad if ((error = fd_getvnode(SCARG(uap, fd), &fp)) != 0) 568 1.1 mrg return (error); 569 1.1 mrg 570 1.1 mrg if ((fp->f_flag & FREAD) == 0) { 571 1.1 mrg error = EBADF; 572 1.1 mrg goto out1; 573 1.1 mrg } 574 1.1 mrg 575 1.75 matt vp = fp->f_vnode; 576 1.1 mrg if (vp->v_type != VDIR) { 577 1.1 mrg error = EINVAL; 578 1.1 mrg goto out1; 579 1.1 mrg } 580 1.1 mrg 581 1.79 riastrad buflen = uimin(MAXBSIZE, SCARG(uap, nbytes)); 582 1.31 christos sbuf = malloc(buflen, M_TEMP, M_WAITOK); 583 1.1 mrg vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); 584 1.1 mrg off = fp->f_offset; 585 1.1 mrg again: 586 1.31 christos aiov.iov_base = sbuf; 587 1.1 mrg aiov.iov_len = buflen; 588 1.1 mrg auio.uio_iov = &aiov; 589 1.1 mrg auio.uio_iovcnt = 1; 590 1.1 mrg auio.uio_rw = UIO_READ; 591 1.1 mrg auio.uio_resid = buflen; 592 1.1 mrg auio.uio_offset = off; 593 1.36 yamt UIO_SETUP_SYSSPACE(&auio); 594 1.1 mrg /* 595 1.1 mrg * First we read into the malloc'ed buffer, then 596 1.1 mrg * we massage it into user space, one record at a time. 597 1.1 mrg */ 598 1.1 mrg error = VOP_READDIR(vp, &auio, fp->f_cred, &eofflag, &cookiebuf, 599 1.1 mrg &ncookies); 600 1.1 mrg if (error) 601 1.1 mrg goto out; 602 1.1 mrg 603 1.31 christos inp = sbuf; 604 1.47 dsl outp = SCARG_P32(uap, buf); 605 1.1 mrg resid = SCARG(uap, nbytes); 606 1.1 mrg if ((len = buflen - auio.uio_resid) == 0) 607 1.1 mrg goto eof; 608 1.1 mrg 609 1.1 mrg for (cookie = cookiebuf; len > 0; len -= reclen) { 610 1.1 mrg bdp = (struct dirent *)inp; 611 1.1 mrg reclen = bdp->d_reclen; 612 1.78 riastrad if (reclen & 3) { 613 1.78 riastrad error = EIO; 614 1.78 riastrad goto out; 615 1.78 riastrad } 616 1.30 christos if (cookie && (*cookie >> 32) != 0) { 617 1.1 mrg compat_offseterr(vp, "sunos_getdents"); 618 1.1 mrg error = EINVAL; 619 1.1 mrg goto out; 620 1.1 mrg } 621 1.1 mrg if (bdp->d_fileno == 0) { 622 1.1 mrg inp += reclen; /* it is a hole; squish it out */ 623 1.30 christos if (cookie) 624 1.30 christos off = *cookie++; 625 1.30 christos else 626 1.30 christos off += reclen; 627 1.1 mrg continue; 628 1.1 mrg } 629 1.85 riastrad memset(&idb, 0, sizeof(idb)); 630 1.6 mrg sunos_reclen = SUNOS32_RECLEN(&idb, bdp->d_namlen); 631 1.1 mrg if (reclen > len || resid < sunos_reclen) { 632 1.1 mrg /* entry too big for buffer, so just stop */ 633 1.1 mrg outp++; 634 1.1 mrg break; 635 1.1 mrg } 636 1.30 christos if (cookie) 637 1.30 christos off = *cookie++; /* each entry points to next */ 638 1.30 christos else 639 1.30 christos off += reclen; 640 1.1 mrg /* 641 1.1 mrg * Massage in place to make a Sun-shaped dirent (otherwise 642 1.1 mrg * we have to worry about touching user memory outside of 643 1.1 mrg * the copyout() call). 644 1.1 mrg */ 645 1.1 mrg idb.d_fileno = bdp->d_fileno; 646 1.1 mrg idb.d_off = off; 647 1.1 mrg idb.d_reclen = sunos_reclen; 648 1.1 mrg idb.d_namlen = bdp->d_namlen; 649 1.18 itojun strlcpy(idb.d_name, bdp->d_name, sizeof(idb.d_name)); 650 1.44 christos if ((error = copyout((void *)&idb, outp, sunos_reclen)) != 0) 651 1.1 mrg goto out; 652 1.1 mrg /* advance past this real entry */ 653 1.1 mrg inp += reclen; 654 1.1 mrg /* advance output past Sun-shaped entry */ 655 1.1 mrg outp += sunos_reclen; 656 1.1 mrg resid -= sunos_reclen; 657 1.1 mrg } 658 1.1 mrg 659 1.1 mrg /* if we squished out the whole block, try again */ 660 1.69 he if (outp == SCARG_P32(uap, buf)) { 661 1.69 he if (cookiebuf) 662 1.69 he free(cookiebuf, M_TEMP); 663 1.69 he cookiebuf = NULL; 664 1.1 mrg goto again; 665 1.69 he } 666 1.1 mrg fp->f_offset = off; /* update the vnode offset */ 667 1.1 mrg 668 1.1 mrg eof: 669 1.1 mrg *retval = SCARG(uap, nbytes) - resid; 670 1.1 mrg out: 671 1.72 hannken VOP_UNLOCK(vp); 672 1.1 mrg free(cookiebuf, M_TEMP); 673 1.31 christos free(sbuf, M_TEMP); 674 1.1 mrg out1: 675 1.59 ad fd_putfile(SCARG(uap, fd)); 676 1.1 mrg return (error); 677 1.1 mrg } 678 1.1 mrg 679 1.6 mrg #define SUNOS32__MAP_NEW 0x80000000 /* if not, old mmap & cannot handle */ 680 1.1 mrg 681 1.1 mrg int 682 1.56 dsl sunos32_sys_mmap(struct lwp *l, const struct sunos32_sys_mmap_args *uap, register_t *retval) 683 1.1 mrg { 684 1.56 dsl /* { 685 1.4 mrg syscallarg(netbsd32_voidp) addr; 686 1.4 mrg syscallarg(netbsd32_size_t) len; 687 1.4 mrg syscallarg(int) prot; 688 1.4 mrg syscallarg(int) flags; 689 1.4 mrg syscallarg(int) fd; 690 1.4 mrg syscallarg(netbsd32_long) pos; 691 1.56 dsl } */ 692 1.1 mrg struct sys_mmap_args ua; 693 1.3 mrg int error; 694 1.1 mrg 695 1.1 mrg /* 696 1.1 mrg * Verify the arguments. 697 1.1 mrg */ 698 1.1 mrg if (SCARG(uap, prot) & ~(PROT_READ|PROT_WRITE|PROT_EXEC)) 699 1.1 mrg return (EINVAL); /* XXX still needed? */ 700 1.1 mrg 701 1.6 mrg if ((SCARG(uap, flags) & SUNOS32__MAP_NEW) == 0) 702 1.1 mrg return (EINVAL); 703 1.1 mrg 704 1.3 mrg SUNOS32TOP_UAP(addr, void); 705 1.3 mrg SUNOS32TOX_UAP(len, size_t); 706 1.3 mrg SUNOS32TO64_UAP(prot); 707 1.6 mrg SCARG(&ua, flags) = SCARG(uap, flags) & ~SUNOS32__MAP_NEW; 708 1.3 mrg SUNOS32TO64_UAP(fd); 709 1.66 nakayama SCARG(&ua, PAD) = 0; 710 1.3 mrg SUNOS32TOX_UAP(pos, off_t); 711 1.1 mrg 712 1.19 nakayama error = sys_mmap(l, &ua, retval); 713 1.19 nakayama if ((u_long)*retval > (u_long)UINT_MAX) { 714 1.77 khorben printf("sunos32_mmap: retval out of range: 0x%lx\n", 715 1.19 nakayama (u_long)*retval); 716 1.19 nakayama /* Should try to recover and return an error here. */ 717 1.19 nakayama } 718 1.3 mrg return (error); 719 1.1 mrg } 720 1.1 mrg 721 1.1 mrg #define MC_SYNC 1 722 1.1 mrg #define MC_LOCK 2 723 1.1 mrg #define MC_UNLOCK 3 724 1.1 mrg #define MC_ADVISE 4 725 1.1 mrg #define MC_LOCKAS 5 726 1.1 mrg #define MC_UNLOCKAS 6 727 1.1 mrg 728 1.1 mrg int 729 1.56 dsl sunos32_sys_mctl(struct lwp *l, const struct sunos32_sys_mctl_args *uap, register_t *retval) 730 1.1 mrg { 731 1.56 dsl /* { 732 1.4 mrg syscallarg(netbsd32_voidp) addr; 733 1.4 mrg syscallarg(int) len; 734 1.4 mrg syscallarg(int) func; 735 1.4 mrg syscallarg(netbsd32_voidp) arg; 736 1.56 dsl } */ 737 1.1 mrg 738 1.1 mrg switch (SCARG(uap, func)) { 739 1.1 mrg case MC_ADVISE: /* ignore for now */ 740 1.1 mrg return (0); 741 1.1 mrg case MC_SYNC: /* translate to msync */ 742 1.56 dsl return (netbsd32___msync13(l, (const void *)uap, retval)); 743 1.1 mrg default: 744 1.1 mrg return (EINVAL); 745 1.1 mrg } 746 1.1 mrg } 747 1.1 mrg 748 1.1 mrg int 749 1.56 dsl sunos32_sys_setsockopt(struct lwp *l, const struct sunos32_sys_setsockopt_args *uap, register_t *retval) 750 1.1 mrg { 751 1.56 dsl /* { 752 1.4 mrg syscallarg(int) s; 753 1.4 mrg syscallarg(int) level; 754 1.4 mrg syscallarg(int) name; 755 1.45 christos syscallarg(netbsd32_caddr_t) val; 756 1.4 mrg syscallarg(int) valsize; 757 1.56 dsl } */ 758 1.62 plunky struct sockopt sopt; 759 1.59 ad struct socket *so; 760 1.56 dsl int name = SCARG(uap, name); 761 1.1 mrg int error; 762 1.1 mrg 763 1.61 ad /* fd_getsock() will use the descriptor for us */ 764 1.59 ad if ((error = fd_getsock(SCARG(uap, s), &so)) != 0) 765 1.1 mrg return (error); 766 1.1 mrg #define SO_DONTLINGER (~SO_LINGER) 767 1.56 dsl if (name == SO_DONTLINGER) { 768 1.62 plunky struct linger lg; 769 1.62 plunky 770 1.62 plunky lg.l_onoff = 0; 771 1.62 plunky error = so_setsockopt(l, so, SCARG(uap, level), SO_LINGER, 772 1.62 plunky &lg, sizeof(lg)); 773 1.1 mrg goto out; 774 1.1 mrg } 775 1.1 mrg if (SCARG(uap, level) == IPPROTO_IP) { 776 1.1 mrg #define SUNOS_IP_MULTICAST_IF 2 777 1.1 mrg #define SUNOS_IP_MULTICAST_TTL 3 778 1.1 mrg #define SUNOS_IP_MULTICAST_LOOP 4 779 1.1 mrg #define SUNOS_IP_ADD_MEMBERSHIP 5 780 1.1 mrg #define SUNOS_IP_DROP_MEMBERSHIP 6 781 1.27 matt static const int ipoptxlat[] = { 782 1.1 mrg IP_MULTICAST_IF, 783 1.1 mrg IP_MULTICAST_TTL, 784 1.1 mrg IP_MULTICAST_LOOP, 785 1.1 mrg IP_ADD_MEMBERSHIP, 786 1.1 mrg IP_DROP_MEMBERSHIP 787 1.1 mrg }; 788 1.56 dsl if (name >= SUNOS_IP_MULTICAST_IF && 789 1.56 dsl name <= SUNOS_IP_DROP_MEMBERSHIP) { 790 1.56 dsl name = ipoptxlat[name - SUNOS_IP_MULTICAST_IF]; 791 1.1 mrg } 792 1.1 mrg } 793 1.82 christos if ((unsigned)SCARG(uap, valsize) > MLEN) { 794 1.1 mrg error = EINVAL; 795 1.1 mrg goto out; 796 1.1 mrg } 797 1.62 plunky sockopt_init(&sopt, SCARG(uap, level), name, SCARG(uap, valsize)); 798 1.47 dsl if (SCARG_P32(uap, val)) { 799 1.62 plunky error = copyin(SCARG_P32(uap, val), sopt.sopt_data, 800 1.1 mrg (u_int)SCARG(uap, valsize)); 801 1.1 mrg } 802 1.62 plunky if (error == 0) 803 1.62 plunky error = sosetopt(so, &sopt); 804 1.62 plunky sockopt_destroy(&sopt); 805 1.1 mrg out: 806 1.59 ad fd_putfile(SCARG(uap, s)); 807 1.1 mrg return (error); 808 1.1 mrg } 809 1.11 mrg 810 1.35 perry static inline int sunos32_sys_socket_common(struct lwp *, register_t *, 811 1.11 mrg int type); 812 1.35 perry static inline int 813 1.54 dsl sunos32_sys_socket_common(struct lwp *l, register_t *retval, int type) 814 1.11 mrg { 815 1.11 mrg struct socket *so; 816 1.11 mrg int error, fd; 817 1.11 mrg 818 1.61 ad /* fd_getsock() will use the descriptor for us */ 819 1.11 mrg fd = (int)*retval; 820 1.59 ad if ((error = fd_getsock(fd, &so)) == 0) { 821 1.11 mrg if (type == SOCK_DGRAM) 822 1.11 mrg so->so_options |= SO_BROADCAST; 823 1.59 ad fd_putfile(fd); 824 1.11 mrg } 825 1.11 mrg return (error); 826 1.11 mrg } 827 1.11 mrg 828 1.11 mrg int 829 1.56 dsl sunos32_sys_socket(struct lwp *l, const struct sunos32_sys_socket_args *uap, register_t *retval) 830 1.11 mrg { 831 1.56 dsl /* { 832 1.11 mrg syscallarg(int) domain; 833 1.11 mrg syscallarg(int) type; 834 1.11 mrg syscallarg(int) protocol; 835 1.56 dsl } */ 836 1.11 mrg int error; 837 1.11 mrg 838 1.65 nakayama error = netbsd32___socket30(l, (const void *)uap, retval); 839 1.11 mrg if (error) 840 1.11 mrg return (error); 841 1.15 thorpej return sunos32_sys_socket_common(l, retval, SCARG(uap, type)); 842 1.11 mrg } 843 1.11 mrg 844 1.11 mrg int 845 1.56 dsl sunos32_sys_socketpair(struct lwp *l, const struct sunos32_sys_socketpair_args *uap, register_t *retval) 846 1.11 mrg { 847 1.56 dsl /* { 848 1.11 mrg syscallarg(int) domain; 849 1.11 mrg syscallarg(int) type; 850 1.11 mrg syscallarg(int) protocol; 851 1.11 mrg syscallarg(int *) rsv; 852 1.56 dsl } */ 853 1.11 mrg int error; 854 1.11 mrg 855 1.56 dsl error = netbsd32_socketpair(l, (const void *)uap, retval); 856 1.11 mrg if (error) 857 1.11 mrg return (error); 858 1.15 thorpej return sunos32_sys_socket_common(l, retval, SCARG(uap, type)); 859 1.11 mrg } 860 1.11 mrg 861 1.1 mrg 862 1.1 mrg /* 863 1.1 mrg * XXX: This needs cleaning up. 864 1.1 mrg */ 865 1.1 mrg int 866 1.56 dsl sunos32_sys_auditsys(struct lwp *l, const struct sunos32_sys_auditsys_args *uap, register_t *retval) 867 1.1 mrg { 868 1.1 mrg return 0; 869 1.1 mrg } 870 1.1 mrg 871 1.1 mrg int 872 1.56 dsl sunos32_sys_uname(struct lwp *l, const struct sunos32_sys_uname_args *uap, register_t *retval) 873 1.1 mrg { 874 1.56 dsl /* { 875 1.4 mrg syscallarg(sunos32_utsnamep_t) name; 876 1.56 dsl } */ 877 1.1 mrg struct sunos_utsname sut; 878 1.1 mrg 879 1.1 mrg memset(&sut, 0, sizeof(sut)); 880 1.1 mrg 881 1.83 christos strlcpy(sut.sysname, ostype, sizeof(sut.sysname)); 882 1.83 christos strlcpy(sut.nodename, hostname, sizeof(sut.nodename)); 883 1.83 christos strlcpy(sut.release, osrelease, sizeof(sut.release)); 884 1.83 christos strlcpy(sut.version, "1", sizeof(sut.version)); 885 1.83 christos strlcpy(sut.machine, machine, sizeof(sut.machine)); 886 1.1 mrg 887 1.83 christos return copyout(&sut, SCARG_P32(uap, name), sizeof(sut)); 888 1.1 mrg } 889 1.1 mrg 890 1.1 mrg int 891 1.56 dsl sunos32_sys_setpgrp(struct lwp *l, const struct sunos32_sys_setpgrp_args *uap, register_t *retval) 892 1.1 mrg { 893 1.56 dsl /* { 894 1.4 mrg syscallarg(int) pid; 895 1.4 mrg syscallarg(int) pgid; 896 1.56 dsl } */ 897 1.15 thorpej struct proc *p = l->l_proc; 898 1.1 mrg 899 1.1 mrg /* 900 1.1 mrg * difference to our setpgid call is to include backwards 901 1.1 mrg * compatibility to pre-setsid() binaries. Do setsid() 902 1.1 mrg * instead of setpgid() in those cases where the process 903 1.1 mrg * tries to create a new session the old way. 904 1.1 mrg */ 905 1.1 mrg if (!SCARG(uap, pgid) && 906 1.1 mrg (!SCARG(uap, pid) || SCARG(uap, pid) == p->p_pid)) 907 1.56 dsl return sys_setsid(l, NULL, retval); 908 1.1 mrg else 909 1.56 dsl return netbsd32_setpgid(l, (const void *)uap, retval); 910 1.1 mrg } 911 1.1 mrg 912 1.1 mrg int 913 1.56 dsl sunos32_sys_open(struct lwp *l, const struct sunos32_sys_open_args *uap, register_t *retval) 914 1.1 mrg { 915 1.56 dsl /* { 916 1.4 mrg syscallarg(const netbsd32_charp) path; 917 1.4 mrg syscallarg(int) flags; 918 1.4 mrg syscallarg(int) mode; 919 1.56 dsl } */ 920 1.15 thorpej struct proc *p = l->l_proc; 921 1.1 mrg struct sys_open_args ua; 922 1.15 thorpej int lf, r; 923 1.1 mrg int noctty; 924 1.1 mrg int ret; 925 1.1 mrg 926 1.1 mrg /* convert mode into NetBSD mode */ 927 1.15 thorpej lf = SCARG(uap, flags); 928 1.15 thorpej noctty = lf & 0x8000; 929 1.15 thorpej r = (lf & (0x0001 | 0x0002 | 0x0008 | 0x0040 | 0x0200 | 0x0400 | 0x0800)); 930 1.15 thorpej r |= ((lf & (0x0004 | 0x1000 | 0x4000)) ? O_NONBLOCK : 0); 931 1.15 thorpej r |= ((lf & 0x0080) ? O_SHLOCK : 0); 932 1.15 thorpej r |= ((lf & 0x0100) ? O_EXLOCK : 0); 933 1.15 thorpej r |= ((lf & 0x2000) ? O_FSYNC : 0); 934 1.1 mrg 935 1.1 mrg SUNOS32TOP_UAP(path, const char); 936 1.1 mrg SCARG(&ua, flags) = r; 937 1.1 mrg SUNOS32TO64_UAP(mode); 938 1.1 mrg 939 1.15 thorpej ret = sys_open(l, &ua, retval); 940 1.1 mrg 941 1.43 ad /* XXXSMP unlocked */ 942 1.43 ad if (!ret && !noctty && SESS_LEADER(p) && !(p->p_lflag & PL_CONTROLT)) { 943 1.59 ad file_t *fp; 944 1.59 ad int fd; 945 1.9 thorpej 946 1.59 ad fd = (int)*retval; 947 1.59 ad fp = fd_getfile(fd); 948 1.1 mrg 949 1.1 mrg /* ignore any error, just give it a try */ 950 1.58 dsl if (fp != NULL) { 951 1.58 dsl if (fp->f_type == DTYPE_VNODE) 952 1.59 ad (fp->f_ops->fo_ioctl)(fp, TIOCSCTTY, NULL); 953 1.59 ad fd_putfile(fd); 954 1.58 dsl } 955 1.1 mrg } 956 1.1 mrg return ret; 957 1.1 mrg } 958 1.1 mrg 959 1.1 mrg int 960 1.56 dsl sunos32_sys_ustat(struct lwp *l, const struct sunos32_sys_ustat_args *uap, register_t *retval) 961 1.1 mrg { 962 1.56 dsl /* { 963 1.4 mrg syscallarg(int) dev; 964 1.4 mrg syscallarg(sunos32_ustatp_t) buf; 965 1.56 dsl } */ 966 1.1 mrg struct sunos_ustat us; 967 1.1 mrg int error; 968 1.1 mrg 969 1.1 mrg memset(&us, 0, sizeof us); 970 1.1 mrg 971 1.1 mrg /* 972 1.1 mrg * XXX: should set f_tfree and f_tinode at least 973 1.1 mrg * How do we translate dev -> fstat? (and then to sunos_ustat) 974 1.1 mrg */ 975 1.1 mrg 976 1.47 dsl if ((error = copyout(&us, SCARG_P32(uap, buf), sizeof us)) != 0) 977 1.1 mrg return (error); 978 1.1 mrg return 0; 979 1.1 mrg } 980 1.1 mrg 981 1.1 mrg int 982 1.56 dsl sunos32_sys_quotactl(struct lwp *l, const struct sunos32_sys_quotactl_args *uap, register_t *retval) 983 1.1 mrg { 984 1.1 mrg 985 1.1 mrg return EINVAL; 986 1.1 mrg } 987 1.1 mrg 988 1.1 mrg int 989 1.56 dsl sunos32_sys_vhangup(struct lwp *l, const void *v, register_t *retval) 990 1.1 mrg { 991 1.15 thorpej struct proc *p = l->l_proc; 992 1.1 mrg struct session *sp = p->p_session; 993 1.1 mrg 994 1.1 mrg if (sp->s_ttyvp == 0) 995 1.1 mrg return 0; 996 1.1 mrg 997 1.1 mrg if (sp->s_ttyp && sp->s_ttyp->t_session == sp && sp->s_ttyp->t_pgrp) 998 1.1 mrg pgsignal(sp->s_ttyp->t_pgrp, SIGHUP, 1); 999 1.1 mrg 1000 1.1 mrg (void) ttywait(sp->s_ttyp); 1001 1.1 mrg if (sp->s_ttyvp) 1002 1.1 mrg VOP_REVOKE(sp->s_ttyvp, REVOKEALL); 1003 1.1 mrg if (sp->s_ttyvp) 1004 1.1 mrg vrele(sp->s_ttyvp); 1005 1.1 mrg sp->s_ttyvp = NULL; 1006 1.1 mrg 1007 1.1 mrg return 0; 1008 1.1 mrg } 1009 1.1 mrg 1010 1.1 mrg static int 1011 1.54 dsl sunstatfs(struct statvfs *sp, void *sbuf) 1012 1.1 mrg { 1013 1.1 mrg struct sunos_statfs ssfs; 1014 1.1 mrg 1015 1.1 mrg memset(&ssfs, 0, sizeof ssfs); 1016 1.1 mrg ssfs.f_type = 0; 1017 1.1 mrg ssfs.f_bsize = sp->f_bsize; 1018 1.1 mrg ssfs.f_blocks = sp->f_blocks; 1019 1.1 mrg ssfs.f_bfree = sp->f_bfree; 1020 1.1 mrg ssfs.f_bavail = sp->f_bavail; 1021 1.1 mrg ssfs.f_files = sp->f_files; 1022 1.1 mrg ssfs.f_ffree = sp->f_ffree; 1023 1.25 christos ssfs.f_fsid = sp->f_fsidx; 1024 1.44 christos return copyout((void *)&ssfs, sbuf, sizeof ssfs); 1025 1.29 perry } 1026 1.1 mrg 1027 1.1 mrg int 1028 1.56 dsl sunos32_sys_statfs(struct lwp *l, const struct sunos32_sys_statfs_args *uap, register_t *retval) 1029 1.1 mrg { 1030 1.56 dsl /* { 1031 1.4 mrg syscallarg(const netbsd32_charp) path; 1032 1.4 mrg syscallarg(sunos32_statfsp_t) buf; 1033 1.56 dsl } */ 1034 1.26 hannken struct statvfs *sp; 1035 1.1 mrg int error; 1036 1.1 mrg 1037 1.82 christos sp = STATVFSBUF_GET(); 1038 1.82 christos error = do_sys_pstatvfs(l, SCARG_P32(uap, path), 0, sp); 1039 1.82 christos if (error == 0) 1040 1.82 christos error = sunstatfs(sp, SCARG_P32(uap, buf)); 1041 1.82 christos STATVFSBUF_PUT(sp); 1042 1.82 christos return error; 1043 1.1 mrg } 1044 1.1 mrg 1045 1.1 mrg int 1046 1.56 dsl sunos32_sys_fstatfs(struct lwp *l, const struct sunos32_sys_fstatfs_args *uap, register_t *retval) 1047 1.1 mrg { 1048 1.56 dsl /* { 1049 1.4 mrg syscallarg(int) fd; 1050 1.4 mrg syscallarg(sunos32_statfsp_t) buf; 1051 1.56 dsl } */ 1052 1.26 hannken struct statvfs *sp; 1053 1.1 mrg int error; 1054 1.1 mrg 1055 1.82 christos sp = STATVFSBUF_GET(); 1056 1.82 christos error = do_sys_fstatvfs(l, SCARG(uap, fd), 0, sp); 1057 1.82 christos if (error == 0) 1058 1.82 christos error = sunstatfs(sp, SCARG_P32(uap, buf)); 1059 1.82 christos STATVFSBUF_PUT(sp); 1060 1.82 christos return error; 1061 1.1 mrg } 1062 1.1 mrg 1063 1.1 mrg int 1064 1.56 dsl sunos32_sys_exportfs(struct lwp *l, const struct sunos32_sys_exportfs_args *uap, register_t *retval) 1065 1.1 mrg { 1066 1.1 mrg /* 1067 1.1 mrg * XXX: should perhaps translate into a mount(2) 1068 1.1 mrg * with MOUNT_EXPORT? 1069 1.1 mrg */ 1070 1.1 mrg return 0; 1071 1.1 mrg } 1072 1.1 mrg 1073 1.1 mrg int 1074 1.56 dsl sunos32_sys_mknod(struct lwp *l, const struct sunos32_sys_mknod_args *uap, register_t *retval) 1075 1.1 mrg { 1076 1.56 dsl /* { 1077 1.4 mrg syscallarg(const netbsd32_charp) path; 1078 1.4 mrg syscallarg(int) mode; 1079 1.4 mrg syscallarg(int) dev; 1080 1.56 dsl } */ 1081 1.1 mrg 1082 1.1 mrg if (S_ISFIFO(SCARG(uap, mode))) 1083 1.56 dsl return netbsd32_mkfifo(l, (const struct netbsd32_mkfifo_args *)uap, retval); 1084 1.1 mrg 1085 1.65 nakayama return compat_50_netbsd32_mknod(l, (const struct compat_50_netbsd32_mknod_args *)uap, retval); 1086 1.1 mrg } 1087 1.1 mrg 1088 1.1 mrg #define SUNOS_SC_ARG_MAX 1 1089 1.1 mrg #define SUNOS_SC_CHILD_MAX 2 1090 1.1 mrg #define SUNOS_SC_CLK_TCK 3 1091 1.1 mrg #define SUNOS_SC_NGROUPS_MAX 4 1092 1.1 mrg #define SUNOS_SC_OPEN_MAX 5 1093 1.1 mrg #define SUNOS_SC_JOB_CONTROL 6 1094 1.1 mrg #define SUNOS_SC_SAVED_IDS 7 1095 1.1 mrg #define SUNOS_SC_VERSION 8 1096 1.1 mrg 1097 1.1 mrg int 1098 1.56 dsl sunos32_sys_sysconf(struct lwp *l, const struct sunos32_sys_sysconf_args *uap, register_t *retval) 1099 1.1 mrg { 1100 1.56 dsl /* { 1101 1.4 mrg syscallarg(int) name; 1102 1.56 dsl } */ 1103 1.57 hannken extern u_int maxfiles; 1104 1.1 mrg 1105 1.1 mrg switch(SCARG(uap, name)) { 1106 1.1 mrg case SUNOS_SC_ARG_MAX: 1107 1.1 mrg *retval = ARG_MAX; 1108 1.1 mrg break; 1109 1.1 mrg case SUNOS_SC_CHILD_MAX: 1110 1.1 mrg *retval = maxproc; 1111 1.1 mrg break; 1112 1.1 mrg case SUNOS_SC_CLK_TCK: 1113 1.1 mrg *retval = 60; /* should this be `hz', ie. 100? */ 1114 1.1 mrg break; 1115 1.1 mrg case SUNOS_SC_NGROUPS_MAX: 1116 1.1 mrg *retval = NGROUPS_MAX; 1117 1.1 mrg break; 1118 1.1 mrg case SUNOS_SC_OPEN_MAX: 1119 1.1 mrg *retval = maxfiles; 1120 1.1 mrg break; 1121 1.1 mrg case SUNOS_SC_JOB_CONTROL: 1122 1.1 mrg *retval = 1; 1123 1.1 mrg break; 1124 1.1 mrg case SUNOS_SC_SAVED_IDS: 1125 1.1 mrg #ifdef _POSIX_SAVED_IDS 1126 1.1 mrg *retval = 1; 1127 1.1 mrg #else 1128 1.1 mrg *retval = 0; 1129 1.1 mrg #endif 1130 1.1 mrg break; 1131 1.1 mrg case SUNOS_SC_VERSION: 1132 1.1 mrg *retval = 198808; 1133 1.1 mrg break; 1134 1.1 mrg default: 1135 1.1 mrg return EINVAL; 1136 1.1 mrg } 1137 1.1 mrg return 0; 1138 1.1 mrg } 1139 1.1 mrg 1140 1.1 mrg #define SUNOS_RLIMIT_NOFILE 6 /* Other RLIMIT_* are the same */ 1141 1.1 mrg #define SUNOS_RLIM_NLIMITS 7 1142 1.1 mrg 1143 1.1 mrg int 1144 1.56 dsl sunos32_sys_getrlimit(struct lwp *l, const struct sunos32_sys_getrlimit_args *uap, register_t *retval) 1145 1.1 mrg { 1146 1.56 dsl /* { 1147 1.4 mrg syscallarg(u_int) which; 1148 1.4 mrg syscallarg(netbsd32_orlimitp_t) rlp; 1149 1.56 dsl } */ 1150 1.56 dsl struct compat_43_netbsd32_ogetrlimit_args ua_43; 1151 1.1 mrg 1152 1.1 mrg if (SCARG(uap, which) >= SUNOS_RLIM_NLIMITS) 1153 1.1 mrg return EINVAL; 1154 1.1 mrg 1155 1.56 dsl SCARG(&ua_43, which) = SCARG(uap, which) == SUNOS_RLIMIT_NOFILE ? RLIMIT_NOFILE : SCARG(uap, which); 1156 1.56 dsl SCARG(&ua_43, rlp) = SCARG(uap, rlp); 1157 1.1 mrg 1158 1.56 dsl return compat_43_netbsd32_ogetrlimit(l, &ua_43, retval); 1159 1.1 mrg } 1160 1.1 mrg 1161 1.1 mrg int 1162 1.56 dsl sunos32_sys_setrlimit(struct lwp *l, const struct sunos32_sys_setrlimit_args *uap, register_t *retval) 1163 1.1 mrg { 1164 1.56 dsl /* { 1165 1.4 mrg syscallarg(u_int) which; 1166 1.4 mrg syscallarg(netbsd32_orlimitp_t) rlp; 1167 1.56 dsl } */ 1168 1.56 dsl struct compat_43_netbsd32_osetrlimit_args ua_43; 1169 1.1 mrg 1170 1.1 mrg if (SCARG(uap, which) >= SUNOS_RLIM_NLIMITS) 1171 1.1 mrg return EINVAL; 1172 1.1 mrg 1173 1.56 dsl SCARG(&ua_43, which) = SCARG(uap, which) == SUNOS_RLIMIT_NOFILE ? RLIMIT_NOFILE : SCARG(uap, which); 1174 1.56 dsl SCARG(&ua_43, rlp) = SCARG(uap, rlp); 1175 1.1 mrg 1176 1.56 dsl return compat_43_netbsd32_osetrlimit(l, &ua_43, retval); 1177 1.1 mrg } 1178 1.1 mrg 1179 1.1 mrg /* for the m68k machines */ 1180 1.1 mrg #ifndef PT_GETFPREGS 1181 1.1 mrg #define PT_GETFPREGS -1 1182 1.1 mrg #endif 1183 1.1 mrg #ifndef PT_SETFPREGS 1184 1.1 mrg #define PT_SETFPREGS -1 1185 1.1 mrg #endif 1186 1.1 mrg 1187 1.27 matt static const int sreq2breq[] = { 1188 1.1 mrg PT_TRACE_ME, PT_READ_I, PT_READ_D, -1, 1189 1.1 mrg PT_WRITE_I, PT_WRITE_D, -1, PT_CONTINUE, 1190 1.1 mrg PT_KILL, -1, PT_ATTACH, PT_DETACH, 1191 1.1 mrg PT_GETREGS, PT_SETREGS, PT_GETFPREGS, PT_SETFPREGS 1192 1.1 mrg }; 1193 1.82 christos static const size_t nreqs = __arraycount(sreq2breq); 1194 1.1 mrg 1195 1.1 mrg int 1196 1.56 dsl sunos32_sys_ptrace(struct lwp *l, const struct sunos32_sys_ptrace_args *uap, register_t *retval) 1197 1.1 mrg { 1198 1.56 dsl /* { 1199 1.4 mrg syscallarg(int) req; 1200 1.4 mrg syscallarg(pid_t) pid; 1201 1.45 christos syscallarg(netbsd32_caddr_t) addr; 1202 1.4 mrg syscallarg(int) data; 1203 1.4 mrg syscallarg(netbsd32_charp) addr2; 1204 1.56 dsl } */ 1205 1.1 mrg struct netbsd32_ptrace_args pa; 1206 1.1 mrg int req; 1207 1.1 mrg 1208 1.41 matt #define sys_ptrace sysent[SYS_ptrace].sy_call 1209 1.41 matt if (sys_ptrace == sys_nosys) 1210 1.41 matt return ENOSYS; 1211 1.41 matt 1212 1.1 mrg req = SCARG(uap, req); 1213 1.41 matt if ((unsigned int)req >= nreqs) 1214 1.1 mrg return (EINVAL); 1215 1.1 mrg 1216 1.1 mrg req = sreq2breq[req]; 1217 1.1 mrg if (req == -1) 1218 1.1 mrg return (EINVAL); 1219 1.1 mrg 1220 1.1 mrg SCARG(&pa, req) = req; 1221 1.1 mrg SCARG(&pa, pid) = (pid_t)SCARG(uap, pid); 1222 1.1 mrg SCARG(&pa, addr) = SCARG(uap, addr); 1223 1.1 mrg SCARG(&pa, data) = SCARG(uap, data); 1224 1.1 mrg 1225 1.15 thorpej return netbsd32_ptrace(l, &pa, retval); 1226 1.1 mrg } 1227 1.1 mrg 1228 1.1 mrg /* 1229 1.1 mrg * SunOS reboot system call (for compatibility). 1230 1.1 mrg * Sun lets you pass in a boot string which the PROM 1231 1.1 mrg * saves and provides to the next boot program. 1232 1.1 mrg */ 1233 1.1 mrg 1234 1.1 mrg #define SUNOS_RB_ASKNAME 0x001 1235 1.1 mrg #define SUNOS_RB_SINGLE 0x002 1236 1.1 mrg #define SUNOS_RB_NOSYNC 0x004 1237 1.1 mrg #define SUNOS_RB_HALT 0x008 1238 1.1 mrg #define SUNOS_RB_DUMP 0x080 1239 1.1 mrg #define SUNOS_RB_STRING 0x200 1240 1.1 mrg 1241 1.1 mrg static struct sunos_howto_conv { 1242 1.1 mrg int sun_howto; 1243 1.1 mrg int bsd_howto; 1244 1.1 mrg } sunos_howto_conv[] = { 1245 1.1 mrg { SUNOS_RB_ASKNAME, RB_ASKNAME }, 1246 1.1 mrg { SUNOS_RB_SINGLE, RB_SINGLE }, 1247 1.1 mrg { SUNOS_RB_NOSYNC, RB_NOSYNC }, 1248 1.1 mrg { SUNOS_RB_HALT, RB_HALT }, 1249 1.1 mrg { SUNOS_RB_DUMP, RB_DUMP }, 1250 1.1 mrg { SUNOS_RB_STRING, RB_STRING }, 1251 1.1 mrg { 0x000, 0 }, 1252 1.1 mrg }; 1253 1.1 mrg 1254 1.1 mrg int 1255 1.56 dsl sunos32_sys_reboot(struct lwp *l, const struct sunos32_sys_reboot_args *uap, register_t *retval) 1256 1.1 mrg { 1257 1.56 dsl /* { 1258 1.4 mrg syscallarg(int) howto; 1259 1.4 mrg syscallarg(netbsd32_charp) bootstr; 1260 1.56 dsl } */ 1261 1.1 mrg struct sys_reboot_args ua; 1262 1.1 mrg struct sunos_howto_conv *convp; 1263 1.1 mrg int error, bsd_howto, sun_howto; 1264 1.1 mrg char *bootstr; 1265 1.1 mrg 1266 1.42 elad if ((error = kauth_authorize_system(l->l_cred, 1267 1.42 elad KAUTH_SYSTEM_REBOOT, 0, NULL, NULL, NULL)) != 0) 1268 1.1 mrg return (error); 1269 1.1 mrg 1270 1.1 mrg /* 1271 1.1 mrg * Convert howto bits to BSD format. 1272 1.1 mrg */ 1273 1.1 mrg sun_howto = SCARG(uap, howto); 1274 1.1 mrg bsd_howto = 0; 1275 1.1 mrg convp = sunos_howto_conv; 1276 1.1 mrg while (convp->sun_howto) { 1277 1.1 mrg if (sun_howto & convp->sun_howto) 1278 1.1 mrg bsd_howto |= convp->bsd_howto; 1279 1.1 mrg convp++; 1280 1.1 mrg } 1281 1.1 mrg 1282 1.1 mrg /* 1283 1.1 mrg * Sun RB_STRING (Get user supplied bootstring.) 1284 1.1 mrg * If the machine supports passing a string to the 1285 1.1 mrg * next booted kernel. 1286 1.1 mrg */ 1287 1.1 mrg if (sun_howto & SUNOS_RB_STRING) 1288 1.47 dsl bootstr = SCARG_P32(uap, bootstr); 1289 1.1 mrg else 1290 1.1 mrg bootstr = NULL; 1291 1.1 mrg 1292 1.1 mrg SCARG(&ua, opt) = bsd_howto; 1293 1.1 mrg SCARG(&ua, bootstr) = bootstr; 1294 1.15 thorpej return (sys_reboot(l, &ua, retval)); 1295 1.1 mrg } 1296 1.1 mrg 1297 1.1 mrg /* 1298 1.1 mrg * Generalized interface signal handler, 4.3-compatible. 1299 1.1 mrg */ 1300 1.1 mrg /* ARGSUSED */ 1301 1.1 mrg int 1302 1.56 dsl sunos32_sys_sigvec(struct lwp *l, const struct sunos32_sys_sigvec_args *uap, register_t *retval) 1303 1.1 mrg { 1304 1.56 dsl /* { 1305 1.1 mrg syscallarg(int) signum; 1306 1.1 mrg syscallarg(struct sigvec *) nsv; 1307 1.1 mrg syscallarg(struct sigvec *) osv; 1308 1.56 dsl } */ 1309 1.4 mrg struct netbsd32_sigvec sv; 1310 1.1 mrg struct sigaction nsa, osa; 1311 1.1 mrg int error; 1312 1.1 mrg 1313 1.47 dsl if (SCARG_P32(uap, nsv)) { 1314 1.47 dsl error = copyin(SCARG_P32(uap, nsv), &sv, sizeof(sv)); 1315 1.1 mrg if (error != 0) 1316 1.1 mrg return (error); 1317 1.1 mrg 1318 1.1 mrg /* 1319 1.1 mrg * SunOS uses the mask 0x0004 as SV_RESETHAND 1320 1.1 mrg * meaning: `reset to SIG_DFL on delivery'. 1321 1.1 mrg * We support only the bits in: 0xF 1322 1.1 mrg * (those bits are the same as ours) 1323 1.1 mrg */ 1324 1.4 mrg if (sv.sv_flags & ~0xF) 1325 1.1 mrg return (EINVAL); 1326 1.1 mrg 1327 1.4 mrg sunos32_sigvec_to_sigaction(&sv, &nsa); 1328 1.1 mrg } 1329 1.43 ad error = sigaction1(l, SCARG(uap, signum), 1330 1.47 dsl SCARG_P32(uap, nsv) ? &nsa : 0, 1331 1.47 dsl SCARG_P32(uap, osv) ? &osa : 0, 1332 1.13 thorpej NULL, 0); 1333 1.1 mrg if (error != 0) 1334 1.1 mrg return (error); 1335 1.1 mrg 1336 1.47 dsl if (SCARG_P32(uap, osv)) { 1337 1.4 mrg sunos32_sigvec_from_sigaction(&sv, &osa); 1338 1.47 dsl error = copyout(&sv, SCARG_P32(uap, osv), sizeof(sv)); 1339 1.1 mrg if (error != 0) 1340 1.1 mrg return (error); 1341 1.1 mrg } 1342 1.1 mrg 1343 1.1 mrg return (0); 1344 1.1 mrg } 1345