152136Smckusick /* 252136Smckusick * Copyright (c) 1988 University of Utah. 352136Smckusick * Copyright (c) 1990 The Regents of the University of California. 452136Smckusick * All rights reserved. 552136Smckusick * 652136Smckusick * This code is derived from software contributed to Berkeley by 752136Smckusick * the Systems Programming Group of the University of Utah Computer 852136Smckusick * Science Department and Ralph Campbell. 952136Smckusick * 1052136Smckusick * %sccs.include.redist.c% 1152136Smckusick * 1252136Smckusick * from: Utah $Hdr: hpux_compat.c 1.41 91/04/06$ 1352136Smckusick * 14*56234Sralph * @(#)ultrix_compat.c 7.3 (Berkeley) 09/13/92 1552136Smckusick */ 1652136Smckusick 1752136Smckusick /* 1852136Smckusick * Various ULTRIX compatibility routines 1952136Smckusick */ 2052136Smckusick 2152136Smckusick #ifdef ULTRIXCOMPAT 2252136Smckusick 2352136Smckusick #include "param.h" 2452136Smckusick #include "systm.h" 2552136Smckusick #include "signalvar.h" 2652136Smckusick #include "kernel.h" 2752136Smckusick #include "filedesc.h" 2852136Smckusick #include "proc.h" 2952136Smckusick #include "buf.h" 3052136Smckusick #include "wait.h" 3152136Smckusick #include "file.h" 3252136Smckusick #include "namei.h" 3352136Smckusick #include "vnode.h" 3452136Smckusick #include "ioctl.h" 3552136Smckusick #include "ptrace.h" 3652136Smckusick #include "stat.h" 3752136Smckusick #include "syslog.h" 3852136Smckusick #include "malloc.h" 3952136Smckusick #include "mount.h" 4052136Smckusick #include "ipc.h" 4152136Smckusick #include "user.h" 4252136Smckusick 4352136Smckusick #include "machine/cpu.h" 4452136Smckusick #include "machine/reg.h" 4552136Smckusick #include "machine/psl.h" 4652136Smckusick #include "machine/vmparam.h" 4752136Smckusick 4852136Smckusick #ifdef DEBUG 4952136Smckusick int unimpresponse = 0; 5052136Smckusick #endif 5152136Smckusick 5252136Smckusick /* YP domainname */ 5352136Smckusick char domainname[MAXHOSTNAMELEN] = "unknown"; 5452136Smckusick int domainnamelen = 7; 5552136Smckusick 5652136Smckusick notimp(p, uap, retval) 5752136Smckusick struct proc *p; 5852136Smckusick void *uap; 5952136Smckusick int *retval; 6052136Smckusick { 6152136Smckusick int error = 0; 6252136Smckusick #ifdef notdef 6352136Smckusick register int *argp = uap; 6452136Smckusick extern char *ultrixsyscallnames[]; 6552136Smckusick 6652136Smckusick printf("ULTRIX %s(", ultrixsyscallnames[code]); 6752136Smckusick if (nargs) 6852136Smckusick while (nargs--) 6952136Smckusick printf("%x%c", *argp++, nargs? ',' : ')'); 7052136Smckusick else 7152136Smckusick printf(")"); 7252136Smckusick printf("\n"); 7352136Smckusick switch (unimpresponse) { 7452136Smckusick case 0: 7552136Smckusick error = nosys(p, uap, retval); 7652136Smckusick break; 7752136Smckusick case 1: 7852136Smckusick error = EINVAL; 7952136Smckusick break; 8052136Smckusick } 8152136Smckusick #else 8253064Sralph uprintf("ULTRIX system call %d not implemented\n", p->p_md.md_regs[V0]); 8352136Smckusick error = nosys(p, uap, retval); 8452136Smckusick #endif 8552136Smckusick return (error); 8652136Smckusick } 8752136Smckusick 88*56234Sralph struct wait3_args { 89*56234Sralph int *status; 90*56234Sralph int options; 91*56234Sralph int rusage; 92*56234Sralph }; 93*56234Sralph 9452136Smckusick ultrixwait3(p, uap, retval) 9552136Smckusick struct proc *p; 96*56234Sralph struct wait3_args *uap; 9752136Smckusick int *retval; 9852136Smckusick { 9952136Smckusick struct { 10052136Smckusick int pid; 10152136Smckusick int *status; 10252136Smckusick int options; 10352136Smckusick struct rusage *rusage; 10452136Smckusick int compat; 10552136Smckusick } bsd_uap; 10652136Smckusick 10752136Smckusick /* rusage pointer must be zero */ 10852136Smckusick if (uap->rusage) 10952136Smckusick return (EINVAL); 11052136Smckusick bsd_uap.pid = WAIT_ANY; 11152136Smckusick bsd_uap.status = uap->status; 11252136Smckusick bsd_uap.options = 0; 11352136Smckusick bsd_uap.rusage = 0; 11452136Smckusick bsd_uap.compat = 0; 11552136Smckusick return (wait1(p, &bsd_uap, retval)); 11652136Smckusick } 11752136Smckusick 118*56234Sralph struct domainname_args { 119*56234Sralph char *domainname; 120*56234Sralph u_int len; 121*56234Sralph }; 122*56234Sralph 12352136Smckusick ultrixgetdomainname(p, uap, retval) 12452136Smckusick struct proc *p; 125*56234Sralph register struct domainname_args *uap; 12652136Smckusick int *retval; 12752136Smckusick { 12852136Smckusick if (uap->len > domainnamelen + 1) 12952136Smckusick uap->len = domainnamelen + 1; 13052136Smckusick return (copyout(domainname, uap->domainname, uap->len)); 13152136Smckusick } 13252136Smckusick 13352136Smckusick ultrixsetdomainname(p, uap, retval) 13452136Smckusick struct proc *p; 135*56234Sralph register struct domainname_args *uap; 13652136Smckusick int *retval; 13752136Smckusick { 13852136Smckusick int error; 13952136Smckusick 14052136Smckusick if (error = suser(p->p_ucred, &p->p_acflag)) 14152136Smckusick return (error); 14252136Smckusick if (uap->len > sizeof (domainname) - 1) 14352136Smckusick return (EINVAL); 14452136Smckusick domainnamelen = uap->len; 14552136Smckusick error = copyin(uap->domainname, domainname, uap->len); 14652136Smckusick domainname[domainnamelen] = 0; 14752136Smckusick return (error); 14852136Smckusick } 14952136Smckusick 150*56234Sralph struct getpgrp_args { 151*56234Sralph int pid; 152*56234Sralph }; 153*56234Sralph 15452136Smckusick /* 15552136Smckusick * This is the equivalent of BSD getpgrp but with more restrictions. 15652136Smckusick * Note we do not check the real uid or "saved" uid. 15752136Smckusick */ 15852136Smckusick ultrixgetpgrp(cp, uap, retval) 15952136Smckusick struct proc *cp; 160*56234Sralph register struct getpgrp_args *uap; 16152136Smckusick int *retval; 16252136Smckusick { 16352136Smckusick register struct proc *p; 16452136Smckusick 16552136Smckusick if (uap->pid == 0) 16652136Smckusick uap->pid = cp->p_pid; 16752136Smckusick p = pfind(uap->pid); 16852136Smckusick if (p == 0) 16952136Smckusick return (ESRCH); 17052136Smckusick if (cp->p_ucred->cr_uid && p->p_ucred->cr_uid != cp->p_ucred->cr_uid && 17152136Smckusick !inferior(p)) 17252136Smckusick return (EPERM); 17352136Smckusick *retval = p->p_pgid; 17452136Smckusick return (0); 17552136Smckusick } 17652136Smckusick 177*56234Sralph struct setpgrp_args { 178*56234Sralph int pid; 179*56234Sralph int pgrp; 180*56234Sralph } *uap; 18152136Smckusick /* 18252136Smckusick * This is the equivalent of BSD setpgrp but with more restrictions. 18352136Smckusick * Note we do not check the real uid or "saved" uid or pgrp. 18452136Smckusick */ 18552136Smckusick ultrixsetpgrp(p, uap, retval) 18652136Smckusick struct proc *p; 187*56234Sralph struct setpgrp_args *uap; 18852136Smckusick int *retval; 18952136Smckusick { 19052136Smckusick /* empirically determined */ 19152136Smckusick if (uap->pgrp < 0 || uap->pgrp >= 30000) 19252136Smckusick return (EINVAL); 19352136Smckusick return (setpgid(p, uap, retval)); 19452136Smckusick } 19552136Smckusick 196*56234Sralph struct sigvec_args { 197*56234Sralph int signo; 198*56234Sralph struct sigvec *nsv; 199*56234Sralph struct sigvec *osv; 200*56234Sralph caddr_t sigcode; /* handler return address */ 201*56234Sralph }; 202*56234Sralph 20352136Smckusick ultrixsigvec(p, uap, retval) 20452136Smckusick struct proc *p; 205*56234Sralph register struct sigvec_args *uap; 20652136Smckusick int *retval; 20752136Smckusick { 20852136Smckusick return (osigvec(p, uap, retval)); 20952136Smckusick } 21052136Smckusick 21152136Smckusick ultrixsigcleanup(p, uap, retval) 21252136Smckusick struct proc *p; 21352136Smckusick void *uap; 21452136Smckusick int *retval; 21552136Smckusick { 21652136Smckusick printf("ultrixsigcleanup %s %d\n", p->p_comm, p->p_pid); /* XXX */ 21752136Smckusick return (ENOSYS); 21852136Smckusick } 21952136Smckusick 22052136Smckusick ultrixsigreturn(p, uap, retval) 22152136Smckusick struct proc *p; 22252136Smckusick void *uap; 22352136Smckusick int *retval; 22452136Smckusick { 22552136Smckusick printf("ultrixsigreturn %s %d\n", p->p_comm, p->p_pid); /* XXX */ 22652136Smckusick return (ENOSYS); 22752136Smckusick } 22852136Smckusick 22952136Smckusick /* 23052136Smckusick * Switch process from ULTRIX emulation to BSD. 23152136Smckusick */ 23252136Smckusick ultrixtobsd(p, uap, retval) 23352136Smckusick struct proc *p; 23452136Smckusick void *uap; 23552136Smckusick int *retval; 23652136Smckusick { 23752136Smckusick 23852136Smckusick p->p_md.md_flags &= ~MDP_ULTRIX; 23952136Smckusick return (0); 24052136Smckusick } 24152136Smckusick 24252136Smckusick ultrixgetsysinfo(p, uap, retval) 24352136Smckusick struct proc *p; 24452136Smckusick void *uap; 24552136Smckusick int *retval; 24652136Smckusick { 24752136Smckusick 24852136Smckusick /* 24952136Smckusick * Just return a 0. This says that the requested information is 25052136Smckusick * not available which is certainly true for the most part. 25152136Smckusick */ 25252136Smckusick retval[0] = 0; 25352136Smckusick return (0); 25452136Smckusick } 25552136Smckusick 25652136Smckusick #endif 257