1*52136Smckusick /* 2*52136Smckusick * Copyright (c) 1988 University of Utah. 3*52136Smckusick * Copyright (c) 1990 The Regents of the University of California. 4*52136Smckusick * All rights reserved. 5*52136Smckusick * 6*52136Smckusick * This code is derived from software contributed to Berkeley by 7*52136Smckusick * the Systems Programming Group of the University of Utah Computer 8*52136Smckusick * Science Department and Ralph Campbell. 9*52136Smckusick * 10*52136Smckusick * %sccs.include.redist.c% 11*52136Smckusick * 12*52136Smckusick * from: Utah $Hdr: hpux_compat.c 1.41 91/04/06$ 13*52136Smckusick * 14*52136Smckusick * @(#)ultrix_compat.c 7.1 (Berkeley) 01/07/92 15*52136Smckusick */ 16*52136Smckusick 17*52136Smckusick /* 18*52136Smckusick * Various ULTRIX compatibility routines 19*52136Smckusick */ 20*52136Smckusick 21*52136Smckusick #ifdef ULTRIXCOMPAT 22*52136Smckusick 23*52136Smckusick #include "param.h" 24*52136Smckusick #include "systm.h" 25*52136Smckusick #include "signalvar.h" 26*52136Smckusick #include "kernel.h" 27*52136Smckusick #include "filedesc.h" 28*52136Smckusick #include "proc.h" 29*52136Smckusick #include "buf.h" 30*52136Smckusick #include "wait.h" 31*52136Smckusick #include "file.h" 32*52136Smckusick #include "namei.h" 33*52136Smckusick #include "vnode.h" 34*52136Smckusick #include "ioctl.h" 35*52136Smckusick #include "ptrace.h" 36*52136Smckusick #include "stat.h" 37*52136Smckusick #include "syslog.h" 38*52136Smckusick #include "malloc.h" 39*52136Smckusick #include "mount.h" 40*52136Smckusick #include "ipc.h" 41*52136Smckusick #include "user.h" 42*52136Smckusick 43*52136Smckusick #include "machine/cpu.h" 44*52136Smckusick #include "machine/reg.h" 45*52136Smckusick #include "machine/psl.h" 46*52136Smckusick #include "machine/vmparam.h" 47*52136Smckusick 48*52136Smckusick #ifdef DEBUG 49*52136Smckusick int unimpresponse = 0; 50*52136Smckusick #endif 51*52136Smckusick 52*52136Smckusick /* YP domainname */ 53*52136Smckusick char domainname[MAXHOSTNAMELEN] = "unknown"; 54*52136Smckusick int domainnamelen = 7; 55*52136Smckusick 56*52136Smckusick notimp(p, uap, retval) 57*52136Smckusick struct proc *p; 58*52136Smckusick void *uap; 59*52136Smckusick int *retval; 60*52136Smckusick { 61*52136Smckusick int error = 0; 62*52136Smckusick #ifdef notdef 63*52136Smckusick register int *argp = uap; 64*52136Smckusick extern char *ultrixsyscallnames[]; 65*52136Smckusick 66*52136Smckusick printf("ULTRIX %s(", ultrixsyscallnames[code]); 67*52136Smckusick if (nargs) 68*52136Smckusick while (nargs--) 69*52136Smckusick printf("%x%c", *argp++, nargs? ',' : ')'); 70*52136Smckusick else 71*52136Smckusick printf(")"); 72*52136Smckusick printf("\n"); 73*52136Smckusick switch (unimpresponse) { 74*52136Smckusick case 0: 75*52136Smckusick error = nosys(p, uap, retval); 76*52136Smckusick break; 77*52136Smckusick case 1: 78*52136Smckusick error = EINVAL; 79*52136Smckusick break; 80*52136Smckusick } 81*52136Smckusick #else 82*52136Smckusick uprintf("ULTRIX system call %d not implemented\n", p->p_regs[V0]); 83*52136Smckusick error = nosys(p, uap, retval); 84*52136Smckusick #endif 85*52136Smckusick return (error); 86*52136Smckusick } 87*52136Smckusick 88*52136Smckusick ultrixwait3(p, uap, retval) 89*52136Smckusick struct proc *p; 90*52136Smckusick struct args { 91*52136Smckusick int *status; 92*52136Smckusick int options; 93*52136Smckusick int rusage; 94*52136Smckusick } *uap; 95*52136Smckusick int *retval; 96*52136Smckusick { 97*52136Smckusick struct { 98*52136Smckusick int pid; 99*52136Smckusick int *status; 100*52136Smckusick int options; 101*52136Smckusick struct rusage *rusage; 102*52136Smckusick int compat; 103*52136Smckusick } bsd_uap; 104*52136Smckusick 105*52136Smckusick /* rusage pointer must be zero */ 106*52136Smckusick if (uap->rusage) 107*52136Smckusick return (EINVAL); 108*52136Smckusick bsd_uap.pid = WAIT_ANY; 109*52136Smckusick bsd_uap.status = uap->status; 110*52136Smckusick bsd_uap.options = 0; 111*52136Smckusick bsd_uap.rusage = 0; 112*52136Smckusick bsd_uap.compat = 0; 113*52136Smckusick return (wait1(p, &bsd_uap, retval)); 114*52136Smckusick } 115*52136Smckusick 116*52136Smckusick ultrixgetdomainname(p, uap, retval) 117*52136Smckusick struct proc *p; 118*52136Smckusick register struct args { 119*52136Smckusick char *domainname; 120*52136Smckusick u_int len; 121*52136Smckusick } *uap; 122*52136Smckusick int *retval; 123*52136Smckusick { 124*52136Smckusick if (uap->len > domainnamelen + 1) 125*52136Smckusick uap->len = domainnamelen + 1; 126*52136Smckusick return (copyout(domainname, uap->domainname, uap->len)); 127*52136Smckusick } 128*52136Smckusick 129*52136Smckusick ultrixsetdomainname(p, uap, retval) 130*52136Smckusick struct proc *p; 131*52136Smckusick register struct args { 132*52136Smckusick char *domainname; 133*52136Smckusick u_int len; 134*52136Smckusick } *uap; 135*52136Smckusick int *retval; 136*52136Smckusick { 137*52136Smckusick int error; 138*52136Smckusick 139*52136Smckusick if (error = suser(p->p_ucred, &p->p_acflag)) 140*52136Smckusick return (error); 141*52136Smckusick if (uap->len > sizeof (domainname) - 1) 142*52136Smckusick return (EINVAL); 143*52136Smckusick domainnamelen = uap->len; 144*52136Smckusick error = copyin(uap->domainname, domainname, uap->len); 145*52136Smckusick domainname[domainnamelen] = 0; 146*52136Smckusick return (error); 147*52136Smckusick } 148*52136Smckusick 149*52136Smckusick /* 150*52136Smckusick * This is the equivalent of BSD getpgrp but with more restrictions. 151*52136Smckusick * Note we do not check the real uid or "saved" uid. 152*52136Smckusick */ 153*52136Smckusick ultrixgetpgrp(cp, uap, retval) 154*52136Smckusick struct proc *cp; 155*52136Smckusick register struct args { 156*52136Smckusick int pid; 157*52136Smckusick } *uap; 158*52136Smckusick int *retval; 159*52136Smckusick { 160*52136Smckusick register struct proc *p; 161*52136Smckusick 162*52136Smckusick if (uap->pid == 0) 163*52136Smckusick uap->pid = cp->p_pid; 164*52136Smckusick p = pfind(uap->pid); 165*52136Smckusick if (p == 0) 166*52136Smckusick return (ESRCH); 167*52136Smckusick if (cp->p_ucred->cr_uid && p->p_ucred->cr_uid != cp->p_ucred->cr_uid && 168*52136Smckusick !inferior(p)) 169*52136Smckusick return (EPERM); 170*52136Smckusick *retval = p->p_pgid; 171*52136Smckusick return (0); 172*52136Smckusick } 173*52136Smckusick 174*52136Smckusick /* 175*52136Smckusick * This is the equivalent of BSD setpgrp but with more restrictions. 176*52136Smckusick * Note we do not check the real uid or "saved" uid or pgrp. 177*52136Smckusick */ 178*52136Smckusick ultrixsetpgrp(p, uap, retval) 179*52136Smckusick struct proc *p; 180*52136Smckusick struct args { 181*52136Smckusick int pid; 182*52136Smckusick int pgrp; 183*52136Smckusick } *uap; 184*52136Smckusick int *retval; 185*52136Smckusick { 186*52136Smckusick /* empirically determined */ 187*52136Smckusick if (uap->pgrp < 0 || uap->pgrp >= 30000) 188*52136Smckusick return (EINVAL); 189*52136Smckusick return (setpgid(p, uap, retval)); 190*52136Smckusick } 191*52136Smckusick 192*52136Smckusick ultrixsigvec(p, uap, retval) 193*52136Smckusick struct proc *p; 194*52136Smckusick register struct args { 195*52136Smckusick int signo; 196*52136Smckusick struct sigvec *nsv; 197*52136Smckusick struct sigvec *osv; 198*52136Smckusick caddr_t sigcode; /* handler return address */ 199*52136Smckusick } *uap; 200*52136Smckusick int *retval; 201*52136Smckusick { 202*52136Smckusick return (osigvec(p, uap, retval)); 203*52136Smckusick } 204*52136Smckusick 205*52136Smckusick ultrixsigcleanup(p, uap, retval) 206*52136Smckusick struct proc *p; 207*52136Smckusick void *uap; 208*52136Smckusick int *retval; 209*52136Smckusick { 210*52136Smckusick printf("ultrixsigcleanup %s %d\n", p->p_comm, p->p_pid); /* XXX */ 211*52136Smckusick return (ENOSYS); 212*52136Smckusick } 213*52136Smckusick 214*52136Smckusick ultrixsigreturn(p, uap, retval) 215*52136Smckusick struct proc *p; 216*52136Smckusick void *uap; 217*52136Smckusick int *retval; 218*52136Smckusick { 219*52136Smckusick printf("ultrixsigreturn %s %d\n", p->p_comm, p->p_pid); /* XXX */ 220*52136Smckusick return (ENOSYS); 221*52136Smckusick } 222*52136Smckusick 223*52136Smckusick /* 224*52136Smckusick * Switch process from ULTRIX emulation to BSD. 225*52136Smckusick */ 226*52136Smckusick ultrixtobsd(p, uap, retval) 227*52136Smckusick struct proc *p; 228*52136Smckusick void *uap; 229*52136Smckusick int *retval; 230*52136Smckusick { 231*52136Smckusick 232*52136Smckusick p->p_md.md_flags &= ~MDP_ULTRIX; 233*52136Smckusick return (0); 234*52136Smckusick } 235*52136Smckusick 236*52136Smckusick ultrixgetsysinfo(p, uap, retval) 237*52136Smckusick struct proc *p; 238*52136Smckusick void *uap; 239*52136Smckusick int *retval; 240*52136Smckusick { 241*52136Smckusick 242*52136Smckusick /* 243*52136Smckusick * Just return a 0. This says that the requested information is 244*52136Smckusick * not available which is certainly true for the most part. 245*52136Smckusick */ 246*52136Smckusick retval[0] = 0; 247*52136Smckusick return (0); 248*52136Smckusick } 249*52136Smckusick 250*52136Smckusick #endif 251