1 /* kern_prot.c 5.3 82/07/24 */ 2 3 /* 4 * System calls related to processes and protection 5 */ 6 7 /* NEED ALLOCATION AND PROTECTION MECHANISM FOR PROCESS GROUPS */ 8 9 #include "../h/param.h" 10 #include "../h/systm.h" 11 #include "../h/dir.h" 12 #include "../h/user.h" 13 #include "../h/reg.h" 14 #include "../h/inode.h" 15 #include "../h/proc.h" 16 #include "../h/clock.h" 17 #include "../h/mtpr.h" 18 #include "../h/timeb.h" 19 #include "../h/times.h" 20 #include "../h/reboot.h" 21 #include "../h/fs.h" 22 #include "../h/conf.h" 23 #include "../h/buf.h" 24 #include "../h/mount.h" 25 #include "../h/quota.h" 26 27 getpid() 28 { 29 30 u.u_r.r_val1 = u.u_procp->p_pid; 31 u.u_r.r_val2 = u.u_procp->p_ppid; 32 } 33 34 getpgrp() 35 { 36 register struct a { 37 int pid; 38 } *uap = (struct a *)u.u_ap; 39 register struct proc *p; 40 41 if (uap->pid == 0) 42 uap->pid = u.u_procp->p_pid; 43 p = pfind(uap->pid); 44 if (p == 0) { 45 u.u_error = ESRCH; 46 return; 47 } 48 u.u_r.r_val1 = p->p_pgrp; 49 } 50 51 getuid() 52 { 53 54 u.u_r.r_val1 = u.u_ruid; 55 u.u_r.r_val2 = u.u_uid; 56 } 57 58 getgid() 59 { 60 61 u.u_r.r_val1 = u.u_rgid; 62 u.u_r.r_val2 = u.u_gid; 63 } 64 65 getgrp() 66 { 67 register struct a { 68 int *gidset; 69 } *uap = (struct a *)u.u_ap; 70 71 if (copyout((caddr_t)u.u_grps, (caddr_t)uap->gidset, 72 sizeof (u.u_grps))) { 73 u.u_error = EFAULT; 74 return; 75 } 76 } 77 78 setpgrp() 79 { 80 register struct proc *p; 81 register struct a { 82 int pid; 83 int pgrp; 84 } *uap = (struct a *)u.u_ap; 85 86 if (uap->pid == 0) 87 uap->pid = u.u_procp->p_pid; 88 p = pfind(uap->pid); 89 if (p == 0) { 90 u.u_error = ESRCH; 91 return; 92 } 93 if (p->p_uid != u.u_uid && u.u_uid && !inferior(p)) { 94 u.u_error = EPERM; 95 return; 96 } 97 p->p_pgrp = uap->pgrp; 98 } 99 100 setuid() 101 { 102 register uid; 103 register struct a { 104 int uid; 105 } *uap; 106 107 uap = (struct a *)u.u_ap; 108 uid = uap->uid; 109 if (u.u_ruid == uid || u.u_uid == uid || suser()) { 110 #ifdef QUOTA 111 if (u.u_quota->q_uid != uid) { 112 qclean(); 113 qstart(getquota(uid, 0, 0)); 114 } 115 #endif 116 u.u_uid = uid; 117 u.u_procp->p_uid = uid; 118 u.u_ruid = uid; 119 } 120 } 121 122 setgid() 123 { 124 register gid; 125 register struct a { 126 int gid; 127 } *uap; 128 129 uap = (struct a *)u.u_ap; 130 gid = uap->gid; 131 if (u.u_rgid == gid || u.u_gid == gid || suser()) { 132 u.u_gid = gid; 133 u.u_rgid = gid; 134 } 135 } 136 137 setgrp() 138 { 139 register struct a { 140 int *gidset; 141 } *uap = (struct a *)u.u_ap; 142 143 if (suser()) 144 return; 145 if (copyin((caddr_t)uap->gidset, (caddr_t)u.u_grps, 146 sizeof (u.u_grps))) { 147 u.u_error = EFAULT; 148 return; 149 } 150 } 151 152 /* BEGIN DEFUNCT */ 153 osetgrp() 154 { 155 register struct a { 156 int *ngrps; 157 int *ogrps; 158 } *uap = (struct a *)u.u_ap; 159 int thegroups[NGRPS/(sizeof(int)*8)]; 160 161 if (uap->ogrps && copyout((caddr_t)u.u_grps, (caddr_t)uap->ogrps, 162 sizeof (thegroups))) { 163 u.u_error = EFAULT; 164 return; 165 } 166 if (uap->ngrps == 0) 167 return; 168 if (copyin((caddr_t)uap->ngrps, (caddr_t)thegroups, 169 sizeof (thegroups))) { 170 u.u_error = EFAULT; 171 return; 172 } 173 if (suser()) 174 bcopy((caddr_t)thegroups, (caddr_t)u.u_grps, sizeof (u.u_grps)); 175 } 176 177 /* 178 * Pid of zero implies current process. 179 * Pgrp -1 is getpgrp system call returning 180 * current process group. 181 */ 182 osetpgrp() 183 { 184 register struct proc *p; 185 register struct a { 186 int pid; 187 int pgrp; 188 } *uap; 189 190 uap = (struct a *)u.u_ap; 191 if (uap->pid == 0) 192 p = u.u_procp; 193 else { 194 p = pfind(uap->pid); 195 if (p == 0) { 196 u.u_error = ESRCH; 197 return; 198 } 199 } 200 if (uap->pgrp <= 0) { 201 u.u_r.r_val1 = p->p_pgrp; 202 return; 203 } 204 if (p->p_uid != u.u_uid && u.u_uid && !inferior(p)) { 205 u.u_error = EPERM; 206 return; 207 } 208 p->p_pgrp = uap->pgrp; 209 } 210 /* END DEFUNCT */ 211