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