152136Smckusick /* 252136Smckusick * Copyright (c) 1988 University of Utah. 3*63229Sbostic * Copyright (c) 1990, 1993 4*63229Sbostic * The Regents of the University of California. 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*63229Sbostic * @(#)ultrix_compat.c 8.1 (Berkeley) 06/10/93 1552136Smckusick */ 1652136Smckusick 1752136Smckusick /* 1852136Smckusick * Various ULTRIX compatibility routines 1952136Smckusick */ 2052136Smckusick 2152136Smckusick #ifdef ULTRIXCOMPAT 2252136Smckusick 2356527Sbostic #include <sys/param.h> 2456527Sbostic #include <sys/systm.h> 2556527Sbostic #include <sys/signalvar.h> 2656527Sbostic #include <sys/kernel.h> 2756527Sbostic #include <sys/filedesc.h> 2856527Sbostic #include <sys/proc.h> 2956527Sbostic #include <sys/buf.h> 3056527Sbostic #include <sys/wait.h> 3156527Sbostic #include <sys/file.h> 3256527Sbostic #include <sys/namei.h> 3356527Sbostic #include <sys/vnode.h> 3456527Sbostic #include <sys/ioctl.h> 3556527Sbostic #include <sys/ptrace.h> 3656527Sbostic #include <sys/stat.h> 3756527Sbostic #include <sys/syslog.h> 3856527Sbostic #include <sys/malloc.h> 3956527Sbostic #include <sys/mount.h> 4056527Sbostic #include <sys/ipc.h> 4156527Sbostic #include <sys/user.h> 4252136Smckusick 4356527Sbostic #include <machine/cpu.h> 4456527Sbostic #include <machine/reg.h> 4556527Sbostic #include <machine/psl.h> 4656527Sbostic #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 8856234Sralph struct wait3_args { 8956234Sralph int *status; 9056234Sralph int options; 9156234Sralph int rusage; 9256234Sralph }; 9356234Sralph 9452136Smckusick ultrixwait3(p, uap, retval) 9552136Smckusick struct proc *p; 9656234Sralph 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 11856234Sralph struct domainname_args { 11956234Sralph char *domainname; 12056234Sralph u_int len; 12156234Sralph }; 12256234Sralph 12352136Smckusick ultrixgetdomainname(p, uap, retval) 12452136Smckusick struct proc *p; 12556234Sralph 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; 13556234Sralph 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 15056234Sralph struct getpgrp_args { 15156234Sralph int pid; 15256234Sralph }; 15356234Sralph 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; 16056234Sralph 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 17756234Sralph struct setpgrp_args { 17856234Sralph int pid; 17956234Sralph int pgrp; 18056234Sralph } *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; 18756234Sralph 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 19656234Sralph struct sigvec_args { 19756234Sralph int signo; 19856234Sralph struct sigvec *nsv; 19956234Sralph struct sigvec *osv; 20056234Sralph caddr_t sigcode; /* handler return address */ 20156234Sralph }; 20256234Sralph 20352136Smckusick ultrixsigvec(p, uap, retval) 20452136Smckusick struct proc *p; 20556234Sralph 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