header file changes; still wont work (interface to socket code)
[unix-history] / usr / src / sys / kern / kern_prot.c
CommitLineData
5a1f132a 1/* kern_prot.c 5.10 82/10/20 */
a05af100
BJ
2
3/*
4147b3f6 4 * System calls related to processes and protection
a05af100
BJ
5 */
6
7#include "../h/param.h"
8#include "../h/systm.h"
9#include "../h/dir.h"
10#include "../h/user.h"
11#include "../h/reg.h"
12#include "../h/inode.h"
13#include "../h/proc.h"
a05af100
BJ
14#include "../h/timeb.h"
15#include "../h/times.h"
16#include "../h/reboot.h"
17#include "../h/fs.h"
18#include "../h/conf.h"
19#include "../h/buf.h"
20#include "../h/mount.h"
57e12479 21#include "../h/quota.h"
a05af100 22
4147b3f6
BJ
23getpid()
24{
25
26 u.u_r.r_val1 = u.u_procp->p_pid;
27 u.u_r.r_val2 = u.u_procp->p_ppid;
28}
29
30getpgrp()
31{
32 register struct a {
33 int pid;
34 } *uap = (struct a *)u.u_ap;
35 register struct proc *p;
36
37 if (uap->pid == 0)
38 uap->pid = u.u_procp->p_pid;
39 p = pfind(uap->pid);
40 if (p == 0) {
41 u.u_error = ESRCH;
42 return;
43 }
44 u.u_r.r_val1 = p->p_pgrp;
45}
46
a05af100
BJ
47getuid()
48{
49
50 u.u_r.r_val1 = u.u_ruid;
51 u.u_r.r_val2 = u.u_uid;
52}
53
4147b3f6
BJ
54getgid()
55{
56
57 u.u_r.r_val1 = u.u_rgid;
58 u.u_r.r_val2 = u.u_gid;
59}
60
197da11b 61getgroups()
4147b3f6
BJ
62{
63 register struct a {
b32450f4 64 u_int gidsetsize;
4147b3f6
BJ
65 int *gidset;
66 } *uap = (struct a *)u.u_ap;
197da11b 67 register int *gp;
4147b3f6 68
197da11b
BJ
69 for (gp = &u.u_groups[NGROUPS]; gp > u.u_groups; gp--)
70 if (gp[-1] >= 0)
71 break;
72 if (uap->gidsetsize < gp - u.u_groups) {
73 u.u_error = EINVAL;
74 return;
75 }
76 uap->gidsetsize = gp - u.u_groups;
77 if (copyout((caddr_t)u.u_groups, (caddr_t)uap->gidset,
78 uap->gidsetsize * sizeof (u.u_groups[0]))) {
4147b3f6
BJ
79 u.u_error = EFAULT;
80 return;
81 }
197da11b 82 u.u_r.r_val1 = uap->gidsetsize;
4147b3f6
BJ
83}
84
85setpgrp()
86{
87 register struct proc *p;
88 register struct a {
89 int pid;
90 int pgrp;
91 } *uap = (struct a *)u.u_ap;
92
93 if (uap->pid == 0)
94 uap->pid = u.u_procp->p_pid;
95 p = pfind(uap->pid);
96 if (p == 0) {
97 u.u_error = ESRCH;
98 return;
99 }
197da11b 100/* need better control mechanisms for process groups */
4147b3f6
BJ
101 if (p->p_uid != u.u_uid && u.u_uid && !inferior(p)) {
102 u.u_error = EPERM;
103 return;
104 }
105 p->p_pgrp = uap->pgrp;
106}
107
a05af100
BJ
108setuid()
109{
110 register uid;
111 register struct a {
112 int uid;
113 } *uap;
114
115 uap = (struct a *)u.u_ap;
116 uid = uap->uid;
117 if (u.u_ruid == uid || u.u_uid == uid || suser()) {
57e12479
RE
118#ifdef QUOTA
119 if (u.u_quota->q_uid != uid) {
120 qclean();
121 qstart(getquota(uid, 0, 0));
122 }
123#endif
a05af100
BJ
124 u.u_uid = uid;
125 u.u_procp->p_uid = uid;
126 u.u_ruid = uid;
127 }
128}
129
a05af100
BJ
130setgid()
131{
132 register gid;
133 register struct a {
134 int gid;
135 } *uap;
136
137 uap = (struct a *)u.u_ap;
138 gid = uap->gid;
139 if (u.u_rgid == gid || u.u_gid == gid || suser()) {
197da11b
BJ
140 leavegroup(u.u_gid); leavegroup(u.u_rgid);
141 (void) entergroup(gid);
a05af100
BJ
142 u.u_gid = gid;
143 u.u_rgid = gid;
144 }
145}
4147b3f6 146
197da11b 147setgroups()
4147b3f6
BJ
148{
149 register struct a {
b32450f4 150 u_int gidsetsize;
4147b3f6
BJ
151 int *gidset;
152 } *uap = (struct a *)u.u_ap;
197da11b 153 register int *gp;
4147b3f6 154
1edb1cf8 155 if (!suser())
4147b3f6 156 return;
197da11b
BJ
157 if (uap->gidsetsize > sizeof (u.u_groups) / sizeof (u.u_groups[0])) {
158 u.u_error = EINVAL;
4147b3f6
BJ
159 return;
160 }
197da11b
BJ
161 if (copyin((caddr_t)uap->gidset, (caddr_t)u.u_groups,
162 uap->gidsetsize * sizeof (u.u_groups[0]))) {
4147b3f6
BJ
163 u.u_error = EFAULT;
164 return;
165 }
197da11b
BJ
166 for (gp = &u.u_groups[uap->gidsetsize]; gp < &u.u_groups[NGROUPS]; gp++)
167 *gp = -1;
4147b3f6
BJ
168}
169
170/*
171 * Pid of zero implies current process.
172 * Pgrp -1 is getpgrp system call returning
173 * current process group.
174 */
175osetpgrp()
176{
177 register struct proc *p;
178 register struct a {
179 int pid;
180 int pgrp;
181 } *uap;
182
183 uap = (struct a *)u.u_ap;
184 if (uap->pid == 0)
185 p = u.u_procp;
186 else {
187 p = pfind(uap->pid);
188 if (p == 0) {
189 u.u_error = ESRCH;
190 return;
191 }
192 }
193 if (uap->pgrp <= 0) {
194 u.u_r.r_val1 = p->p_pgrp;
195 return;
196 }
197 if (p->p_uid != u.u_uid && u.u_uid && !inferior(p)) {
198 u.u_error = EPERM;
199 return;
200 }
201 p->p_pgrp = uap->pgrp;
202}
203/* END DEFUNCT */
197da11b
BJ
204
205leavegroup(gid)
206 int gid;
207{
208 register int *gp;
209
210 for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++)
211 if (*gp == gid)
212 goto found;
213 return;
214found:
215 for (; gp < &u.u_groups[NGROUPS-1]; gp++)
216 *gp = *(gp+1);
b724ad1f 217 *gp = -1;
197da11b
BJ
218}
219
220entergroup(gid)
221 int gid;
222{
223 register int *gp;
224
225 for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++)
226 if (*gp == gid)
227 return (0);
228 for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++)
229 if (*gp < 0) {
230 *gp = gid;
231 return (0);
232 }
233 return (-1);
234}