2.9BSD/usr/net/src/netser/ftp/setreuid.c
setreuid()
{
struct a {
int ruid;
int euid;
} *uap;
register int ruid, euid;
uap = (struct a *)u.u_ap;
ruid = uap->ruid;
if (ruid == -1)
ruid = u.u_ruid;
if (u.u_ruid != ruid && u.u_uid != ruid && !suser())
return;
euid = uap->euid;
if (euid == -1)
euid = u.u_uid;
if (u.u_ruid != euid && u.u_uid != euid && !suser())
return;
/*
* Everything's okay, do it.
*/
u.u_procp->p_uid = ruid;
u.u_ruid = ruid;
u.u_uid = euid;
}
setregid()
{
register struct a {
int rgid;
int egid;
} *uap;
register int rgid, egid;
uap = (struct a *)u.u_ap;
rgid = uap->rgid;
if (rgid == -1)
rgid = u.u_rgid;
if (u.u_rgid != rgid && u.u_gid != rgid && !suser())
return;
egid = uap->egid;
if (egid == -1)
egid = u.u_gid;
if (u.u_rgid != egid && u.u_gid != egid && !suser())
return;
if (u.u_rgid != rgid)
u.u_rgid = rgid;
if (u.u_gid != egid)
u.u_gid = egid;
}