Annotation of sys/compat/osf1/osf1_cvt.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: osf1_cvt.c,v 1.3 2006/02/16 20:32:33 miod Exp $ */
! 2: /* $NetBSD: osf1_cvt.c,v 1.7 1999/06/26 01:23:23 cgd Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1999 Christopher G. Demetriou. 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: * 3. All advertising materials mentioning features or use of this software
! 16: * must display the following acknowledgement:
! 17: * This product includes software developed by Christopher G. Demetriou
! 18: * for the NetBSD Project.
! 19: * 4. The name of the author may not be used to endorse or promote products
! 20: * derived from this software without specific prior written permission
! 21: *
! 22: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 23: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 24: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 25: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 26: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 27: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 28: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 29: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 30: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 31: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 32: */
! 33:
! 34: /*
! 35: * Copyright (c) 1994, 1995 Carnegie-Mellon University.
! 36: * All rights reserved.
! 37: *
! 38: * Author: Chris G. Demetriou
! 39: *
! 40: * Permission to use, copy, modify and distribute this software and
! 41: * its documentation is hereby granted, provided that both the copyright
! 42: * notice and this permission notice appear in all copies of the
! 43: * software, derivative works or modified versions, and any portions
! 44: * thereof, and that both notices appear in supporting documentation.
! 45: *
! 46: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
! 47: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
! 48: * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
! 49: *
! 50: * Carnegie Mellon requests users of this software to return to
! 51: *
! 52: * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
! 53: * School of Computer Science
! 54: * Carnegie Mellon University
! 55: * Pittsburgh PA 15213-3890
! 56: *
! 57: * any improvements or extensions that they make and grant Carnegie the
! 58: * rights to redistribute these changes.
! 59: */
! 60:
! 61: #include <sys/param.h>
! 62: #include <sys/systm.h>
! 63: #include <sys/namei.h>
! 64: #include <sys/proc.h>
! 65: #include <sys/file.h>
! 66: #include <sys/stat.h>
! 67: #include <sys/filedesc.h>
! 68: #include <sys/kernel.h>
! 69: #include <sys/malloc.h>
! 70: #include <sys/mman.h>
! 71: #include <sys/mount.h>
! 72: #include <sys/signal.h>
! 73: #include <sys/signalvar.h>
! 74: #include <sys/reboot.h>
! 75: #include <sys/syscallargs.h>
! 76: #include <sys/exec.h>
! 77: #include <sys/vnode.h>
! 78: #include <sys/socketvar.h>
! 79: #include <sys/resource.h>
! 80: #include <sys/resourcevar.h>
! 81: #include <sys/wait.h>
! 82: #include <uvm/uvm_extern.h> /* XXX see mmap emulation */
! 83:
! 84: #include <nfs/rpcv2.h>
! 85: #include <nfs/nfsproto.h>
! 86: #include <nfs/nfs.h>
! 87: #include <nfs/nfsmount.h>
! 88:
! 89: #include <compat/osf1/osf1.h>
! 90: #include <compat/osf1/osf1_util.h>
! 91: #include <compat/osf1/osf1_cvt.h>
! 92:
! 93: const struct emul_flags_xtab osf1_access_flags_xtab[] = {
! 94: #if 0 /* pseudo-flag */
! 95: { OSF1_F_OK, OSF1_F_OK, F_OK },
! 96: #endif
! 97: { OSF1_X_OK, OSF1_X_OK, X_OK },
! 98: { OSF1_W_OK, OSF1_W_OK, W_OK },
! 99: { OSF1_R_OK, OSF1_R_OK, R_OK },
! 100: { 0 }
! 101: };
! 102:
! 103: const struct emul_flags_xtab osf1_fcntl_getsetfd_flags_rxtab[] = {
! 104: { FD_CLOEXEC, FD_CLOEXEC, OSF1_FD_CLOEXEC },
! 105: { 0 }
! 106: };
! 107:
! 108: const struct emul_flags_xtab osf1_fcntl_getsetfd_flags_xtab[] = {
! 109: { OSF1_FD_CLOEXEC, OSF1_FD_CLOEXEC, FD_CLOEXEC },
! 110: { 0 }
! 111: };
! 112:
! 113: /* flags specific to GETFL/SETFL; also uses open rxtab */
! 114: const struct emul_flags_xtab osf1_fcntl_getsetfl_flags_rxtab[] = {
! 115: { FASYNC, FASYNC, OSF1_FASYNC },
! 116: { 0 }
! 117: };
! 118:
! 119: /* flags specific to GETFL/SETFL; also uses open xtab */
! 120: const struct emul_flags_xtab osf1_fcntl_getsetfl_flags_xtab[] = {
! 121: { OSF1_FASYNC, OSF1_FASYNC, FASYNC },
! 122: { 0 }
! 123: };
! 124:
! 125: const struct emul_flags_xtab osf1_mmap_flags_xtab[] = {
! 126: { OSF1_MAP_SHARED, OSF1_MAP_SHARED, MAP_SHARED },
! 127: { OSF1_MAP_PRIVATE, OSF1_MAP_PRIVATE, MAP_PRIVATE },
! 128: { OSF1_MAP_TYPE, OSF1_MAP_FILE, MAP_FILE },
! 129: { OSF1_MAP_TYPE, OSF1_MAP_ANON, MAP_ANON },
! 130: { OSF1_MAP_FIXED, OSF1_MAP_FIXED, MAP_FIXED },
! 131: #if 0 /* pseudo-flag, and the default */
! 132: { OSF1_MAP_VARIABLE, OSF1_MAP_VARIABLE, 0 },
! 133: #endif
! 134: { OSF1_MAP_HASSEMAPHORE, OSF1_MAP_HASSEMAPHORE, MAP_HASSEMAPHORE },
! 135: { OSF1_MAP_INHERIT, OSF1_MAP_INHERIT, MAP_INHERIT },
! 136: #if 0 /* no equivalent +++ */
! 137: { OSF1_MAP_UNALIGNED, OSF1_MAP_UNALIGNED, ??? },
! 138: #endif
! 139: { 0 }
! 140: };
! 141:
! 142: const struct emul_flags_xtab osf1_mmap_prot_xtab[] = {
! 143: #if 0 /* pseudo-flag */
! 144: { OSF1_PROT_NONE, OSF1_PROT_NONE, PROT_NONE },
! 145: #endif
! 146: { OSF1_PROT_READ, OSF1_PROT_READ, PROT_READ },
! 147: { OSF1_PROT_WRITE, OSF1_PROT_WRITE, PROT_READ|PROT_WRITE },
! 148: { OSF1_PROT_EXEC, OSF1_PROT_EXEC, PROT_READ|PROT_EXEC },
! 149: { 0 }
! 150: };
! 151:
! 152: const struct emul_flags_xtab osf1_nfs_mount_flags_xtab[] = {
! 153: { OSF1_NFSMNT_SOFT, OSF1_NFSMNT_SOFT, NFSMNT_SOFT, },
! 154: { OSF1_NFSMNT_WSIZE, OSF1_NFSMNT_WSIZE, NFSMNT_WSIZE, },
! 155: { OSF1_NFSMNT_RSIZE, OSF1_NFSMNT_RSIZE, NFSMNT_RSIZE, },
! 156: { OSF1_NFSMNT_TIMEO, OSF1_NFSMNT_TIMEO, NFSMNT_TIMEO, },
! 157: { OSF1_NFSMNT_RETRANS, OSF1_NFSMNT_RETRANS, NFSMNT_RETRANS, },
! 158: #if 0 /* no equivalent; needs special handling, see below */
! 159: { OSF1_NFSMNT_HOSTNAME, OSF1_NFSMNT_HOSTNAME, ???, },
! 160: #endif
! 161: { OSF1_NFSMNT_INT, OSF1_NFSMNT_INT, NFSMNT_INT, },
! 162: { OSF1_NFSMNT_NOCONN, OSF1_NFSMNT_NOCONN, NFSMNT_NOCONN, },
! 163: #if 0 /* no equivalents */
! 164: { OSF1_NFSMNT_NOAC, OSF1_NFSMNT_NOAC, ???, },
! 165: { OSF1_NFSMNT_ACREGMIN, OSF1_NFSMNT_ACREGMIN, ???, },
! 166: { OSF1_NFSMNT_ACREGMAX, OSF1_NFSMNT_ACREGMAX, ???, },
! 167: { OSF1_NFSMNT_ACDIRMIN, OSF1_NFSMNT_ACDIRMIN, ???, },
! 168: { OSF1_NFSMNT_ACDIRMAX, OSF1_NFSMNT_ACDIRMAX, ???, },
! 169: { OSF1_NFSMNT_NOCTO, OSF1_NFSMNT_NOCTO, ???, },
! 170: { OSF1_NFSMNT_POSIX, OSF1_NFSMNT_POSIX, ???, },
! 171: { OSF1_NFSMNT_AUTO, OSF1_NFSMNT_AUTO, ???, },
! 172: { OSF1_NFSMNT_SEC, OSF1_NFSMNT_SEC, ???, },
! 173: { OSF1_NFSMNT_TCP, OSF1_NFSMNT_TCP, ???, },
! 174: { OSF1_NFSMNT_PROPLIST, OSF1_NFSMNT_PROPLIST, ???, },
! 175: #endif
! 176: { 0 }
! 177: };
! 178:
! 179: const struct emul_flags_xtab osf1_open_flags_rxtab[] = {
! 180: { O_ACCMODE, O_RDONLY, OSF1_O_RDONLY },
! 181: { O_ACCMODE, O_WRONLY, OSF1_O_WRONLY },
! 182: { O_ACCMODE, O_RDWR, OSF1_O_RDWR },
! 183: { O_NONBLOCK, O_NONBLOCK, OSF1_O_NONBLOCK },
! 184: { O_APPEND, O_APPEND, OSF1_O_APPEND },
! 185: #if 0 /* no equivalent +++ */
! 186: { ???, ???, O_DEFER },
! 187: #endif
! 188: { O_CREAT, O_CREAT, OSF1_O_CREAT },
! 189: { O_TRUNC, O_TRUNC, OSF1_O_TRUNC },
! 190: { O_EXCL, O_EXCL, OSF1_O_EXCL },
! 191: { O_NOCTTY, O_NOCTTY, OSF1_O_NOCTTY },
! 192: { O_SYNC, O_SYNC, OSF1_O_SYNC },
! 193: { O_NDELAY, O_NDELAY, OSF1_O_NDELAY },
! 194: #if 0 /* no equivalent, also same value as O_NDELAY! */
! 195: { ???, ???, O_DRD },
! 196: #endif
! 197: { O_DSYNC, O_DSYNC, OSF1_O_DSYNC },
! 198: { O_RSYNC, O_RSYNC, OSF1_O_RSYNC },
! 199: { 0 }
! 200: };
! 201:
! 202: const struct emul_flags_xtab osf1_open_flags_xtab[] = {
! 203: { OSF1_O_ACCMODE, OSF1_O_RDONLY, O_RDONLY },
! 204: { OSF1_O_ACCMODE, OSF1_O_WRONLY, O_WRONLY },
! 205: { OSF1_O_ACCMODE, OSF1_O_RDWR, O_RDWR },
! 206: { OSF1_O_NONBLOCK, OSF1_O_NONBLOCK, O_NONBLOCK },
! 207: { OSF1_O_APPEND, OSF1_O_APPEND, O_APPEND },
! 208: #if 0 /* no equivalent +++ */
! 209: { OSF1_O_DEFER, OSF1_O_DEFER, ??? },
! 210: #endif
! 211: { OSF1_O_CREAT, OSF1_O_CREAT, O_CREAT },
! 212: { OSF1_O_TRUNC, OSF1_O_TRUNC, O_TRUNC },
! 213: { OSF1_O_EXCL, OSF1_O_EXCL, O_EXCL },
! 214: { OSF1_O_NOCTTY, OSF1_O_NOCTTY, O_NOCTTY },
! 215: { OSF1_O_SYNC, OSF1_O_SYNC, O_SYNC },
! 216: { OSF1_O_NDELAY, OSF1_O_NDELAY, O_NDELAY },
! 217: #if 0 /* no equivalent, also same value as O_NDELAY! */
! 218: { OSF1_O_DRD, OSF1_O_DRD, ??? },
! 219: #endif
! 220: { OSF1_O_DSYNC, OSF1_O_DSYNC, O_DSYNC },
! 221: { OSF1_O_RSYNC, OSF1_O_RSYNC, O_RSYNC },
! 222: { 0 }
! 223: };
! 224:
! 225: const struct emul_flags_xtab osf1_reboot_opt_xtab[] = {
! 226: #if 0 /* pseudo-flag */
! 227: { OSF1_RB_AUTOBOOT, OSF1_RB_AUTOBOOT, RB_AUTOBOOT },
! 228: #endif
! 229: { OSF1_RB_ASKNAME, OSF1_RB_ASKNAME, RB_ASKNAME },
! 230: { OSF1_RB_SINGLE, OSF1_RB_SINGLE, RB_SINGLE },
! 231: { OSF1_RB_NOSYNC, OSF1_RB_NOSYNC, RB_NOSYNC },
! 232: #if 0 /* same value as O_NDELAY, only used at boot time? */
! 233: { OSF1_RB_KDB, OSF1_RB_KDB, RB_KDB },
! 234: #endif
! 235: { OSF1_RB_HALT, OSF1_RB_HALT, RB_HALT },
! 236: { OSF1_RB_INITNAME, OSF1_RB_INITNAME, RB_INITNAME },
! 237: { OSF1_RB_DFLTROOT, OSF1_RB_DFLTROOT, RB_DFLTROOT },
! 238: #if 0 /* no equivalents +++ */
! 239: { OSF1_RB_ALTBOOT, OSF1_RB_ALTBOOT, ??? },
! 240: { OSF1_RB_UNIPROC, OSF1_RB_UNIPROC, ??? },
! 241: { OSF1_RB_PARAM, OSF1_RB_PARAM, ??? },
! 242: #endif
! 243: { OSF1_RB_DUMP, OSF1_RB_DUMP, RB_DUMP },
! 244: { 0 }
! 245: };
! 246:
! 247: const struct emul_flags_xtab osf1_sendrecv_msg_flags_xtab[] = {
! 248: { OSF1_MSG_OOB, OSF1_MSG_OOB, MSG_OOB },
! 249: { OSF1_MSG_PEEK, OSF1_MSG_PEEK, MSG_PEEK },
! 250: { OSF1_MSG_DONTROUTE, OSF1_MSG_DONTROUTE, MSG_DONTROUTE },
! 251: { OSF1_MSG_EOR, OSF1_MSG_EOR, MSG_EOR },
! 252: { OSF1_MSG_TRUNC, OSF1_MSG_TRUNC, MSG_TRUNC },
! 253: { OSF1_MSG_CTRUNC, OSF1_MSG_CTRUNC, MSG_CTRUNC },
! 254: { OSF1_MSG_WAITALL, OSF1_MSG_WAITALL, MSG_WAITALL },
! 255: { 0 }
! 256: };
! 257:
! 258: const struct emul_flags_xtab osf1_sigaction_flags_rxtab[] = {
! 259: { SA_ONSTACK, SA_ONSTACK, OSF1_SA_ONSTACK },
! 260: { SA_RESTART, SA_RESTART, OSF1_SA_RESTART },
! 261: { SA_NOCLDSTOP, SA_NOCLDSTOP, OSF1_SA_NOCLDSTOP },
! 262: { SA_NODEFER, SA_NODEFER, OSF1_SA_NODEFER },
! 263: { SA_RESETHAND, SA_RESETHAND, OSF1_SA_RESETHAND },
! 264: { SA_NOCLDWAIT, SA_NOCLDWAIT, OSF1_SA_NOCLDWAIT },
! 265: #if 0 /* XXX not yet */
! 266: { SA_SIGINFO, SA_SIGINFO, OSF1_SA_SIGINFO },
! 267: #endif
! 268: { 0 },
! 269: };
! 270:
! 271: const struct emul_flags_xtab osf1_sigaction_flags_xtab[] = {
! 272: { OSF1_SA_ONSTACK, OSF1_SA_ONSTACK, SA_ONSTACK },
! 273: { OSF1_SA_RESTART, OSF1_SA_RESTART, SA_RESTART },
! 274: { OSF1_SA_NOCLDSTOP, OSF1_SA_NOCLDSTOP, SA_NOCLDSTOP },
! 275: { OSF1_SA_NODEFER, OSF1_SA_NODEFER, SA_NODEFER },
! 276: { OSF1_SA_RESETHAND, OSF1_SA_RESETHAND, SA_RESETHAND },
! 277: { OSF1_SA_NOCLDWAIT, OSF1_SA_NOCLDWAIT, SA_NOCLDWAIT },
! 278: #if 0 /* XXX not yet */
! 279: { OSF1_SA_SIGINFO, OSF1_SA_SIGINFO, SA_SIGINFO },
! 280: #endif
! 281: { 0 },
! 282: };
! 283:
! 284: const struct emul_flags_xtab osf1_sigaltstack_flags_rxtab[] = {
! 285: { SS_ONSTACK, SS_ONSTACK, OSF1_SS_ONSTACK },
! 286: { SS_DISABLE, SS_DISABLE, OSF1_SS_DISABLE },
! 287: #if 0 /* XXX no equivalents */
! 288: { ???, ???, OSF1_SS_NOMASK },
! 289: { ???, ???, OSF1_SS_UCONTEXT },
! 290: #endif
! 291: { 0 },
! 292: };
! 293:
! 294: const struct emul_flags_xtab osf1_sigaltstack_flags_xtab[] = {
! 295: { OSF1_SS_ONSTACK, OSF1_SS_ONSTACK, SS_ONSTACK },
! 296: { OSF1_SS_DISABLE, OSF1_SS_DISABLE, SS_DISABLE },
! 297: #if 0 /* XXX no equivalents */
! 298: { OSF1_SS_NOMASK, OSF1_SS_NOMASK, ??? },
! 299: { OSF1_SS_UCONTEXT, OSF1_SS_UCONTEXT, ??? },
! 300: #endif
! 301: { 0 },
! 302: };
! 303:
! 304: const struct emul_flags_xtab osf1_wait_options_xtab[] = {
! 305: { OSF1_WNOHANG, OSF1_WNOHANG, WNOHANG },
! 306: { OSF1_WUNTRACED, OSF1_WUNTRACED, WUNTRACED },
! 307: { 0 }
! 308: };
! 309:
! 310: void
! 311: osf1_cvt_flock_from_native(nf, of)
! 312: const struct flock *nf;
! 313: struct osf1_flock *of;
! 314: {
! 315:
! 316: memset(of, 0, sizeof *of);
! 317:
! 318: of->l_start = nf->l_start;
! 319: of->l_len = nf->l_len;
! 320: of->l_pid = nf->l_pid;
! 321:
! 322: switch (nf->l_type) {
! 323: case F_RDLCK:
! 324: of->l_type = OSF1_F_RDLCK;
! 325: break;
! 326:
! 327: case F_WRLCK:
! 328: of->l_type = OSF1_F_WRLCK;
! 329: break;
! 330:
! 331: case F_UNLCK:
! 332: of->l_type = OSF1_F_UNLCK;
! 333: break;
! 334: }
! 335:
! 336: switch (nf->l_whence) {
! 337: case SEEK_SET:
! 338: of->l_whence = OSF1_SEEK_SET;
! 339: break;
! 340:
! 341: case SEEK_CUR:
! 342: of->l_whence = OSF1_SEEK_CUR;
! 343: break;
! 344:
! 345: case SEEK_END:
! 346: of->l_whence = OSF1_SEEK_END;
! 347: break;
! 348: }
! 349: }
! 350:
! 351: int
! 352: osf1_cvt_flock_to_native(of, nf)
! 353: const struct osf1_flock *of;
! 354: struct flock *nf;
! 355: {
! 356:
! 357: memset(nf, 0, sizeof *nf);
! 358:
! 359: nf->l_start = of->l_start;
! 360: nf->l_len = of->l_len;
! 361: nf->l_pid = of->l_pid;
! 362:
! 363: switch (of->l_type) {
! 364: case OSF1_F_RDLCK:
! 365: nf->l_type = F_RDLCK;
! 366: break;
! 367:
! 368: case OSF1_F_WRLCK:
! 369: nf->l_type = F_WRLCK;
! 370: break;
! 371:
! 372: case OSF1_F_UNLCK:
! 373: nf->l_type = F_UNLCK;
! 374: break;
! 375:
! 376: default:
! 377: return (EINVAL);
! 378: }
! 379:
! 380: switch (of->l_whence) {
! 381: case OSF1_SEEK_SET:
! 382: nf->l_whence = SEEK_SET;
! 383: break;
! 384:
! 385: case OSF1_SEEK_CUR:
! 386: nf->l_whence = SEEK_CUR;
! 387: break;
! 388:
! 389: case OSF1_SEEK_END:
! 390: nf->l_whence = SEEK_END;
! 391: break;
! 392:
! 393: default:
! 394: return (EINVAL);
! 395: }
! 396:
! 397: return (0);
! 398: }
! 399:
! 400: int
! 401: osf1_cvt_msghdr_xopen_to_native(omh, bmh)
! 402: const struct osf1_msghdr_xopen *omh;
! 403: struct msghdr *bmh;
! 404: {
! 405: unsigned long leftovers;
! 406:
! 407: memset(bmh, 0, sizeof *bmh);
! 408: bmh->msg_name = omh->msg_name; /* XXX sockaddr translation */
! 409: bmh->msg_namelen = omh->msg_namelen;
! 410: bmh->msg_iov = NULL; /* iovec xlation separate */
! 411: bmh->msg_iovlen = omh->msg_iovlen;
! 412:
! 413: /* XXX we don't translate control messages (yet) */
! 414: if (bmh->msg_control != NULL || bmh->msg_controllen != 0)
! 415: {
! 416: printf("osf1_cvt_msghdr_xopen_to_native: control\n");
! 417: return (EINVAL);
! 418: }
! 419:
! 420: /* translate flags */
! 421: bmh->msg_flags = emul_flags_translate(osf1_sendrecv_msg_flags_xtab,
! 422: omh->msg_flags, &leftovers);
! 423: if (leftovers != 0)
! 424: {
! 425: printf("osf1_cvt_msghdr_xopen_to_native: leftovers 0x%lx\n", leftovers);
! 426: return (EINVAL);
! 427: }
! 428:
! 429: return (0);
! 430: }
! 431:
! 432: int
! 433: osf1_cvt_pathconf_name_to_native(oname, bnamep)
! 434: int oname, *bnamep;
! 435: {
! 436: int error;
! 437:
! 438: error = 0;
! 439: switch (oname) {
! 440: case OSF1__PC_CHOWN_RESTRICTED:
! 441: *bnamep = _PC_CHOWN_RESTRICTED;
! 442: break;
! 443:
! 444: case OSF1__PC_LINK_MAX:
! 445: *bnamep = _PC_LINK_MAX;
! 446: break;
! 447:
! 448: case OSF1__PC_MAX_CANON:
! 449: *bnamep = _PC_MAX_CANON;
! 450: break;
! 451:
! 452: case OSF1__PC_MAX_INPUT:
! 453: *bnamep = _PC_MAX_INPUT;
! 454: break;
! 455:
! 456: case OSF1__PC_NAME_MAX:
! 457: *bnamep = _PC_NAME_MAX;
! 458: break;
! 459:
! 460: case OSF1__PC_NO_TRUNC:
! 461: *bnamep = _PC_NO_TRUNC;
! 462: break;
! 463:
! 464: case OSF1__PC_PATH_MAX:
! 465: *bnamep = _PC_PATH_MAX;
! 466: break;
! 467:
! 468: case OSF1__PC_PIPE_BUF:
! 469: *bnamep = _PC_PIPE_BUF;
! 470: break;
! 471:
! 472: case OSF1__PC_VDISABLE:
! 473: *bnamep = _PC_VDISABLE;
! 474: break;
! 475:
! 476: default:
! 477: error = EINVAL;
! 478: break;
! 479: }
! 480:
! 481: return (error);
! 482: }
! 483:
! 484: /*
! 485: * Convert from as rusage structure to an osf1 rusage structure.
! 486: */
! 487: void
! 488: osf1_cvt_rusage_from_native(ru, oru)
! 489: const struct rusage *ru;
! 490: struct osf1_rusage *oru;
! 491: {
! 492:
! 493: oru->ru_utime.tv_sec = ru->ru_utime.tv_sec;
! 494: oru->ru_utime.tv_usec = ru->ru_utime.tv_usec;
! 495:
! 496: oru->ru_stime.tv_sec = ru->ru_stime.tv_sec;
! 497: oru->ru_stime.tv_usec = ru->ru_stime.tv_usec;
! 498:
! 499: oru->ru_maxrss = ru->ru_maxrss;
! 500: oru->ru_ixrss = ru->ru_ixrss;
! 501: oru->ru_idrss = ru->ru_idrss;
! 502: oru->ru_isrss = ru->ru_isrss;
! 503: oru->ru_minflt = ru->ru_minflt;
! 504: oru->ru_majflt = ru->ru_majflt;
! 505: oru->ru_nswap = ru->ru_nswap;
! 506: oru->ru_inblock = ru->ru_inblock;
! 507: oru->ru_oublock = ru->ru_oublock;
! 508: oru->ru_msgsnd = ru->ru_msgsnd;
! 509: oru->ru_msgrcv = ru->ru_msgrcv;
! 510: oru->ru_nsignals = ru->ru_nsignals;
! 511: oru->ru_nvcsw = ru->ru_nvcsw;
! 512: oru->ru_nivcsw = ru->ru_nivcsw;
! 513: }
! 514:
! 515: /*
! 516: * XXX: Only a subset of the flags is currently implemented.
! 517: */
! 518: void
! 519: osf1_cvt_sigaction_from_native(bsa, osa)
! 520: const struct sigaction *bsa;
! 521: struct osf1_sigaction *osa;
! 522: {
! 523: osa->sa__handler = bsa->sa_handler;
! 524: osf1_cvt_sigset_from_native(&bsa->sa_mask, &osa->sa_mask);
! 525: osa->sa_flags = 0;
! 526:
! 527: /* Translate by hand */
! 528: if ((bsa->sa_flags & SA_ONSTACK) != 0)
! 529: osa->sa_flags |= OSF1_SA_ONSTACK;
! 530: if ((bsa->sa_flags & SA_RESTART) != 0)
! 531: osa->sa_flags |= OSF1_SA_RESTART;
! 532: if ((bsa->sa_flags & SA_NOCLDSTOP) != 0)
! 533: osa->sa_flags |= OSF1_SA_NOCLDSTOP;
! 534: if ((bsa->sa_flags & SA_NOCLDWAIT) != 0)
! 535: osa->sa_flags |= OSF1_SA_NOCLDWAIT;
! 536: if ((bsa->sa_flags & SA_NODEFER) != 0)
! 537: osa->sa_flags |= OSF1_SA_NODEFER;
! 538: if ((bsa->sa_flags & SA_RESETHAND) != 0)
! 539: osa->sa_flags |= OSF1_SA_RESETHAND;
! 540: if ((bsa->sa_flags & SA_SIGINFO) != 0)
! 541: osa->sa_flags |= OSF1_SA_SIGINFO;
! 542: }
! 543:
! 544: int
! 545: osf1_cvt_sigaction_to_native(osa, bsa)
! 546: const struct osf1_sigaction *osa;
! 547: struct sigaction *bsa;
! 548: {
! 549: bsa->sa_handler = osa->sa__handler;
! 550: osf1_cvt_sigset_to_native(&osa->sa_mask, &bsa->sa_mask);
! 551: bsa->sa_flags = 0;
! 552:
! 553: /* Translate by hand */
! 554: if ((osa->sa_flags & OSF1_SA_ONSTACK) != 0)
! 555: bsa->sa_flags |= SA_ONSTACK;
! 556: if ((osa->sa_flags & OSF1_SA_RESTART) != 0)
! 557: bsa->sa_flags |= SA_RESTART;
! 558: if ((osa->sa_flags & OSF1_SA_RESETHAND) != 0)
! 559: bsa->sa_flags |= SA_RESETHAND;
! 560: if ((osa->sa_flags & OSF1_SA_NOCLDSTOP) != 0)
! 561: bsa->sa_flags |= SA_NOCLDSTOP;
! 562: if ((osa->sa_flags & OSF1_SA_NOCLDWAIT) != 0)
! 563: bsa->sa_flags |= SA_NOCLDWAIT;
! 564: if ((osa->sa_flags & OSF1_SA_NODEFER) != 0)
! 565: bsa->sa_flags |= SA_NODEFER;
! 566: if ((osa->sa_flags & OSF1_SA_SIGINFO) != 0)
! 567: bsa->sa_flags |= SA_SIGINFO;
! 568:
! 569: return(0);
! 570: }
! 571:
! 572: void
! 573: osf1_cvt_sigaltstack_from_native(bss, oss)
! 574: const struct sigaltstack *bss;
! 575: struct osf1_sigaltstack *oss;
! 576: {
! 577:
! 578: oss->ss_sp = bss->ss_sp;
! 579: oss->ss_size = bss->ss_size;
! 580:
! 581: /* translate flags */
! 582: oss->ss_flags = emul_flags_translate(osf1_sigaltstack_flags_rxtab,
! 583: bss->ss_flags, NULL);
! 584: }
! 585:
! 586: int
! 587: osf1_cvt_sigaltstack_to_native(oss, bss)
! 588: const struct osf1_sigaltstack *oss;
! 589: struct sigaltstack *bss;
! 590: {
! 591: unsigned long leftovers;
! 592:
! 593: bss->ss_sp = oss->ss_sp;
! 594: bss->ss_size = oss->ss_size;
! 595:
! 596: /* translate flags */
! 597: bss->ss_flags = emul_flags_translate(osf1_sigaltstack_flags_xtab,
! 598: oss->ss_flags, &leftovers);
! 599:
! 600: if (leftovers != 0) {
! 601: printf("osf1_cvt_sigaltstack_to_native: leftovers = 0x%lx\n",
! 602: leftovers);
! 603: return (EINVAL);
! 604: }
! 605:
! 606: return (0);
! 607: }
! 608:
! 609: void
! 610: osf1_cvt_sigset_from_native(bss, oss)
! 611: const sigset_t *bss;
! 612: osf1_sigset_t *oss;
! 613: {
! 614: int i, newsig;
! 615:
! 616: osf1_sigemptyset(oss);
! 617: for (i = 1; i < NSIG; i++) {
! 618: if (sigismember(bss, i)) {
! 619: newsig = osf1_signal_rxlist[i];
! 620: if (newsig)
! 621: osf1_sigaddset(oss, newsig);
! 622: }
! 623: }
! 624: }
! 625:
! 626: int
! 627: osf1_cvt_sigset_to_native(oss, bss)
! 628: const osf1_sigset_t *oss;
! 629: sigset_t *bss;
! 630: {
! 631: int i, newsig;
! 632:
! 633: sigemptyset(bss);
! 634: for (i = 1; i < OSF1_NSIG; i++) {
! 635: if (osf1_sigismember(oss, i)) {
! 636: newsig = osf1_signal_xlist[i];
! 637: if (newsig)
! 638: sigaddset(bss, newsig);
! 639: }
! 640: }
! 641: return (0);
! 642: }
! 643:
! 644: /*
! 645: * Convert from a stat structure to an osf1 stat structure.
! 646: */
! 647: void
! 648: osf1_cvt_stat_from_native(st, ost)
! 649: const struct stat *st;
! 650: struct osf1_stat *ost;
! 651: {
! 652:
! 653: ost->st_dev = osf1_cvt_dev_from_native(st->st_dev);
! 654: ost->st_ino = st->st_ino;
! 655: ost->st_mode = st->st_mode;
! 656: ost->st_nlink = st->st_nlink;
! 657: ost->st_uid = st->st_uid == -2 ? (u_int16_t) -2 : st->st_uid;
! 658: ost->st_gid = st->st_gid == -2 ? (u_int16_t) -2 : st->st_gid;
! 659: ost->st_rdev = osf1_cvt_dev_from_native(st->st_rdev);
! 660: ost->st_size = st->st_size;
! 661: ost->st_atime_sec = st->st_atime;
! 662: ost->st_spare1 = 0;
! 663: ost->st_mtime_sec = st->st_mtime;
! 664: ost->st_spare2 = 0;
! 665: ost->st_ctime_sec = st->st_ctime;
! 666: ost->st_spare3 = 0;
! 667: ost->st_blksize = st->st_blksize;
! 668: ost->st_blocks = st->st_blocks;
! 669: ost->st_flags = st->st_flags;
! 670: ost->st_gen = st->st_gen;
! 671: }
! 672:
! 673: void
! 674: osf1_cvt_statfs_from_native(bsfs, osfs)
! 675: const struct statfs *bsfs;
! 676: struct osf1_statfs *osfs;
! 677: {
! 678:
! 679: memset(osfs, 0, sizeof (struct osf1_statfs));
! 680: if (!strncmp(MOUNT_FFS, bsfs->f_fstypename, MFSNAMELEN))
! 681: osfs->f_type = OSF1_MOUNT_UFS;
! 682: else if (!strncmp(MOUNT_NFS, bsfs->f_fstypename, MFSNAMELEN))
! 683: osfs->f_type = OSF1_MOUNT_NFS;
! 684: else if (!strncmp(MOUNT_MFS, bsfs->f_fstypename, MFSNAMELEN))
! 685: osfs->f_type = OSF1_MOUNT_MFS;
! 686: else
! 687: /* uh oh... XXX = PC, CDFS, PROCFS, etc. */
! 688: osfs->f_type = OSF1_MOUNT_ADDON;
! 689: osfs->f_flags = bsfs->f_flags; /* XXX translate */
! 690: osfs->f_fsize = bsfs->f_bsize;
! 691: osfs->f_bsize = bsfs->f_iosize;
! 692: osfs->f_blocks = bsfs->f_blocks;
! 693: osfs->f_bfree = bsfs->f_bfree;
! 694: osfs->f_bavail = bsfs->f_bavail;
! 695: osfs->f_files = bsfs->f_files;
! 696: osfs->f_ffree = bsfs->f_ffree;
! 697: memcpy(&osfs->f_fsid, &bsfs->f_fsid,
! 698: max(sizeof bsfs->f_fsid, sizeof osfs->f_fsid));
! 699: /* osfs->f_spare zeroed above */
! 700: memcpy(osfs->f_mntonname, bsfs->f_mntonname,
! 701: max(sizeof bsfs->f_mntonname, sizeof osfs->f_mntonname));
! 702: memcpy(osfs->f_mntfromname, bsfs->f_mntfromname,
! 703: max(sizeof bsfs->f_mntfromname, sizeof osfs->f_mntfromname));
! 704: /* XXX osfs->f_xxx should be filled in... */
! 705: }
CVSweb