- for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++)
- if (*gp == gid)
- return (0);
- for (gp = u.u_groups; gp < &u.u_groups[NGROUPS]; gp++)
- if (*gp < 0) {
- *gp = gid;
- return (0);
- }
- return (-1);
+ newcr = crget();
+ *newcr = *cr;
+ newcr->cr_ref = 1;
+ return (newcr);
+}
+
+/*
+ * Get login name, if available.
+ */
+/* ARGSUSED */
+getlogin(p, uap, retval)
+ struct proc *p;
+ struct args {
+ char *namebuf;
+ u_int namelen;
+ } *uap;
+ int *retval;
+{
+
+ if (uap->namelen > sizeof (p->p_logname))
+ uap->namelen = sizeof (p->p_logname);
+ return (copyout((caddr_t)p->p_logname, (caddr_t)uap->namebuf,
+ uap->namelen));
+}
+
+/*
+ * Set login name.
+ */
+/* ARGSUSED */
+setlogin(p, uap, retval)
+ struct proc *p;
+ struct args {
+ char *namebuf;
+ } *uap;
+ int *retval;
+{
+ int error;
+
+ if (error = suser(u.u_cred, &u.u_acflag))
+ return (error);
+ error = copyinstr((caddr_t)uap->namebuf, (caddr_t)p->p_logname,
+ sizeof (p->p_logname) - 1, (u_int *)0);
+ if (error == ENAMETOOLONG) /* name too long */
+ error = EINVAL;
+ return (error);