Annotation of sys/compat/ultrix/ultrix_misc.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: ultrix_misc.c,v 1.30 2007/06/06 17:15:13 deraadt Exp $ */
! 2: /* $NetBSD: ultrix_misc.c,v 1.23 1996/04/07 17:23:04 jonathan Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1995
! 6: * Jonathan Stone (hereinafter referred to as the author)
! 7: *
! 8: * Redistribution and use in source and binary forms, with or without
! 9: * modification, are permitted provided that the following conditions
! 10: * are met:
! 11: * 1. Redistributions of source code must retain the above copyright
! 12: * notice, this list of conditions and the following disclaimer.
! 13: * 2. Redistributions in binary form must reproduce the above copyright
! 14: * notice, this list of conditions and the following disclaimer in the
! 15: * documentation and/or other materials provided with the distribution.
! 16: * 3. The name of the author may not be used to endorse or promote products
! 17: * derived from this software without specific prior written permission.
! 18: *
! 19: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
! 20: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 21: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 22: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
! 23: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 24: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 25: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 26: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 27: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 28: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 29: * SUCH DAMAGE.
! 30: */
! 31:
! 32: /*
! 33: * Copyright (c) 1992, 1993
! 34: * The Regents of the University of California. All rights reserved.
! 35: *
! 36: * This software was developed by the Computer Systems Engineering group
! 37: * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
! 38: * contributed to Berkeley.
! 39: *
! 40: * All advertising materials mentioning features or use of this software
! 41: * must display the following acknowledgement:
! 42: * This product includes software developed by the University of
! 43: * California, Lawrence Berkeley Laboratory.
! 44: *
! 45: * Redistribution and use in source and binary forms, with or without
! 46: * modification, are permitted provided that the following conditions
! 47: * are met:
! 48: * 1. Redistributions of source code must retain the above copyright
! 49: * notice, this list of conditions and the following disclaimer.
! 50: * 2. Redistributions in binary form must reproduce the above copyright
! 51: * notice, this list of conditions and the following disclaimer in the
! 52: * documentation and/or other materials provided with the distribution.
! 53: * 3. Neither the name of the University nor the names of its contributors
! 54: * may be used to endorse or promote products derived from this software
! 55: * without specific prior written permission.
! 56: *
! 57: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 58: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 59: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 60: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 61: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 62: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 63: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 64: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 65: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 66: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 67: * SUCH DAMAGE.
! 68: *
! 69: *
! 70: * @(#)sun_misc.c 8.1 (Berkeley) 6/18/93
! 71: *
! 72: * from: Header: sun_misc.c,v 1.16 93/04/07 02:46:27 torek Exp
! 73: */
! 74:
! 75: /*
! 76: * SunOS compatibility module.
! 77: *
! 78: * SunOS system calls that are implemented differently in BSD are
! 79: * handled here.
! 80: */
! 81:
! 82: #include <sys/param.h>
! 83: #include <sys/systm.h>
! 84: #include <sys/namei.h>
! 85: #include <sys/dirent.h>
! 86: #include <sys/proc.h>
! 87: #include <sys/file.h>
! 88: #include <sys/filedesc.h>
! 89: /*#include <sys/stat.h>*/
! 90: /*#include <sys/ioctl.h>*/
! 91: #include <sys/kernel.h>
! 92: #include <sys/exec.h>
! 93: #include <sys/malloc.h>
! 94: #include <sys/mbuf.h>
! 95: #include <sys/mman.h>
! 96: #include <sys/mount.h>
! 97: #include <sys/resource.h>
! 98: #include <sys/resourcevar.h>
! 99: #include <sys/signal.h>
! 100: #include <sys/signalvar.h>
! 101: #include <sys/socket.h>
! 102: #include <sys/vnode.h>
! 103: #include <sys/uio.h>
! 104: #include <sys/wait.h>
! 105: #include <sys/utsname.h>
! 106: #include <sys/unistd.h>
! 107:
! 108: #include <sys/syscallargs.h>
! 109:
! 110: #include <compat/ultrix/ultrix_syscall.h>
! 111: #include <compat/ultrix/ultrix_syscallargs.h>
! 112: #include <compat/ultrix/ultrix_util.h>
! 113:
! 114: #include <netinet/in.h>
! 115:
! 116: #include <miscfs/specfs/specdev.h>
! 117:
! 118: #include <nfs/rpcv2.h>
! 119: #include <nfs/nfsproto.h>
! 120: #include <nfs/nfs.h>
! 121:
! 122: #include <uvm/uvm_extern.h>
! 123:
! 124: #include <sys/conf.h> /* iszerodev() */
! 125: #include <sys/socketvar.h> /* sosetopt() */
! 126:
! 127: extern struct sysent ultrix_sysent[];
! 128: #ifdef SYSCALL_DEBUG
! 129: extern char *ultrix_syscallnames[];
! 130: #endif
! 131:
! 132: /*
! 133: * Select the appropriate setregs callback for the target architecture.
! 134: */
! 135: #ifdef __mips__
! 136: #define ULTRIX_EXEC_SETREGS cpu_exec_ecoff_setregs
! 137: #endif /* __mips__ */
! 138:
! 139: #ifdef __vax__
! 140: #define ULTRIX_EXEC_SETREGS setregs
! 141: #endif /* __vax__ */
! 142:
! 143:
! 144: extern void ULTRIX_EXEC_SETREGS(struct proc *, struct exec_package *,
! 145: u_long, register_t *);
! 146: extern char sigcode[], esigcode[];
! 147:
! 148: struct emul emul_ultrix = {
! 149: "ultrix",
! 150: NULL,
! 151: sendsig,
! 152: ULTRIX_SYS_syscall,
! 153: ULTRIX_SYS_MAXSYSCALL,
! 154: ultrix_sysent,
! 155: #ifdef SYSCALL_DEBUG
! 156: ultrix_syscallnames,
! 157: #else
! 158: NULL,
! 159: #endif
! 160: 0,
! 161: copyargs,
! 162: ULTRIX_EXEC_SETREGS,
! 163: NULL,
! 164: sigcode,
! 165: esigcode,
! 166: };
! 167:
! 168: #define GSI_PROG_ENV 1
! 169:
! 170: int
! 171: ultrix_sys_getsysinfo(p, v, retval)
! 172: struct proc *p;
! 173: void *v;
! 174: register_t *retval;
! 175: {
! 176: struct ultrix_sys_getsysinfo_args *uap = v;
! 177: static short progenv = 0;
! 178:
! 179: switch (SCARG(uap, op)) {
! 180: /* operations implemented: */
! 181: case GSI_PROG_ENV:
! 182: if (SCARG(uap, nbytes) < sizeof(short))
! 183: return EINVAL;
! 184: *retval = 1;
! 185: return (copyout(&progenv, SCARG(uap, buffer), sizeof(short)));
! 186: default:
! 187: *retval = 0; /* info unavail */
! 188: return 0;
! 189: }
! 190: }
! 191:
! 192: int
! 193: ultrix_sys_setsysinfo(p, v, retval)
! 194: struct proc *p;
! 195: void *v;
! 196: register_t *retval;
! 197: {
! 198:
! 199: #ifdef notyet
! 200: struct ultrix_sys_setsysinfo_args *uap = v;
! 201: #endif
! 202:
! 203: *retval = 0;
! 204: return 0;
! 205: }
! 206:
! 207: int
! 208: ultrix_sys_waitpid(p, v, retval)
! 209: struct proc *p;
! 210: void *v;
! 211: register_t *retval;
! 212: {
! 213: struct ultrix_sys_waitpid_args *uap = v;
! 214: struct sys_wait4_args ua;
! 215:
! 216: SCARG(&ua, pid) = SCARG(uap, pid);
! 217: SCARG(&ua, status) = SCARG(uap, status);
! 218: SCARG(&ua, options) = SCARG(uap, options);
! 219: SCARG(&ua, rusage) = 0;
! 220:
! 221: return (sys_wait4(p, &ua, retval));
! 222: }
! 223:
! 224: int
! 225: ultrix_sys_wait3(p, v, retval)
! 226: struct proc *p;
! 227: void *v;
! 228: register_t *retval;
! 229: {
! 230: struct ultrix_sys_wait3_args *uap = v;
! 231: struct sys_wait4_args ua;
! 232:
! 233: SCARG(&ua, pid) = -1;
! 234: SCARG(&ua, status) = SCARG(uap, status);
! 235: SCARG(&ua, options) = SCARG(uap, options);
! 236: SCARG(&ua, rusage) = SCARG(uap, rusage);
! 237:
! 238: return (sys_wait4(p, &ua, retval));
! 239: }
! 240:
! 241: /*
! 242: * Ultrix binaries pass in FD_MAX as the first arg to select().
! 243: * On Ultrix, FD_MAX is 4096, which is more than the NetBSD sys_select()
! 244: * can handle.
! 245: * Since we can't have more than the (native) FD_MAX descriptors open,
! 246: * limit nfds to at most FD_MAX.
! 247: */
! 248: int
! 249: ultrix_sys_select(p, v, retval)
! 250: struct proc *p;
! 251: void *v;
! 252: register_t *retval;
! 253: {
! 254: struct sys_select_args *uap = v;
! 255: struct timeval atv;
! 256: int error;
! 257:
! 258: /* Limit number of FDs selected on to the native maximum */
! 259:
! 260: if (SCARG(uap, nd) > FD_SETSIZE)
! 261: SCARG(uap, nd) = FD_SETSIZE;
! 262:
! 263: /* Check for negative timeval */
! 264: if (SCARG(uap, tv)) {
! 265: error = copyin((caddr_t)SCARG(uap, tv), (caddr_t)&atv,
! 266: sizeof(atv));
! 267: if (error)
! 268: goto done;
! 269: #ifdef DEBUG
! 270: /* Ultrix clients sometimes give negative timeouts? */
! 271: if (atv.tv_sec < 0 || atv.tv_usec < 0)
! 272: printf("ultrix select( %ld, %ld): negative timeout\n",
! 273: atv.tv_sec, atv.tv_usec);
! 274: /*tvp = (timeval *)STACKGAPBASE;*/
! 275: #endif
! 276:
! 277: }
! 278: error = sys_select(p, (void *) uap, retval);
! 279: if (error == EINVAL)
! 280: printf("ultrix select: bad args?\n");
! 281:
! 282: done:
! 283: return error;
! 284: }
! 285:
! 286: #if defined(NFSCLIENT)
! 287: int
! 288: async_daemon(p, v, retval)
! 289: struct proc *p;
! 290: void *v;
! 291: register_t *retval;
! 292: {
! 293: struct sys_nfssvc_args ouap;
! 294:
! 295: SCARG(&ouap, flag) = NFSSVC_BIOD;
! 296: SCARG(&ouap, argp) = NULL;
! 297:
! 298: return (sys_nfssvc(p, &ouap, retval));
! 299: }
! 300: #endif /* NFSCLIENT */
! 301:
! 302:
! 303: #define SUN__MAP_NEW 0x80000000 /* if not, old mmap & cannot handle */
! 304:
! 305: int
! 306: ultrix_sys_mmap(p, v, retval)
! 307: struct proc *p;
! 308: void *v;
! 309: register_t *retval;
! 310: {
! 311: struct ultrix_sys_mmap_args *uap = v;
! 312: struct sys_mmap_args ouap;
! 313:
! 314: /*
! 315: * Verify the arguments.
! 316: */
! 317: if (SCARG(uap, prot) & ~(PROT_READ|PROT_WRITE|PROT_EXEC))
! 318: return (EINVAL); /* XXX still needed? */
! 319:
! 320: if ((SCARG(uap, flags) & SUN__MAP_NEW) == 0)
! 321: return (EINVAL);
! 322:
! 323: SCARG(&ouap, flags) = SCARG(uap, flags) & ~SUN__MAP_NEW;
! 324: SCARG(&ouap, addr) = SCARG(uap, addr);
! 325:
! 326: if ((SCARG(&ouap, flags) & MAP_FIXED) == 0 &&
! 327: SCARG(&ouap, addr) != 0 &&
! 328: SCARG(&ouap, addr) < (void *)round_page((vaddr_t)p->p_vmspace->vm_daddr+MAXDSIZ))
! 329: SCARG(&ouap, addr) = (void *)round_page((vaddr_t)p->p_vmspace->vm_daddr+MAXDSIZ);
! 330:
! 331: SCARG(&ouap, len) = SCARG(uap, len);
! 332: SCARG(&ouap, prot) = SCARG(uap, prot);
! 333: SCARG(&ouap, fd) = SCARG(uap, fd);
! 334: SCARG(&ouap, pos) = SCARG(uap, pos);
! 335:
! 336: return (sys_mmap(p, &ouap, retval));
! 337: }
! 338:
! 339: int
! 340: ultrix_sys_setsockopt(p, v, retval)
! 341: struct proc *p;
! 342: void *v;
! 343: register_t *retval;
! 344: {
! 345: register struct ultrix_sys_setsockopt_args *uap = v;
! 346: struct file *fp;
! 347: struct mbuf *m = NULL;
! 348: int error;
! 349:
! 350: if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)) != 0)
! 351: return (error);
! 352: #define SO_DONTLINGER (~SO_LINGER)
! 353: if (SCARG(uap, name) == SO_DONTLINGER) {
! 354: m = m_get(M_WAIT, MT_SOOPTS);
! 355: mtod(m, struct linger *)->l_onoff = 0;
! 356: m->m_len = sizeof(struct linger);
! 357: error = (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
! 358: SO_LINGER, m));
! 359: goto bad;
! 360: }
! 361: if (SCARG(uap, valsize) > MLEN) {
! 362: error = EINVAL;
! 363: goto bad;
! 364: }
! 365: if (SCARG(uap, val)) {
! 366: m = m_get(M_WAIT, MT_SOOPTS);
! 367: if ((error = copyin(SCARG(uap, val), mtod(m, caddr_t),
! 368: (u_int)SCARG(uap, valsize))) != 0) {
! 369: (void) m_free(m);
! 370: goto bad;
! 371: }
! 372: m->m_len = SCARG(uap, valsize);
! 373: }
! 374: error = (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
! 375: SCARG(uap, name), m));
! 376: bad:
! 377: FRELE(fp);
! 378: return (error);
! 379: }
! 380:
! 381: struct ultrix_utsname {
! 382: char sysname[9];
! 383: char nodename[9];
! 384: char nodeext[65-9];
! 385: char release[9];
! 386: char version[9];
! 387: char machine[9];
! 388: };
! 389:
! 390: int
! 391: ultrix_sys_uname(p, v, retval)
! 392: struct proc *p;
! 393: void *v;
! 394: register_t *retval;
! 395: {
! 396: struct ultrix_sys_uname_args *uap = v;
! 397: struct ultrix_utsname sut;
! 398: extern char machine[];
! 399:
! 400: bzero(&sut, sizeof(sut));
! 401:
! 402: bcopy(ostype, sut.sysname, sizeof(sut.sysname) - 1);
! 403: bcopy(hostname, sut.nodename, sizeof(sut.nodename));
! 404: sut.nodename[sizeof(sut.nodename)-1] = '\0';
! 405: bcopy(osrelease, sut.release, sizeof(sut.release) - 1);
! 406: bcopy("1", sut.version, sizeof(sut.version) - 1);
! 407: bcopy(machine, sut.machine, sizeof(sut.machine) - 1);
! 408:
! 409: return copyout((caddr_t)&sut, (caddr_t)SCARG(uap, name),
! 410: sizeof(struct ultrix_utsname));
! 411: }
! 412:
! 413: int
! 414: ultrix_sys_setpgrp(p, v, retval)
! 415: struct proc *p;
! 416: void *v;
! 417: register_t *retval;
! 418: {
! 419: struct ultrix_sys_setpgrp_args *uap = v;
! 420:
! 421: /*
! 422: * difference to our setpgid call is to include backwards
! 423: * compatibility to pre-setsid() binaries. Do setsid()
! 424: * instead of setpgid() in those cases where the process
! 425: * tries to create a new session the old way.
! 426: */
! 427: if (!SCARG(uap, pgid) &&
! 428: (!SCARG(uap, pid) || SCARG(uap, pid) == p->p_pid))
! 429: return sys_setsid(p, uap, retval);
! 430: else
! 431: return sys_setpgid(p, uap, retval);
! 432: }
! 433:
! 434: #if defined (NFSSERVER)
! 435: int
! 436: ultrix_sys_nfssvc(p, v, retval)
! 437: struct proc *p;
! 438: void *v;
! 439: register_t *retval;
! 440: {
! 441:
! 442: #if 0 /* XXX */
! 443: struct ultrix_sys_nfssvc_args *uap = v;
! 444: struct emul *e = p->p_emul;
! 445: struct sys_nfssvc_args outuap;
! 446: struct sockaddr sa;
! 447: int error;
! 448:
! 449: bzero(&outuap, sizeof outuap);
! 450: SCARG(&outuap, fd) = SCARG(uap, fd);
! 451: SCARG(&outuap, mskval) = STACKGAPBASE;
! 452: SCARG(&outuap, msklen) = sizeof sa;
! 453: SCARG(&outuap, mtchval) = outuap.mskval + sizeof sa;
! 454: SCARG(&outuap, mtchlen) = sizeof sa;
! 455:
! 456: bzero(&sa, sizeof sa);
! 457: if (error = copyout(&sa, SCARG(&outuap, mskval), SCARG(&outuap, msklen)))
! 458: return (error);
! 459: if (error = copyout(&sa, SCARG(&outuap, mtchval), SCARG(&outuap, mtchlen)))
! 460: return (error);
! 461:
! 462: return nfssvc(p, &outuap, retval);
! 463: #else
! 464: return (ENOSYS);
! 465: #endif
! 466: }
! 467: #endif /* NFSSERVER */
! 468:
! 469: struct ultrix_ustat {
! 470: int32_t f_tfree; /* total free */
! 471: ino_t f_tinode; /* total inodes free */
! 472: char f_fname[6]; /* filsys name */
! 473: char f_fpack[6]; /* filsys pack name */
! 474: };
! 475:
! 476: int
! 477: ultrix_sys_ustat(p, v, retval)
! 478: struct proc *p;
! 479: void *v;
! 480: register_t *retval;
! 481: {
! 482: struct ultrix_sys_ustat_args *uap = v;
! 483: struct ultrix_ustat us;
! 484: int error;
! 485:
! 486: bzero(&us, sizeof us);
! 487:
! 488: /*
! 489: * XXX: should set f_tfree and f_tinode at least
! 490: * How do we translate dev -> fstat? (and then to ultrix_ustat)
! 491: */
! 492:
! 493: if ((error = copyout(&us, SCARG(uap, buf), sizeof us)) != 0)
! 494: return (error);
! 495: return 0;
! 496: }
! 497:
! 498: int
! 499: ultrix_sys_quotactl(p, v, retval)
! 500: struct proc *p;
! 501: void *v;
! 502: register_t *retval;
! 503: {
! 504:
! 505: #ifdef notyet
! 506: struct ultrix_sys_quotactl_args *uap = v;
! 507: #endif
! 508:
! 509: return EINVAL;
! 510: }
! 511:
! 512: int
! 513: ultrix_sys_vhangup(p, v, retval)
! 514: struct proc *p;
! 515: void *v;
! 516: register_t *retval;
! 517: {
! 518:
! 519: return 0;
! 520: }
! 521:
! 522: int
! 523: ultrix_sys_exportfs(p, v, retval)
! 524: struct proc *p;
! 525: void *v;
! 526: register_t *retval;
! 527: {
! 528: #ifdef notyet
! 529: struct ultrix_sys_exportfs_args *uap = v;
! 530: #endif
! 531:
! 532: /*
! 533: * XXX: should perhaps translate into a mount(2)
! 534: * with MOUNT_EXPORT?
! 535: */
! 536: return 0;
! 537: }
! 538:
! 539: int
! 540: ultrix_sys_sigpending(p, v, retval)
! 541: struct proc *p;
! 542: void *v;
! 543: register_t *retval;
! 544: {
! 545: struct ultrix_sys_sigpending_args *uap = v;
! 546: int mask = p->p_siglist & p->p_sigmask;
! 547:
! 548: return (copyout((caddr_t)&mask, (caddr_t)SCARG(uap, mask), sizeof(int)));
! 549: }
! 550:
! 551: int
! 552: ultrix_sys_sigcleanup(p, v, retval)
! 553: struct proc *p;
! 554: void *v;
! 555: register_t *retval;
! 556: {
! 557: struct ultrix_sys_sigcleanup_args *uap = v;
! 558:
! 559: return sys_sigreturn(p, (struct sys_sigreturn_args *)uap, retval);
! 560: }
! 561:
! 562: int
! 563: ultrix_sys_sigreturn(p, v, retval)
! 564: struct proc *p;
! 565: void *v;
! 566: register_t *retval;
! 567: {
! 568: struct ultrix_sys_sigcleanup_args *uap = v;
! 569:
! 570: #ifdef DEBUG
! 571: printf("ultrix sigreturn\n");
! 572: #endif
! 573: return sys_sigreturn(p, (struct sys_sigreturn_args *)uap, retval);
! 574: }
! 575:
! 576: int
! 577: ultrix_sys_execve(p, v, retval)
! 578: struct proc *p;
! 579: void *v;
! 580: register_t *retval;
! 581: {
! 582: struct ultrix_sys_execve_args /* {
! 583: syscallarg(char *) path;
! 584: syscallarg(char **) argv;
! 585: syscallarg(char **) envp;
! 586: } */ *uap = v;
! 587: struct sys_execve_args ap;
! 588: caddr_t sg;
! 589:
! 590: sg = stackgap_init(p->p_emul);
! 591: ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
! 592:
! 593: SCARG(&ap, path) = SCARG(uap, path);
! 594: SCARG(&ap, argp) = SCARG(uap, argp);
! 595: SCARG(&ap, envp) = SCARG(uap, envp);
! 596:
! 597: return (sys_execve(p, &ap, retval));
! 598: }
CVSweb