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*53064Sralph  *	@(#)ultrix_compat.c	7.2 (Berkeley) 03/28/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
82*53064Sralph 	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 
8852136Smckusick ultrixwait3(p, uap, retval)
8952136Smckusick 	struct proc *p;
9052136Smckusick 	struct args {
9152136Smckusick 		int	*status;
9252136Smckusick 		int	options;
9352136Smckusick 		int	rusage;
9452136Smckusick 	} *uap;
9552136Smckusick 	int *retval;
9652136Smckusick {
9752136Smckusick 	struct {
9852136Smckusick 		int	pid;
9952136Smckusick 		int	*status;
10052136Smckusick 		int	options;
10152136Smckusick 		struct	rusage *rusage;
10252136Smckusick 		int	compat;
10352136Smckusick 	} bsd_uap;
10452136Smckusick 
10552136Smckusick 	/* rusage pointer must be zero */
10652136Smckusick 	if (uap->rusage)
10752136Smckusick 		return (EINVAL);
10852136Smckusick 	bsd_uap.pid = WAIT_ANY;
10952136Smckusick 	bsd_uap.status = uap->status;
11052136Smckusick 	bsd_uap.options = 0;
11152136Smckusick 	bsd_uap.rusage = 0;
11252136Smckusick 	bsd_uap.compat = 0;
11352136Smckusick 	return (wait1(p, &bsd_uap, retval));
11452136Smckusick }
11552136Smckusick 
11652136Smckusick ultrixgetdomainname(p, uap, retval)
11752136Smckusick 	struct proc *p;
11852136Smckusick 	register struct args {
11952136Smckusick 		char	*domainname;
12052136Smckusick 		u_int	len;
12152136Smckusick 	} *uap;
12252136Smckusick 	int *retval;
12352136Smckusick {
12452136Smckusick 	if (uap->len > domainnamelen + 1)
12552136Smckusick 		uap->len = domainnamelen + 1;
12652136Smckusick 	return (copyout(domainname, uap->domainname, uap->len));
12752136Smckusick }
12852136Smckusick 
12952136Smckusick ultrixsetdomainname(p, uap, retval)
13052136Smckusick 	struct proc *p;
13152136Smckusick 	register struct args {
13252136Smckusick 		char	*domainname;
13352136Smckusick 		u_int	len;
13452136Smckusick 	} *uap;
13552136Smckusick 	int *retval;
13652136Smckusick {
13752136Smckusick 	int error;
13852136Smckusick 
13952136Smckusick 	if (error = suser(p->p_ucred, &p->p_acflag))
14052136Smckusick 		return (error);
14152136Smckusick 	if (uap->len > sizeof (domainname) - 1)
14252136Smckusick 		return (EINVAL);
14352136Smckusick 	domainnamelen = uap->len;
14452136Smckusick 	error = copyin(uap->domainname, domainname, uap->len);
14552136Smckusick 	domainname[domainnamelen] = 0;
14652136Smckusick 	return (error);
14752136Smckusick }
14852136Smckusick 
14952136Smckusick /*
15052136Smckusick  * This is the equivalent of BSD getpgrp but with more restrictions.
15152136Smckusick  * Note we do not check the real uid or "saved" uid.
15252136Smckusick  */
15352136Smckusick ultrixgetpgrp(cp, uap, retval)
15452136Smckusick 	struct proc *cp;
15552136Smckusick 	register struct args {
15652136Smckusick 		int pid;
15752136Smckusick 	} *uap;
15852136Smckusick 	int *retval;
15952136Smckusick {
16052136Smckusick 	register struct proc *p;
16152136Smckusick 
16252136Smckusick 	if (uap->pid == 0)
16352136Smckusick 		uap->pid = cp->p_pid;
16452136Smckusick 	p = pfind(uap->pid);
16552136Smckusick 	if (p == 0)
16652136Smckusick 		return (ESRCH);
16752136Smckusick 	if (cp->p_ucred->cr_uid && p->p_ucred->cr_uid != cp->p_ucred->cr_uid &&
16852136Smckusick 	    !inferior(p))
16952136Smckusick 		return (EPERM);
17052136Smckusick 	*retval = p->p_pgid;
17152136Smckusick 	return (0);
17252136Smckusick }
17352136Smckusick 
17452136Smckusick /*
17552136Smckusick  * This is the equivalent of BSD setpgrp but with more restrictions.
17652136Smckusick  * Note we do not check the real uid or "saved" uid or pgrp.
17752136Smckusick  */
17852136Smckusick ultrixsetpgrp(p, uap, retval)
17952136Smckusick 	struct proc *p;
18052136Smckusick 	struct args {
18152136Smckusick 		int	pid;
18252136Smckusick 		int	pgrp;
18352136Smckusick 	} *uap;
18452136Smckusick 	int *retval;
18552136Smckusick {
18652136Smckusick 	/* empirically determined */
18752136Smckusick 	if (uap->pgrp < 0 || uap->pgrp >= 30000)
18852136Smckusick 		return (EINVAL);
18952136Smckusick 	return (setpgid(p, uap, retval));
19052136Smckusick }
19152136Smckusick 
19252136Smckusick ultrixsigvec(p, uap, retval)
19352136Smckusick 	struct proc *p;
19452136Smckusick 	register struct args {
19552136Smckusick 		int	signo;
19652136Smckusick 		struct	sigvec *nsv;
19752136Smckusick 		struct	sigvec *osv;
19852136Smckusick 		caddr_t	sigcode;	/* handler return address */
19952136Smckusick 	} *uap;
20052136Smckusick 	int *retval;
20152136Smckusick {
20252136Smckusick 	return (osigvec(p, uap, retval));
20352136Smckusick }
20452136Smckusick 
20552136Smckusick ultrixsigcleanup(p, uap, retval)
20652136Smckusick 	struct proc *p;
20752136Smckusick 	void *uap;
20852136Smckusick 	int *retval;
20952136Smckusick {
21052136Smckusick 	printf("ultrixsigcleanup %s %d\n", p->p_comm, p->p_pid); /* XXX */
21152136Smckusick 	return (ENOSYS);
21252136Smckusick }
21352136Smckusick 
21452136Smckusick ultrixsigreturn(p, uap, retval)
21552136Smckusick 	struct proc *p;
21652136Smckusick 	void *uap;
21752136Smckusick 	int *retval;
21852136Smckusick {
21952136Smckusick 	printf("ultrixsigreturn %s %d\n", p->p_comm, p->p_pid); /* XXX */
22052136Smckusick 	return (ENOSYS);
22152136Smckusick }
22252136Smckusick 
22352136Smckusick /*
22452136Smckusick  * Switch process from ULTRIX emulation to BSD.
22552136Smckusick  */
22652136Smckusick ultrixtobsd(p, uap, retval)
22752136Smckusick 	struct proc *p;
22852136Smckusick 	void *uap;
22952136Smckusick 	int *retval;
23052136Smckusick {
23152136Smckusick 
23252136Smckusick 	p->p_md.md_flags &= ~MDP_ULTRIX;
23352136Smckusick 	return (0);
23452136Smckusick }
23552136Smckusick 
23652136Smckusick ultrixgetsysinfo(p, uap, retval)
23752136Smckusick 	struct proc *p;
23852136Smckusick 	void *uap;
23952136Smckusick 	int *retval;
24052136Smckusick {
24152136Smckusick 
24252136Smckusick 	/*
24352136Smckusick 	 * Just return a 0.  This says that the requested information is
24452136Smckusick 	 * not available which is certainly true for the most part.
24552136Smckusick 	 */
24652136Smckusick 	retval[0] = 0;
24752136Smckusick 	return (0);
24852136Smckusick }
24952136Smckusick 
25052136Smckusick #endif
251