xref: /csrg-svn/sys/kern/kern_xxx.c (revision 12883)
1 /*	kern_xxx.c	4.3	83/06/02	*/
2 
3 #include "../h/param.h"
4 #include "../h/systm.h"
5 #include "../h/dir.h"
6 #include "../h/user.h"
7 #include "../h/kernel.h"
8 #include "../h/proc.h"
9 #include "../h/reboot.h"
10 
11 gethostid()
12 {
13 
14 	u.u_r.r_val1 = hostid;
15 }
16 
17 sethostid()
18 {
19 	struct a {
20 		int	hostid;
21 	} *uap = (struct a *)u.u_ap;
22 
23 	if (suser())
24 		hostid = uap->hostid;
25 }
26 
27 gethostname()
28 {
29 	register struct a {
30 		char	*hostname;
31 		int	len;
32 	} *uap = (struct a *)u.u_ap;
33 	register u_int len;
34 
35 	len = uap->len;
36 	if (len > hostnamelen + 1)
37 		len = hostnamelen + 1;
38 	u.u_error = copyout((caddr_t)hostname, (caddr_t)uap->hostname, len);
39 }
40 
41 sethostname()
42 {
43 	register struct a {
44 		char	*hostname;
45 		u_int	len;
46 	} *uap = (struct a *)u.u_ap;
47 
48 	if (!suser())
49 		return;
50 	if (uap->len > sizeof (hostname) - 1) {
51 		u.u_error = EINVAL;
52 		return;
53 	}
54 	hostnamelen = uap->len;
55 	u.u_error = copyin((caddr_t)uap->hostname, hostname, uap->len);
56 	hostname[hostnamelen] = 0;
57 }
58 
59 reboot()
60 {
61 	register struct a {
62 		int	opt;
63 	};
64 
65 	if (suser())
66 		boot(RB_BOOT, ((struct a *)u.u_ap)->opt);
67 }
68 
69 #ifndef NOCOMPAT
70 #include "../h/quota.h"
71 
72 osetuid()
73 {
74 	register uid;
75 	register struct a {
76 		int	uid;
77 	} *uap;
78 
79 	uap = (struct a *)u.u_ap;
80 	uid = uap->uid;
81 	if (u.u_ruid == uid || u.u_uid == uid || suser()) {
82 #ifdef QUOTA
83 		if (u.u_quota->q_uid != uid) {
84 			qclean();
85 			qstart(getquota(uid, 0, 0));
86 		}
87 #endif
88 		u.u_uid = uid;
89 		u.u_procp->p_uid = uid;
90 		u.u_ruid = uid;
91 	}
92 }
93 
94 osetgid()
95 {
96 	register gid;
97 	register struct a {
98 		int	gid;
99 	} *uap;
100 
101 	uap = (struct a *)u.u_ap;
102 	gid = uap->gid;
103 	if (u.u_rgid == gid || u.u_gid == gid || suser()) {
104 		leavegroup(u.u_rgid);
105 		(void) entergroup(gid);
106 		u.u_gid = gid;
107 		u.u_rgid = gid;
108 	}
109 }
110 
111 /*
112  * Pid of zero implies current process.
113  * Pgrp -1 is getpgrp system call returning
114  * current process group.
115  */
116 osetpgrp()
117 {
118 	register struct proc *p;
119 	register struct a {
120 		int	pid;
121 		int	pgrp;
122 	} *uap;
123 
124 	uap = (struct a *)u.u_ap;
125 	if (uap->pid == 0)
126 		p = u.u_procp;
127 	else {
128 		p = pfind(uap->pid);
129 		if (p == 0) {
130 			u.u_error = ESRCH;
131 			return;
132 		}
133 	}
134 	if (uap->pgrp <= 0) {
135 		u.u_r.r_val1 = p->p_pgrp;
136 		return;
137 	}
138 	if (p->p_uid != u.u_uid && u.u_uid && !inferior(p)) {
139 		u.u_error = EPERM;
140 		return;
141 	}
142 	p->p_pgrp = uap->pgrp;
143 }
144 
145 otime()
146 {
147 
148 	u.u_r.r_time = time.tv_sec;
149 }
150 
151 ostime()
152 {
153 	register struct a {
154 		int	time;
155 	} *uap = (struct a *)u.u_ap;
156 	struct timeval tv;
157 
158 	tv.tv_sec = uap->time;
159 	tv.tv_usec = 0;
160 	setthetime(&tv);
161 }
162 
163 /* from old timeb.h */
164 struct timeb {
165 	time_t	time;
166 	u_short	millitm;
167 	short	timezone;
168 	short	dstflag;
169 };
170 
171 oftime()
172 {
173 	register struct a {
174 		struct	timeb	*tp;
175 	} *uap;
176 	struct timeb tb;
177 
178 	uap = (struct a *)u.u_ap;
179 	(void) spl7();
180 	tb.time = time.tv_sec;
181 	tb.millitm = time.tv_usec / 1000;
182 	(void) spl0();
183 	tb.timezone = tz.tz_minuteswest;
184 	tb.dstflag = tz.tz_dsttime;
185 	u.u_error = copyout((caddr_t)&tb, (caddr_t)uap->tp, sizeof (tb));
186 }
187 
188 oalarm()
189 {
190 	register struct a {
191 		int	deltat;
192 	} *uap = (struct a *)u.u_ap;
193 	register struct proc *p = u.u_procp;
194 	int s = spl7();
195 
196 	untimeout(realitexpire, (caddr_t)p);
197 	timerclear(&p->p_realtimer.it_interval);
198 	u.u_r.r_val1 = 0;
199 	if (timerisset(&p->p_realtimer.it_value) &&
200 	    timercmp(&p->p_realtimer.it_value, &time, >))
201 		u.u_r.r_val1 = p->p_realtimer.it_value.tv_sec - time.tv_sec;
202 	if (uap->deltat == 0) {
203 		timerclear(&p->p_realtimer.it_value);
204 		splx(s);
205 		return;
206 	}
207 	p->p_realtimer.it_value = time;
208 	p->p_realtimer.it_value.tv_sec += uap->deltat;
209 	timeout(realitexpire, (caddr_t)p, hzto(&p->p_realtimer.it_value));
210 	splx(s);
211 }
212 
213 onice()
214 {
215 	register struct a {
216 		int	niceness;
217 	} *uap = (struct a *)u.u_ap;
218 	register struct proc *p = u.u_procp;
219 
220 	donice(p, (p->p_nice-NZERO)+uap->niceness);
221 }
222 
223 #include "../h/times.h"
224 
225 otimes()
226 {
227 	register struct a {
228 		struct	tms *tmsb;
229 	} *uap = (struct a *)u.u_ap;
230 	struct tms atms;
231 
232 	atms.tms_utime = scale60(&u.u_ru.ru_utime);
233 	atms.tms_stime = scale60(&u.u_ru.ru_stime);
234 	atms.tms_cutime = scale60(&u.u_cru.ru_utime);
235 	atms.tms_cstime = scale60(&u.u_cru.ru_stime);
236 	u.u_error = copyout((caddr_t)&atms, (caddr_t)uap->tmsb, sizeof (atms));
237 }
238 
239 scale60(tvp)
240 	register struct timeval *tvp;
241 {
242 
243 	return (tvp->tv_sec * 60 + tvp->tv_usec / 16667);
244 }
245 
246 #include "../h/vtimes.h"
247 
248 ovtimes()
249 {
250 	register struct a {
251 		struct	vtimes *par;
252 		struct	vtimes *chi;
253 	} *uap = (struct a *)u.u_ap;
254 	struct vtimes avt;
255 
256 	if (uap->par) {
257 		getvtimes(&u.u_ru, &avt);
258 		u.u_error = copyout((caddr_t)&avt, (caddr_t)uap->par,
259 			sizeof (avt));
260 		if (u.u_error)
261 			return;
262 	}
263 	if (uap->chi) {
264 		getvtimes(&u.u_cru, &avt);
265 		u.u_error = copyout((caddr_t)&avt, (caddr_t)uap->chi,
266 			sizeof (avt));
267 		if (u.u_error)
268 			return;
269 	}
270 }
271 
272 #include "../machine/psl.h"
273 #include "../machine/reg.h"
274 
275 owait()
276 {
277 	struct rusage ru;
278 	struct vtimes *vtp, avt;
279 
280 	if ((u.u_ar0[PS] & PSL_ALLCC) != PSL_ALLCC) {
281 		u.u_error = wait1(0, (struct rusage *)0);
282 		return;
283 	}
284 	vtp = (struct vtimes *)u.u_ar0[R1];
285 	u.u_error = wait1(u.u_ar0[R0], &ru);
286 	if (u.u_error)
287 		return;
288 	getvtimes(&ru, &avt);
289 	(void) copyout((caddr_t)&avt, (caddr_t)vtp, sizeof (struct vtimes));
290 }
291 
292 getvtimes(aru, avt)
293 	register struct rusage *aru;
294 	register struct vtimes *avt;
295 {
296 
297 	avt->vm_utime = scale60(&aru->ru_utime);
298 	avt->vm_stime = scale60(&aru->ru_stime);
299 	avt->vm_idsrss = ((aru->ru_idrss+aru->ru_isrss) / hz) * 60;
300 	avt->vm_ixrss = aru->ru_ixrss / hz * 60;
301 	avt->vm_maxrss = aru->ru_maxrss;
302 	avt->vm_majflt = aru->ru_majflt;
303 	avt->vm_minflt = aru->ru_minflt;
304 	avt->vm_nswap = aru->ru_nswap;
305 	avt->vm_inblk = aru->ru_inblock;
306 	avt->vm_oublk = aru->ru_oublock;
307 }
308 
309 ovlimit()
310 {
311 
312 	u.u_error = EACCES;
313 }
314 
315 okill()
316 {
317 	register struct a {
318 		int	pid;
319 		int	signo;
320 	} *uap = (struct a *)u.u_ap;
321 
322 	u.u_error = kill1(uap->signo < 0,
323 		uap->signo < 0 ? -uap->signo : uap->signo, uap->pid);
324 }
325 
326 ossig()
327 {
328 	struct a {
329 		int	signo;
330 		int	(*fun)();
331 	} *uap = (struct a *)u.u_ap;
332 	register int a, (*f)();
333 	struct proc *p = u.u_procp;
334 
335 	f = uap->fun;
336 	a = uap->signo;
337 	/*
338 	 * Kill processes trying to use job control facilities
339 	 * (this'll help us find any vestiges of the old stuff).
340 	 */
341 	if ((a &~ 0377) ||
342 	    (f != SIG_DFL && f != SIG_IGN && ((int)f) & 1)) {
343 		psignal(p, SIGSYS);
344 		return;
345 	}
346 	if (a <= 0 || a >= NSIG || a == SIGKILL || a == SIGSTOP ||
347 	    a == SIGCONT && (f == SIG_IGN || f == SIG_HOLD)) {
348 		u.u_error = EINVAL;
349 		return;
350 	}
351 	setsignal(a, f, 0);
352 	p->p_flag |= SOUSIG;		/* mark as simulating old stuff */
353 }
354 #endif
355