+ register uid_t ruid, euid;
+ int error;
+
+ if (uap->ruid == -1)
+ (error = suser(u.u_cred, &u.u_acflag)))
+ return (error);
+ if (uap->euid == -1)
+ euid != p->p_svuid && (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 = euid;
+ p->p_uid = euid;
+ p->p_ruid = ruid;
+ return (0);
+}
+
+/* ARGSUSED */
+osetregid(p, uap, retval)
+ struct proc *p;
+ struct args {
+ int rgid;
+ int egid;
+ } *uap;
+ int *retval;
+{
+ register gid_t rgid, egid;
+ int error;
+
+ if (uap->rgid == -1)
+ (error = suser(u.u_cred, &u.u_acflag)))
+ return (error);
+ if (uap->egid == -1)
+ egid != p->p_svgid && (error = suser(u.u_cred, &u.u_acflag)))
+ return (error);
+ if (u.u_cred->cr_ref > 1)
+ u.u_cred = crcopy(u.u_cred);
+ p->p_rgid = rgid;
+ u.u_cred->cr_groups[0] = egid;
+ return (0);
+}
+#endif
+
+/* ARGSUSED */
+setgroups(p, uap, retval)
+ struct proc *p;
+ struct args {
+ u_int gidsetsize;