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