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