+ register struct proc *p;
+ register struct pgrp *pgrp;
+
+ if (uap->pid != 0) {
+ if ((p = pfind(uap->pid)) == 0 || !inferior(p))
+ return (ESRCH);
+ if (p->p_session != cp->p_session)
+ return (EPERM);
+ if (p->p_flag&SEXEC)
+ return (EACCES);
+ } else
+ p = cp;
+ if (SESS_LEADER(p))
+ return (EPERM);
+ if (uap->pgid == 0)
+ uap->pgid = p->p_pid;
+ else if ((uap->pgid != p->p_pid) &&
+ (((pgrp = pgfind(uap->pgid)) == 0) ||
+ pgrp->pg_mem == NULL ||
+ pgrp->pg_session != u.u_procp->p_session))
+ return (EPERM);
+ /*
+ * done checking, now do it
+ */
+ pgmv(p, uap->pgid, 0);
+ return (0);
+}
+
+/* ARGSUSED */
+setuid(p, uap, retval)
+ register struct proc *p;
+ struct args {
+ int uid;
+ } *uap;
+ int *retval;
+{
+ register uid_t uid;
+ int error;
+
+ uid = uap->uid;
+ if (uid != p->p_ruid && (error = suser(u.u_cred, &u.u_acflag)))
+ return (error);
+ /*
+ * Everything's okay, do it.
+ * Copy credentials so other references do not
+ * see our changes.
+ */
+ if (u.u_cred->cr_ref > 1)
+ u.u_cred = crcopy(u.u_cred);
+ u.u_cred->cr_uid = uid;
+ p->p_uid = uid;
+ p->p_ruid = uid;
+ p->p_svuid = uid;
+ return (0);
+}
+
+/* ARGSUSED */
+seteuid(p, uap, retval)
+ register struct proc *p;
+ struct args {