int setreuid(uid_t ruid, uid_t euid);
setreuid() is used to set the real and effective user ID s of the calling process. If ruid is -1, the real user ID is not changed; if euid is -1, the effective user ID is not changed. The real and effective user ID s may be set to different values in the same call.
If the effective user ID of the calling process is super-user, the real user ID and the effective user ID can be set to any legal value.
If the effective user ID of the calling process is not super-user, either the real user ID can be set to the effective user ID , or the effective user ID can either be set to the saved set-user ID from execve(2) or the real user ID . Note: if a set-UID process sets its effective user ID to its real user ID , it can still set its effective user ID back to the saved set-user ID .
In either case, if the real user ID is being changed (that is, if ruid is not -1), or the effective user ID is being changed to a value not equal to the real user ID , the saved set-user ID is set equal to the new effective user ID .