I know that the standard doesn't say anything about the signedness of uid_t
or gid_t
.
Page http://www.gnu.org/software/libc/manual/html_node/Reading-Persona.html says:
In the GNU C Library, this is an alias for unsigned int.
But man setreuid
says:
Supplying a value of -1 for either the real or effective user ID forces the system to leave that ID unchanged.
So, is uid_t
signed or unsigned in the GNU Library?
How can I supply -1
if uid_t
and gid_t
are unsigned (-1
will be converted to 0xFFFFFFFF
)?
uid_t
is (after some typedefs/defines) defined as __U32_TYPE
which is defined as unsigned int
(that is on my Gentoo Linux system).
However, just because -1
has a special meaning it does not mean that UIDs are restricted to the numbers that fit in a signed int
. It just means that the highest value (i.e. (unsigned int)-1
) is not a valid UID. The code in setreuid
probably uses the reverse form of that cast ((signed int)ruid
) to compare against -1
cleanly although it accepts an uid_t
.